hack のためのネタ帳, etc,,,

Index Scan による sort の高速化

以下の記述によると ORDER BY するフィールドについて btree で INDEX を作っておくと高速化出来るとのこと。 ところが、EXPLAIN でいくら調べても Seq Scan 後に Sort されるばかりで Index Scan してくれない。
以下の人の報告によるとデータ件数により閾値が働くらしく、あまり大きなデータセットだと強制的に Seq Scan でプラニングされてしまうらしい。 どうにかして、Index Scan を強制出来んものかと調べていたら、以下のフォーラムに答えを発見。 以下のように設定してみろと。
set enable_seqscan = false;
ただし Index Scan は Seq Scan に比べてクソ遅いので止めとけとのこと。

実際に試してみた結果は以下の通り。

psql

結果だけ簡潔にまとめると以下のようになった。
条件データ件数所要時間
sortなし全件7144492559.071 ms
LIMIT 61470614701081.756 ms
LIMIT 614716147123536.696 ms
enable_seqscan=true71444923418.107 ms
enable_seqscan=false7144499585.890 ms
確かに、データ数 10 倍に増えても Seq Scan + Sort で誤差の範囲でしか速度が変わらないが、Index Scan だとデータ数にほぼ比例して遅くなってるという目を疑いそうな結果になってしまった。Index Scan は Seq Scan の概ね 10 倍遅いという結果のようだ。とは言え、上記の条件で全件ソートする場合、依然として Index Scan のが 2 倍ちょい速いわけで、PostgreSQL の plannner の閾値の見積りは、最適化が少々甘いと言える。いっその事 FFTW みたく実測(measure)モードとかあっても良いんじゃないのか?と思う。
何か手はあるんじゃないのかと思い、少し調べてみたところ、マニュアルの以下の部分にチューニング出来そうな雰囲気のことは書いてはあった。 しかし具体的にどこどういじれば良いのかが見つからないので、ちょっとハードルが高そうである。

関連

タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます