讓我們考慮這些查詢:
select * from person where com_code in (1, 2, 3, 4)
select * from person where com_code in (1, 2, 2, 2)
select * from person where com_code in (1, 2, 3)
select * from person where com_code in (0,1,2,3,4,5,6,7,8,9,10,11,12,13)
它們是否在 Oracle 的記憶體中存盤了不同的執行計劃?換句話說,IN 引數的數量是否會改變執行計劃?會有1個引數的執行計劃,2個引數的另一個執行計劃,等等?
uj5u.com熱心網友回復:
會有1個引數的執行計劃,2個引數的另一個執行計劃,等等?
SQL 引擎將檢查查詢文本并查看它是否與現有查詢相同:
- 如果相同,則將使用現有計劃。
- 如果有任何差異,那么它將決議新查詢并生成新計劃。
對于您的示例,無論引數數量如何,每個查詢都有一個執行計劃,因為每個查詢的查詢文本都不同。因此,對于 4 個不同的查詢,將有 4 個不同的執行計劃。
如果使用系結引數:
select * from person where com_code in (:a, :b, :c, :d);
并且你傳入1, 2,3或者4你傳入2,然后SQL 引擎會看到第二個查詢的文本和第一個相同2,并且假設表的統計資訊沒有改變,將重用從第二個的第一個查詢(即使系結變數不同)。22
如果您改變系結引數的數量,則會生成不同的執行計劃以匹配過濾器的數量。
如果您不使用系結引數,那么 SQL 引擎將不得不在每次更改時決議查詢文本,并且可能不會生成相同的查詢計劃。
例如:
select * from person where com_code in (2, 2, 2, 2);
將由 SQL 引擎重寫為:
select * from person where com_code = 2;
并且會生成一個不同的解釋計劃來:
select * from person where com_code in (1, 2, 3, 4);
db<>fiddle

兩個值:

三個值:

因此,回答您的問題:“IN 引數的數量是否會改變查詢的執行計劃?” 是的。
這也有幫助:Oracle 處理很長的 IN 運算子串列的效率如何
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478826.html
上一篇:Oracle顯示編號
