Oracle
< 和 <= 之間的性能差異
我記得由於統計和/或直方圖和/或數據本身的原因,使用“<”對“<=”的 SQL 存在性能問題,但我不記得確切的問題。
我知道這是一個非常抽象的問題,但如果你能幫助解決這裡的問題
例如:
select id from table where year < 2010
反對
select id from table where year <= 2009
是的,有區別,問題是估計的選擇性(因此基數)在兩種情況下會有所不同。
舉個簡單的例子,假設 year 列的年份從 2000(low_value)到 2014(high_value),所以有 15 個不同的值(num_distinct),它們是均勻分佈的,每個 1000 行,15000 行(num_rows)總共在你的桌子上。
在第一種情況下,年份 < 2010(限制 = 2010),估計的選擇性將是:
(limit - low_value) / (high_value - low_value) = (2010 - 2000) / (2014 -2000) = 10 / 14 Cardinality = 10/14 * 15000 = 10714
對於第二種情況,年份 <= 2009(限制 = 2009),選擇性計算如下:
(limit - low_value) / (high_value - low_value) + 1/num_distinct = (2009 - 2000) / (2014 - 2000) + 1/15 = 9/14 + 1/15 Cardinality = (9/14 + 1/15) * 15000 = 10642
差別不大,但它仍然會影響優化器,使其選擇另一個計劃。
以上內容由 Jonathan Lewis 在他的《基於成本的 Oracle 基礎知識》一書中詳細解釋。