2017-02-14 61 views
0

我面臨不得不寫一些查詢,這將涉及一些相當大的表(幾百萬記錄)的表掃描。 (我知道這是一個可怕的想法,我正在推動一種不會涉及到這個問題的替代方法,但現在這是我堅持的目標。並且在相關領域創建索引可能不會是)表掃描匹配其中一個字段 - 或多個語句

對於某些表,有多個字段可能與目標值匹配。 我會想,但我只想確認一下,使用OR的單個查詢會比多個查詢更快。那就是:

SELECT keyinfo FROM TABLE1 WHERE field1 = target OR field2 = target OR field3 = target; 

會優於

SELECT whatever FROM TABLE1 WHERE field1 = target; 
SELECT whatever FROM TABLE1 WHERE field2 = target; 
SELECT whatever FROM TABLE1 WHERE field3 = target; 

直覺這似乎是正確的,因爲它只需掃描表一次。但它不得不測試多個領域,所以不知道你失去了多少收益。快速測試證明了這一點,但我不確定在背景中是否有任何臨時索引正在影響結果。

更多信息: 我認爲在大多數情況下不會找到任何匹配,但是我確實需要所有匹配(如果有的話),所以我不能僅限於獲取第一個1行。 另外,它是z/OS DB2。

鑑於我可能需要運行此多個目標 s,我可能最終將拉出所有相關領域到一個臨時表,因爲我應該能夠建立一個索引總體而言,這應該快得多。但我現在對錶格掃描問題感到好奇。

回答

1

or不一定更好。數據庫可能很難在多個字段上使用or條件的索引。 DB2可能已經足夠優化這種情況了。但是,你可以比較的性能(和執行計劃)到:

SELECT whatever FROM TABLE1 WHERE field1 = target 
UNION ALL 
SELECT whatever FROM TABLE1 WHERE field2 = target AND field1 <> target 
UNION ALL 
SELECT whatever FROM TABLE1 WHERE field3 = target AND field1 <> targe AND field2 <> target; 
0

數據庫建立基於沒有對參數的值查詢執行計劃。每次查詢運行時都會使用此查詢,而不管提供的實際值是什麼。

我認爲,你最好的選擇是查看這兩種查詢的execution planexplain plan;使用OR和使用UNION條款。