我有几亿行的数据库.我正在运行以下查询:
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
Run Code Online (Sandbox Code Playgroud)
当where子句在数据库中找到匹配项时,我会在几毫秒内得到结果,但如果我修改查询并r."Name"在where子句中指定不存在,则需要花费太多时间才能完成.我猜PostgreSQL正在对Payments表(包含最多行)进行顺序扫描,逐行比较每一行.
是不是postgresql足够聪明,如果Roles表包含任何行,首先检查Name 'Moses'?
角色表仅包含15行,而付款包含约3.5亿行.
我正在运行PostgreSQL 9.2.1.
顺便说一下,对同一模式/数据的相同查询在MS SQL Server上需要0.024ms才能完成.
我将在几个小时内更新问题并发布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 …Run Code Online (Sandbox Code Playgroud)