私が持っている次の表のサイズでこののPostgreSQL:ひどく遅いORDERキーの順序として、主キーを持つBY
ようなモデル:今すぐ
+------------------+-------------+
| Table | Records |
+------------------+-------------+
| JOB | 8k |
| DOCUMENT | 150k |
| TRANSLATION_UNIT | 14,5m |
| TRANSLATION | 18,3m |
+------------------+-------------+
次のクエリ
select translation.id
from "TRANSLATION" translation
inner join "TRANSLATION_UNIT" unit
on translation.fk_id_translation_unit = unit.id
inner join "DOCUMENT" document
on unit.fk_id_document = document.id
where document.fk_id_job = 11698
order by translation.id asc
limit 50 offset 0
約90セコndsを終了してください。 ORDER BYとLIMIT句を削除すると、19.5秒となります。 ANALYZEは、クエリを実行する直前にすべてのテーブルで実行されていました。クエリプラン
+------------------+-------------+
| Table | Records |
+------------------+-------------+
| JOB | 1 |
| DOCUMENT | 1200 |
| TRANSLATION_UNIT | 210,000 |
| TRANSLATION | 210,000 |
+------------------+-------------+
:この特定のクエリでは、これらの基準を満たすレコードの数であり、
修正のためのクエリプランORDER BYなしLIMITはhereです。
データベースパラメータ:
PostgreSQL 9.2
shared_buffers = 2048MB
effective_cache_size = 4096MB
work_mem = 32MB
Total memory: 32GB
CPU: Intel Xeon X3470 @ 2.93 GHz, 8MB cache
誰もがこのクエリと間違っているものを見ることができますか?
UPDATE: BY ORDERない同じクエリに対してQuery plan(まだLIMIT句を使用して)。
Postgreのためのオプティマイザのしくみを教えてください。たとえば、あなたの選択から選択して、オプティマイザなしでこれを注文することができますか? – Paul
ちょうど幸運な推測。あなたはjoinのwhere節を動かすことができますか?この場合、 'where'を'と 'で置き換えてください。 – foibs
@foibs:これは何の違いもありません。 Postgresのオプティマイザは、両方のバージョンが同じであることを検出するほどスマートです。 –