DB優化小常識 - 執行計劃中Cardinality的計算

tolywang發表於2012-07-18

DB中如果我們使用CBO作為優化器,一條SQl語句就會有多種執行路徑,那麼CBO會計算各個執行路徑的訪問代價,選擇代價最小的作為我們的執行計劃。CBO在做訪問路徑估算的時候有一個很重要的引數作為我們計算Cost的因數,這個就是我們通常所說的掃描欄位的集的勢(Cardinality) 。

一般公式如下:

Cardinality=MAX(Cardinality Factor * Rowcount,1)

1) . 索引欄位: 對於這個欄位的查詢條件是"="的情況下,我們的Cardinality Factor的計算公式就如下:
Cardinality Factor = 1 / 欄位上的唯一值的數量

2). 索引欄位的查詢條件是"" "<=" ">=" 那麼我們計算Cardinality Factor的公式就為
Cardinality Factor = (1 / 欄位上的唯一值的數量) + (1 / 記錄數)

3). 索引欄位的查詢條件是in,那麼我們的公式就為:
Cardinality Factor = in條件中的變數數 / 欄位上的唯一值的數量

4). 索引欄位的查詢條件是"<>",那麼我們的公式就為:
Cardinality Factor = ( 1 - (1 / 欄位上的唯一值的數量 ) )

5). 查詢條件為not in的時候,Cardinality的結果是根據not in中變數作為階乘得出的公式為:
Cardinality Factor = ( 1 - (1 / 欄位上的唯一值的數量 ) ) ^ (not in 變數數)

非索引欄位
1). 當查詢條件為"="或者是"in"的時候,非索引欄位的Cardinality Factor的計算公式為:
Cardinality Factor = 1 / 100

2). 當查詢條件為"","<=",">=","<>","not in",非索引欄位的Cardinality Factor的計算公式為:
Cardinality Factor = 1 / 20

3). 非索引多欄位
公式: Cardinality Factor = 欄位1的Cardinality Factor * 欄位2的Cardinality Factor * ... * 欄位n的Cardinality Factor

4). 全表掃描
Cardinality Factor=1;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-743631/,如需轉載,請註明出處,否則將追究法律責任。

相關文章