2017-06-22 19 views
0

今日、私は奇妙な問題に直面しました。私は多くの列(col1..col100)を持つpostgres(テーブルT)に大きなテーブルを持っていて、インデックスI1(col2、col3、col4)を持っています。Postgtresクエリでインデックスに登録されているカラムにインデックスを使用していません

explain select col2,col3 from T; 

は、インデックスを使用していない、テーブルの配列のスキャンを示しています。インデックスにある列を選択しているので、インデックスのみのようにすべきだと思います。

何故その理由が考えられますか?

答えて

0

SELECTは(同様の構成の設定とデータのストレージに依存しています。それは難しい数ではありません)約5〜10%より多くを返す場合、すべての行の表に、シーケンシャルスキャンをインデックススキャンよりもはるかに高速です。

索引スキャンでは、各行に対して複数のIO操作が必要です(索引の行を検索し、ヒープから行を検索します)。ディスク上のブロック(ページ)に複数の行が含まれているため、シーケンシャルスキャンでは各行に1つのIOしか必要ないため、1回のIO操作で複数の行をフェッチできます。

これは、他のDBMSのために真である - 「インデックスのみスキャンし、」わき取りなど、いくつかの最適化(しかし、SELECTのための*それは非常に低いです、そのようなDBMSは、のために行くだろう「インデックスのみスキャン」)

関連する問題