如果这个问题应该发布在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应用程序中,这对于单个查询来说是不可接受的。
我按照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。
on
。应该像这样:create index jobs_account_id_sop_id on jobs(account_id, service_of_process_id);
- nzifnab