【发布时间】:2011-02-21 04:39:03
【问题描述】:
我经常在两个大型数据集上运行两种类型的查询。它们的运行速度比我预期的要慢得多。
第一种是顺序扫描更新所有记录:
Update rcra_sites Set street = regexp_replace(street,'/','','i')
rcra_sites 有 700,000 条记录。 pgAdmin 需要 22 分钟!我编写了一个 vb.net 函数,它遍历每条记录并为每条记录发送一个更新查询(是的,700,000 个更新查询!),它运行的时间不到一半。嗯……
第二种是简单的更新关系,然后是顺序扫描:
Update rcra_sites as sites
Set violations='No'
From narcra_monitoring as v
Where sites.agencyid=v.agencyid and v.found_violation_flag='N'
narcra_monitoring 有 1,700,000 条记录。这需要 8 分钟。查询规划器拒绝使用我的索引。如果我从 set enable_seqscan = false; 开始,查询会运行得更快。我希望查询规划器能完成它的工作。
我有适当的索引,我已经抽真空并分析过了。我优化了我的 shared_buffers 和 effective_cache_size,因为我有 4GB,所以我知道使用更多内存。我的硬件非常好。我在 Windows 7 上运行 v8.4。
PostgreSQL 就这么慢吗?还是我还缺少什么?
【问题讨论】:
-
我建议发布EXPLAIN的结果(也可能是EXPLAIN ANALYZE),可能会有专家注意到的细节。
-
你应该发布你的架构、索引,并确保你的表是
ANALYZEd。
标签: postgresql optimization query-optimization