2

私のテーブルには整数列「a」、「b」があります。"a" の異なる値はわずか (<30) ですが、各 "a" には膨大な数の異なる "b" が存在します (>10**7)。スピードアップするために、複合インデックス (a,b) を作成しました。私はそれを観察します

select count(*) from tab where a=1; 

速く走る

select count(*) from tab where a=2;

速く走るが、

select count(*) from tab where a=1 or a=2;

実行が (なんてこった) 遅く、同じことが次の場合にも当てはまります

select count(*) from tab;

説明を実行すると、高速クエリが使用することが説明されます

->  Index Only Scan using idx on tab

ただし、遅いクエリの場合は、シーケンシャル スキャンが使用されます。

これはなぜですか?Postgresql が後の 2 つのクエリに同じインデックスを使用しないのはなぜですか? クエリ プランナーの不完全性だけですか、それともインデックス オンリー スキャンを使用できないより深刻な理由がありますか?

4

1 に答える 1

1

a=1 のような条件の場合、各行の条件を再確認する必要がないためです。そのため、b ツリーをトラバースし、a=1 を持つすべての葉をカウントします。この場合、実際のデータを引き出す必要はありません。a=1 と a=2 の 2 つのクエリのユニオンを試してみるか、a<=2 のような条件が機能するかもしれません。

于 2015-08-04T09:55:57.367 に答える