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