Oracle

< 和 <= 之間的性能差異

  • March 3, 2014

我記得由於統計和/或直方圖和/或數據本身的原因,使用“<”對“<=”的 SQL 存在性能問題,但我不記得確切的問題。

我知道這是一個非常抽象的問題,但如果你能幫助解決這裡的問題

例如:

select id
from table
where year &lt; 2010

反對

select id
from table
where year &lt;= 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 基礎知識》一書中詳細解釋。

引用自:https://dba.stackexchange.com/questions/60036