程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> Microsoft SQL Server 2000 中查詢優化器使用的統計

Microsoft SQL Server 2000 中查詢優化器使用的統計

編輯:關於SqlServer

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 收集統計信息。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved