2016-11-24 94 views
1

我有一個大的數據庫表(> 300'000記錄),我想根據一個參數查詢字段,而加入如下:火鳥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"); 

我不是很熟悉的執行計劃,但是我希望查詢使用索引的計劃,而不是自然的執行計劃。

我在這裏做錯了什麼,或者有沒有更好的方法來優化我的查詢?

UPDATE 我發現,使用下面的查詢:

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或空值,有時0

+0

什麼'IS_NOT_TO_LOAD爲空或IS_NOT_TO_LOAD <> 1'給?請注意,這聽起來像一個低選擇性的列,所以這可能是Firebird不喜歡使用索引的原因。 –

+0

@MarkRotteveel它是一樣的 - 它使用自然計劃... – neggenbe

回答

1

只有在WHERE子句可以使用主鍵或索引(WHERE中的字段必須存在於INDEX中)時,查詢纔可以快速。您沒有這種情況,因此Firebird必須從表中讀取所有記錄以確定哪些符合WHERE子句。 我建議從你的問題中使用索引,但首先確保你沒有IS_NOT_TO_LOAD = null(現在和未來)。