我有几亿行的数据库。我正在运行以下查询:
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 子句在数据库中找到匹配项时,我会在几毫秒内得到结果,但如果我修改查询并r."Name"
在 where 子句中指定一个不存在的,则需要花费太多时间才能完成。我猜 PostgreSQL 正在对Payments
表(包含最多行)进行顺序扫描,逐行比较每一行。
postgresql 不够聪明,无法首先检查Roles
表是否包含任何行Name
'Moses'
吗?
Roles 表仅包含 15 行,而 Payments 包含约 3.5 亿行。
我正在运行 PostgreSQL 9.2.1。
顺便说一句,在 MS SQL Server 上完成对相同架构/数据的相同查询需要 0.024 毫秒。
我将在几个小时内更新问题并发布 EXPLAIN ANALYZE 数据。
Here'e解释分析结果: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 错误邮件列表。