2016-11-24 8 views
1

私は大規模なDBのテーブルを持っている(> 300'000記録)と私はせずに、1つのパラメータに応じてフィールドを照会するには、加入:FirebirdのSQLクエリの最適化

SELECT F1, F2, ..., IS_NOT_TO_LOAD FROM MY_TABLE WHERE IS_NOT_TO_LOAD IS DISTINCT FROM 1; 

私はテーブルの上にインデックスを作成しましたwrt IS_NOT_TO_LOADフィールド:

CREATE ASC INDEX "IND_MY_TABLE_IS_NOT_TO_LOAD" ON "MY_TABLE" ("IS_NOT_TO_LOAD"); 

私は実行計画に精通していないが、私は、クエリが自然な実行計画ではなく、インデックス・プランを使用することを期待したいです。

私はここで何か間違っているのですか、または私のクエリを最適化するためのよりよいアプローチがありますか?

SELECT F1, F2, ..., IS_NOT_TO_LOAD FROM MY_TABLE WHERE IS_NOT_TO_LOAD < 1; 

計画PLAN (A INDEX (IND_MY_TABLE_IS_NOT_TO_LOAD))を使用していますが、私は時々、時々0またはNULL値、0

+0

IS_NOT_TO_LOADはnullかIS_NOT_TO_LOAD <> 1'は何を与えますか?これは選択性の低い列のように聞こえるので、Firebirdが索引を使用しないことが望ましい理由になる可能性があります。 –

+0

@MarkRotteveelそれは同じです - それは自然な計画を使用しています... – neggenbe

答えて

1

を持っているので、私はこれを使用していない:

UPDATE は、私は次のクエリを使用することがわかりましたWHERE句が主キーまたは索引を使用できる場合(WHEREのフィールドはINDEXに存在していなければなりません)にのみ、問合せを高速化できます。その場合はありません。そのため、FirebirdはWHERE句を満たしているかどうかを判断するためにテーブルからすべてのレコードを読み取る必要があります。 質問からインデックスを使用することをお勧めしますが、まずIS_NOT_TO_LOAD = null(現在および将来)がないことを確認してください。