ascとdescの両方向にインデックスを作成する


8

過去数週間、私は古いFirebirdデータベースに対して激怒しています。このデータベースはさまざまな理由でひどいですが、私が気付いたことの1つは、すべてのテーブルすべてのフィールドに2つのインデックスがあることです。それぞれに単一のセグメントがあり、1つはasc順番に、もう1つはdesc順番に。

同じインデックスセグメントを持つ2つのインデックスを有することに単一セグメントのインデックスのいずれかの利点があるが、1で-以外のすべてのテーブル内のすべてのフィールドのインデックスを持つのwtf'nessから、それは考えて私を得たdescと1でasc?何か得られることはありますか、または最新のDBMSは単純にascインデックスを使用し、最後から始めて、必要に応じて逆方向に動作しますか?

回答:



5

Firebirdインデックスは理論的には双方向ですが、ページの書き込み順序が原因で逆方向が信頼できないため、エンジンは実際には双方向性を使用しません。逆方向の読み取りでは、新しく追加されたページではなく、古いインデックスページをまだ指しているリンクを読み取って、インデックスエントリをスキップすることがあります。これは、Firebird for Database Expert:Episode 3-On Disk Consistencyで説明されています。

したがって、インデックスの双方向性は保証されないため、Firebirdは宣言された方向(昇順または降順)のインデックスのみを読み取ります。データベースにこれらすべてのインデックスがある理由については、データベースを設計している人が何をしているのかわからなかったか、またはこれらのインデックスを追加すると列のソートが速くなると思いました。


4

はい、降順のインデックスを使用しない場合、大きなテーブルで顕著なパフォーマンスヒット(FB 2.5)があります。

select first 1 * 
from mytable 
where pk_id >= 200000 
order by pk_id desc

このクエリは、主キーフィールド "pk_id"(整数)の値に基づいて、前のレコードを見つけるために使用されます。


postgresには間違いなくこの問題があります
PirateApp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.