【发布时间】:2012-11-04 15:28:58
【问题描述】:
我有几亿行的数据库。我正在运行以下查询:
select * from "Payments" as p
inner join "PaymentOrders" as po
on po."Id" = p."PaymentOrderId"
inner join "Users" as u
On u."Id" = po."UserId"
INNER JOIN "Roles" as r
on u."RoleId" = r."Id"
Where r."Name" = 'Moses'
LIMIT 1000
当 where 子句在数据库中找到匹配项时,我会在几毫秒内得到结果,但如果我修改查询并在 where 子句中指定不存在的 r."Name",则需要花费太多时间才能完成。我猜 PostgreSQL 正在对Payments 表(包含最多行)进行顺序扫描,逐一比较每一行。
postgresql 还不够聪明,无法先检查Roles 表是否包含Name 'Moses' 的任何行吗?
Roles 表仅包含 15 行,而 Payments 表包含约 3.5 亿行。
我正在运行 PostgreSQL 9.2.1。
顺便说一句,对相同架构/数据的相同查询在 MS SQL Server 上完成需要 0.024 毫秒。
我会在几个小时内更新问题并发布 EXPLAIN ANALYZE 数据。
这里解释一下分析结果:http://explain.depesz.com/s/7e7
这是服务器配置:
version PostgreSQL 9.2.1, compiled by Visual C++ build 1600, 64-bit
client_encoding UNICODE
effective_cache_size 4500MB
fsync on
lc_collate English_United States.1252
lc_ctype English_United States.1252
listen_addresses *
log_destination stderr
log_line_prefix %t
logging_collector on
max_connections 100
max_stack_depth 2MB
port 5432
search_path dbo, "$user", public
server_encoding UTF8
shared_buffers 1500MB
TimeZone Asia/Tbilisi
wal_buffers 16MB
work_mem 10MB
我在 i5 cpu(4 核,3.3 GHz)、8 GB RAM 和 Crucial m4 SSD 128GB 上运行 postgresql
更新 这看起来像查询计划器中的错误。在 Erwin Brandstetter 的推荐下,我将其报告给了Postgresql bugs mailing list。
【问题讨论】:
-
现在,请将普通的
EXPLAIN发布到explain.depesz.com 并在您的帖子中链接到它。它会立即运行。感谢您提供您的 PostgreSQL 版本和有用的详细信息。另一件要尝试的事情:ANALYZE表格,看看性能是否有所提高。也许你的统计数据完全出来了?您也可以在explain analyze中看到这一点,这是行数估计完全错误的最常见原因。请在更新时添加评论,因为 SO 不会发送有关问题编辑的通知。 -
@CraigRinger 非常感谢您的帮助。我已经分析了数据库中的所有表并只执行了解释查询。结果如下:explain.depesz.com/s/hol。但是,解释分析仍在运行,我会在它完成后立即发布结果。再次感谢。
-
@CraigRinger 对不起,克雷格,我不明白你的意思。我不是以英语为母语的人:)。无论如何,这里解释一下分析结果:explain.depesz.com/s/7e7 知道如何解决这个慢查询吗?再次非常感谢你:)
-
没关系。我要的是
EXPLAIN ANALYZE(或至少EXPLAIN)用于快速查询。您已经展示了问题查询计划是什么。这将有助于查看 PostgreSQL 在名称确实存在时选择什么,以及快速产生结果的查询计划。 -
我很想看看在
Roles.RoleId上添加UNIQUE约束(因此UNIQUE索引)是否有任何效果,如果这与您的数据模型兼容。还请从wiki.postgresql.org/wiki/Server_Configuration 显示您的配置并阅读wiki.postgresql.org/wiki/Slow_Query_Questions。我对您的join_collapse_limit特别感兴趣,尽管它应该默认足够高,对这个查询没有影响。
标签: performance postgresql postgresql-performance