これはFirebird 2.5用です。複数列のFirebird SQLインデックス
インデックスが2列、たとえばColAとColBのテーブルTがあります。私がしている場合: SELECT * FROM T WHERE ColA=...
、WHERE句はA列にしかないので、FirebirdはColB列にデフォルト値を設定してインデックスを優先しますか、このインデックスを使用することはできませんか?
文脈のビット: 私はdbのアップグレードをしています。ここに私が持っているものがあります:
CREATE TABLE user(
newid BIGINT NOT NULL,
oldid BIGINT NOT NULL,
anotherCol INT);
CREATE INDEX idx ON user(oldid, anotherCol);
CREATE TABLE order(
RefUser BIGINT);
order.RefUserは古いです、私はそれらをnewidに変更する必要があります。 、したがって、インデックス、およびNEWIDの作成をこの時点で
UPDATE order o SET o.refuser = (SELECT u.newid FROM user u WHERE u.oldId = o.refuser);
、oldidまだユニークであるが、後に単一性にのみ(oldid、anotherCol)のためguarantedすることになります。私はそれがこのクエリを使用してください。
ユーザーテーブルは数百万のレコードであり、注文テーブルは数千万にものぼります。このクエリには1時間以上かかります。私はそれを改善する方法を見たいと思っています(その時間量のために重要なサービスをシャットダウンすることに熱心ではありません)。
この順序で列AとBに索引がある場合、WHEREにAまたはAとBを同時に含む条件が含まれる場合、FBはこの索引を使用しますが、WHERE句にB列のみが存在する場合は索引を使用しません。 –
@Andrej:はいインデックスはA、Bにあり、AのみがWHERE句にあります。だから、あなたはFirebirdがインデックスを使用すると言っているからです...その側からの最適化はありません...ありがとうこの正確な答え! – SoyonsPrecis
@SoyonsPrecisあなたはクエリを準備し、実行プランを読むことができます。そのインデックスが使用されるかどうかは、テーブル内の特定の日付(別名インデックスSELECTIVITY)に従ってFirebirdによって決定されます。しかし、一般的な規則では、複合インデックスは最初の列AまたはA&BまたはA&B&Cなどのサブセットで使用される可能性があります。 –