【发布时间】:2014-03-26 15:22:18
【问题描述】:
让我知道是否应该将其发布在 DBA.stackexchange.com 上...
我有以下疑问:
SELECT DISTINCT "court_cases".*
FROM "court_cases"
LEFT OUTER JOIN service_of_processes
ON service_of_processes.court_case_id = court_cases.id
LEFT OUTER JOIN jobs
ON jobs.service_of_process_id = service_of_processes.id
WHERE
(jobs.account_id = 250093
OR court_cases.account_id = 250093)
ORDER BY
court_cases.court_date DESC NULLS LAST,
court_cases.id DESC
LIMIT 30
OFFSET 0;
但运行需要 2-4 秒,而且在 Web 应用程序中,这对于单个查询来说是不可接受的。
我按照on the PostgreSQL wiki 的建议在查询上运行EXPLAIN (ANALYZE, BUFFERS),并将结果放在这里:http://explain.depesz.com/s/Yn6
查询中涉及的那些表的表定义在这里(包括外键关系的索引):
http://sqlfiddle.com/#!15/114c6
是否因为WHERE 子句从两个不同的表中查询而导致使用索引出现问题?我可以对查询进行什么样的索引或更改以使其运行得更快?
这些是相关表格的当前大小:
PSQL=# select count(*) from service_of_processes;
count
--------
103787
(1 row)
PSQL=# select count(*) from jobs;
count
--------
108995
(1 row)
PSQL=# select count(*) from court_cases;
count
-------
84410
(1 row)
编辑:如果这很重要,我正在使用 Postgresql 9.3.1。
【问题讨论】:
标签: sql postgresql indexing query-optimization outer-join