有可能优化下面的查询吗?webdte.docto a是一个非常大的表,有数百万个条目,并对所有查询的列运行索引。最后的排序顺序非常重要。
SELECT
id_doc,
id_tip_doc,
id_est_doc,
folios.nro_fol,
seleccionable
FROM
(
SELECT distinct(nro_fol)
FROM webdte.docto
WHERE
id_tip_doc IN
(
SELECT distinct(id_tip_doc)
FROM webdte.docto
WHERE id_doc IN
(
SELECT id_doc
FROM webdte.lib_doc
WHERE id_lib = 37
)
) AND
id_doc IN
(
SELECT id_doc
FROM webdte.lib_doc
WHERE id_lib = 37
)
) AS folios JOIN webdte.docto AS docs ON docs.nro_fol = folios.nro_fol
ORDER BY id_tip_doc, folios.nro_fol, id_est_doc;对不起,这里是我的第一个查询方法的解释。平等主义的答案已经很好了,但也许它还能更快??谢谢!
Sort (cost=13745.13..13805.42 rows=24115 width=22)"
Sort Key: docs.id_tip_doc, docto.nro_fol, docs.id_est_doc"
-> Hash Join (cost=9240.19..11492.84 rows=24115 width=22)"
Hash Cond: (docto.nro_fol = docs.nro_fol)"
-> HashAggregate (cost=4424.81..4665.91 rows=24110 width=6)"
-> Hash Semi Join (cost=733.75..4364.54 rows=24110 width=6)"
Hash Cond: (docto.id_doc = lib_doc.id_doc)"
-> Seq Scan on docto (cost=0.00..2885.28 rows=105128 width=10)"
-> Hash (cost=432.38..432.38 rows=24110 width=4)"
-> Seq Scan on lib_doc (cost=0.00..432.38 rows=24110 width=4)"
Filter: (id_lib = 37)"
-> Hash (cost=2885.28..2885.28 rows=105128 width=22)"
-> Seq Scan on docto docs (cost=0.00..2885.28 rows=105128 width=22)"发布于 2012-07-23 21:53:16
我认为你可以简化为:
SELECT id_doc
,id_tip_doc
,id_est_doc
,nro_fol
,seleccionable
FROM webdte.docto d
WHERE EXISTS (
SELECT 1
FROM webdte.docto d0
JOIN webdte.lib_doc l USING (id_doc)
WHERE l.id_lib = 37
AND d0.nro_fol = d.nro_fol
)
ORDER BY id_tip_doc, nro_fol, id_est_doc;因为有了EXISTS,应该不需要DISTINCT了。如果nro_fol上有许多重复项,这可以大大加快查询速度。
您的原始查询是非常多余的。
发布于 2012-07-23 14:17:42
我认为获取唯一id_tip_doc的where子句没有多大意义,因为您无论如何都要选择distinct(nro_fol)。不过,优化此查询的最佳方法之一是使用适当的索引,然后重写查询。
您可以创建以下索引(尽管它也取决于您的其他查询):1. webdte.lib_doc : id_lib 2. webdte.docto : id_doc + nro_fol
select id_doc,id_tip_doc,id_est_doc, folios.nro_fol ,seleccionable from (select distinct(nro_fol) from webdte.docto where id_doc in (select id_doc from webdte.lib_doc where id_lib = 37) )对开页
join webdte.docto docs on docs.nro_fol = folios.nro_fol order by id_tip_doc,folios.nro_fol,id_est_doc;
https://stackoverflow.com/questions/11607059
复制相似问题