2

所以問題是,在存儲過程中處理傳入NULL查詢參數時是否有避免完全掃描的可能性?假設我有4個參數,用戶從一種形式發送,並試圖尋找精確匹配表中,像這樣:帶有NULL查詢參數的Oracle FTS執行計劃(pl/sql)

SELECT * 
FROM table1 t1 
WHERE ((:qParam1 is null) OR (t1.col1 = :qParam1)) AND 
((:qParam2 is null) OR (t1.col2 = :qParam2)) AND 
((:qParam3 is null) OR (t1.col3 = :qParam3)) AND 
((:qParam4 is null) OR (t1.col4 = :qParam4)); 

所以,當這部分程序執行,因爲NULL檢查的,它將執行FTS,因爲程序已經編譯並且執行計劃已經確定。爲了始終使用考慮傳入查詢參數的最有效計劃(並且輸入參數數量增加時多得多),需要在程序中寫入2^4個不同的查詢。我的問題是 - 有沒有什麼辦法,除了動態SQL,以避免在這些類型的查詢FTS?

+0

't1.col = nvl(:qParam1,t1.col)'通常工作正常。 Oracle使用「FILTER」操作來構建兩個單獨的子計劃,一個使用FTS,另一個使用索引,並在運行時選擇適當的計劃。我將其標記爲[此問題](http://stackoverflow.com/q/3649036/409172)的副本,但接受的答案是錯誤的。 –

回答

0

也許不是。 Oracle不會將空值存儲在索引中,因此在謂詞中有可能爲空時,它不會使用索引。如果你的列是空的,那麼不。話雖如此,無論如何這是最好的計劃 - 您的查詢非常模糊(確定 - 靈活),無論如何建立一個有用的計劃都很難。甲骨文非常聰明,靈活的計劃,但這裏並沒有太多的東西可以繼續下去。

如果你有空列和索引你可能能的情況下,與

t1.col1 = :qParam2 and t1.col1 is not null 

到bodge它它不是足夠聰明,工作是出於對自身。