8

z列に基づいて3つの先行または後続を選択するテーブルRがあります。z列にbtreeインデックスがあります。

SELECT key, z, x, y FROM R
    WHERE z <= some_value
    ORDER BY z DESC 
    LIMIT 3

「すぐに」前任者を取得しますが

SELECT key, z, x, y FROM R
    WHERE z >= some_value
    ORDER BY z ASC
    LIMIT 3

は、z> = some_valueを持つすべての行のスキャンを開始するため、次のエントリを取得するのに役立ちません。Explainは、クエリがどのように満たされるかについて同じ説明を提供します。なぜこれで、私はそれについて何ができるでしょうか?

編集:実際には2つのインデックスがあり、1つは昇順、もう1つは降順です。上記の両方のクエリについて説明すると、「制限(コスト=0.00..31.91行=3幅=20)」「-> rでzreverseを使用して後方にインデックススキャン(コスト=0.00..17727815.24行=1666667幅=20)」「フィルタ:(z> = some_value ")

4

2 に答える 2

2

うーん...

WHERE 句で使用される some_value は、(誤って) VOLATILE と定義された単純な関数によって計算されます。STABLE に変更すると問題が解決しました。

于 2012-10-08T11:42:23.623 に答える
1

z のインデックスは、他に何も指定されていない「通常の」btree インデックスですか? または、「降順」で作成されましたか。

create index <name> on R(z) desc;

?

おそらく、あなたが持っているものに反対の注文インデックスを追加すると役立つかもしれません.

于 2012-10-08T11:02:25.663 に答える