1

次のクエリを最適化することは可能ですか? webdte.doctoa は、数百万のエントリを持つ非常に大きなテーブルであり、クエリされたすべての列でインデックスを実行します。最終的な並べ替え順序は非常に重要です。

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;

申し訳ありませんが、ここで私の最初のクエリアプローチについて説明します。Egalitarian からの回答はすでに優れていますが、さらに高速になる可能性がありますか?? ありがとうございました!

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)"
4

2 に答える 2

1

次のように単純化できると思います。

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;

のためEXISTSDISTINCT必要ないはずです。に多くの重複がある場合、これによりクエリがかなり高速化されますnro_fol
元のクエリは非常に冗長でした。

于 2012-07-23T13:53:15.527 に答える
0

とにかくdistinct(nro_fol)を選択しているので、一意のid_tip_docを取得するwhere句はあまり重要ではないと思います。ただし、このクエリを最適化する最善の方法の 1 つは、適切なインデックスを使用してクエリを書き直すことです。

次のインデックスを作成できます (他のクエリにも依存しますが): 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) ) folios
join webdte.docto docs on docs.nro_fol = folios.nro_fol id_tip_doc、folios.nro_fol、id_est_doc 順;

于 2012-07-23T06:17:41.690 に答える