Microsoft SQL Server 2000 中查詢優化器使用的統計
Microsoft? SQL Server 2000 收集關於存儲在數據庫中的索引和列數據的統計信息。SQL Server 查詢優化器使用這些統計信息來選擇用於執行 INSERT、SELECT、DELETE 或 UPDATE 查詢的最有效方案。本文說明了收集的數據類型、數據的存儲位置以及用於創建、更新與刪除統計的命令。默認情況下,SQL Server 2000 會自動創建和更新統計(當此類操作有用時)。本文也概括介紹了如何在不同的級別(索引、表和數據庫)上更改這些默認值。
SQL Server 2000 中的統計數據SQL Server 2000 既收集關於單個列的統計信息(單列統計),也收集關於成組的列的統計信息(多列統計)。關於一個統計對象的所有信息存儲在 SYSINDEXES 表中一行的多個列中。計算列以及數據類型為 ntext、text 或 image 的列不能被指定為統計列。組成一個統計集的所有列的總寬度不能超過 900 字節。
SQL Server 2000 收集的統計信息上次收集統計信息的時間(在 STATBLOB 中)。
表或索引中的行數(SYSINDEXES 中的 rows 列)。
表或索引所占用的頁數(SYSINDEXES 中的 dpages 列)。
用於生成直方圖和密度信息的行數(在 STATBLOB 中,將在下面講解)。
平均鍵長(在 STATBLOB 中)。
單列直方圖,包括步數(在 STATBLOB 中)。
注意: 直方圖是給定列的最多 200 個值的集合。給定列中的所有值(如果通過抽樣來收集統計信息,則為選定的值)會被排序;排序後序列最多會劃分為 199 個間隔,以便得到最有效的統計。一般,這些間距的大小並不相等。以下數值與直方圖的每個步長存儲在一起。
表 1:直方圖的值
RANGE_HI_KEY 鍵值 EQ_ROWS 指定與 RANGE_HI_KEY 精確相等的行數。 RANGE_ROWS 指定區間中的行數。(這些行小於這個 RANGE_HI_KEY,但大於上一個較小的區間鍵值)。 DENSITY 指定 1/n,其中 n 表示區間中互不相同的值的數目。
使用 dbcc show_statistics 命令時顯示的是兩個導出值而不是 DENSITY 信息。
表 2:用兩個導出值顯示 dbcc show_statistics 的直方圖
DISTINCT_RANGE_ROWS 指定此區間中互不相同的行的數目(不算 RANGE_HI_KEY 值本身);DISTINCT_RANGE_ROWS = 1 / DENSITY。 AVG_RANGE_ROWS 區間中每個特定值的平均行數;AVG_RANGE_ROWS = DENSITY * RANGE_ROWS。
SQL Server 2000 中的直方圖只用於單個列、多列統計中的第一列或者索引。
SQL Server 2000 按照三個步驟從排序後的列值集合生成直方圖。第一步,最多收集 200 個 RANGE_HI_KEY、EQ_ROWS、RANGE_ROWS 和 DISTINC_RANGE_ROWS 的值。第二步,對每個其他的列值進行處理:該值或者被添加到上一個區間中(對值進行排序),或者創建一個新區間。如果是創建一個新區間,則兩個現有的相鄰區間會合並到一個區間中。SQL Server 2000 通過密度信息來選擇要合並的區間,使密度最接近的兩個相鄰區間被合並,從而將信息的損失降到最低程度。第三步,合並更多的密度接近的區間。因此,即使列中的唯一值個數超過 200,直方圖的步數也可能會小於 200。
如果通過抽樣來生成直方圖,那麼 RANGE_ROWS、EQ_ROWS、DISTINCT_RANGE_ROWS 和 AVG_RANGE_ROWS 的值將為估計值,因此它們不必都是整數。
密度是關於給定列或列的組合中重復項數目的信息,其計算公式為 1/(互不相同的值的數目)。如果在相等條件判斷表達式中使用了某個列,則會使用從直方圖導出的密度來估算符合條件的行數。直方圖通常用於估算不等條件判斷表達式。
注意: dbcc show_statistics 的第一行中會顯示一個單獨的密度值,但 SQL Server 2000 中的優化器不使用該值。
一個列集合的多列統計包括以下信息:統計定義中第一個列的直方圖,第一個列的密度值,以及每個列的前綴組合(單獨包括第一個列)的密度值。每個統計集(一個直方圖加上兩個或多個密度值)都存儲在 SYSINDEXES 表的一行中,同一行中還包括上次更新統計的時間戳、用於生成統計信息的抽樣行數、直方圖的步數和平均鍵數。SQL Server 2000 只為編號為 0 或 1 的索引(堆索引或群集索引)維護行數的值(rowcnt 列),並在表中的所有索引中復制該值。同樣,SQL Server 2000 也為每個表和索引維護 dpages。如果收集統計信息時表中沒有任何行,則該表的統計信息為空。
使用 sp_helpindex 和 sp_helpstats 可以顯示給定表中所有可用統計的列表,sp_helpindex 列出了表中的所有索引,而 sp_helpstats 則列出了表中的所有統計。每個索引都帶有其中列的統計信息。在相同的列中,使用 CREATE STATISTICS 命令創建的統計信息與使用 CREATE INDEX 命令生成的統計信息等價。唯一的差別在於,CREATE STATISTICS 命令默認采用抽樣方式,而 CREATE INDEX 命令則由於必須處理索引的所有行,因而使用 fullscan 收集統計信息。