SQLServer定量性能分析

引言

描述揭示執行計劃成本規則所必要的工具和測試腳本。查詢成本和性能要達到我們的預期對錶和索引有一些高水平的理解也是必要的。一些主題在其他地方有詳細介紹,所以這裏只做簡短的討論。SQLServer工具包括查詢分析器和事件探查器。SET選項包括SET STATISTICS IOSET SHOWPLAN_ALL。爲揭示查詢執行計劃成本結構特別創建測試表。爲測試表生成數據的腳本。 

表組織和索引結構

SQLServer裏的表和索引以一系列8K的頁的形式存儲。表和索引結構的詳細介紹在SQLServer的幫助文檔裏已給出。表組織和索引結構這兩方面跟性能有重大的關聯,做一下簡短的介紹。表要麼作爲堆要麼作爲聚集索引來組織。表要麼有聚集索引要麼沒有(視圖索引稍後討論)。沒有聚集索引的表稱爲堆。堆裏的行不是按順序存放的。圖1-1顯示了堆表的組織結構。

1-1堆表的組織結構

在有聚集索引的表裏,行是基於鍵值順序存放的。聚集索引的根和任何中間層有索引值。葉級有整個數據行,除在某些環境下的textimage數據庫類型外。圖1-2顯示了有聚集索引的表的組織結構。

1-2聚集索引表結構

非聚集索引裏的信息依賴於表是堆表還是聚集索引表。對於堆表來說,非聚集索引有一個指向行的指針包括文件、頁和行位置。圖1-3顯示了堆上的非聚集索引。注意根和頁節點屬於非聚集索引。索引中間層沒有顯示。數據頁屬於堆表。

1-3建在堆表上的非聚集索引

對於聚集索引表來說,非聚集索引包含了聚集索引鍵。跟隨非聚集索引搜索的書籤查找操作的性能依賴於表的組織形式。如果是堆表,書籤查找真正是一個查找操作。如果是聚集索引表,書籤查找是在聚集索引上附加的索引搜索操作。 

工具

執行計劃成本信息可以通過幾個方式獲得。在查詢分析器裏要麼用顯示估計的執行計劃要麼用顯示執行計劃功能可以圖形化的顯示執行計劃。每一個組件操作的成本都作爲整個查詢成本的一個百分比顯示,如下圖1-4。當有不止一個查詢的時候,每個查詢的成本也作爲批裏所有查詢的總成本的一個百分比顯示。

1-4兩個查詢的顯示估計執行計劃輸出結果

當鼠標指針放在一個特定的組件上的時候,在出現的細節窗口裏就會用數字形式顯示各個組件操作的成本。每個組件操作的成本依賴於涉及的行數或頁數。顯示估計執行計劃提供了在沒有實際執行查詢下生成執行計劃的功能。如果使用了主鍵或其他的唯一索引,就能決定每個操作的行數或頁數,或者從使用搜索參數(SARG)的表的列上由SQLServer自動產生和維護的統計信息裏估計出來。如果用顯示執行計劃功能執行查詢,那麼就可以知道每個操作的精確的行數和頁數。對於基於實際的行數和頁數的查詢來說,成本值原封不動的反映了成本規則。 1-5顯示了在選擇顯示估計執行計劃時的成本細節。估計行計數正好是主鍵上使用搜索參數的結果。

1-5顯示估計執行計劃下索引搜索的成本細節

1-6顯示了在顯示執行計劃下的成本細節。行數、執行數和成本都不再是估計的了。


1-6顯示執行計劃下的索引搜索的成本細節

執行計劃細節也可以通過下面任何一個SET選項產生:SHOWPLAN_ALLSHOWPLAN_TEXTSET STATISTICS PROFILE和其他一些資源包括事件探查器。來自SET SHOWPLAN_ALL選項的成本信息更加精確且精確度高於四捨五入後僅有一些重要數字的圖形化顯示的值,圖1-7顯示了SET SHOWPLAN_ALL輸出的一個示例。


1-7 SHOWPLAN_ALL的輸出結果

每個組件操作都有I/O成本和CPU成本。僅當number of executes1的組件操作的總成本爲I/O成本與CPU成本的總和。當number of executes大於1時,成本不是簡單的I/O成本與CPU成本的和再乘以number of executes。因爲子樹成本包括所有操作的成本都計算進該特定組件操作裏了。

沒有文檔記載SQLServer執行計劃成本的度量單位。衆所周知對於SQLServer7.02000平臺成本值是相同的,包括標準版和企業版和所有的SP。索引搜索和書籤查找操作的I/O成本依賴於系統是否有1G或大於1G的內存。CPU成本再所有的平臺測試都是相同的。描述I/O成本隨處理器數量而變化的這篇文檔的早期版本,現在看來是不正確的。

其他兩個有用的工具是SET STATISTICS IO選項和事件探查器。STATISTICS IO記錄其他信息的掃描計數和邏輯讀。事件探查器能記錄讀和寫。STATISTICS IO邏輯讀和事件探查器讀一起意味着從數據緩存裏讀取的頁數。邏輯讀也稱爲邏輯I/O。一個頁在一個給定的查詢裏可以被多次訪問。有趣的一點是事件探查器沒必要爲INSERTUPDATEDELETE語句顯示寫I/O 

測試表

爲了檢查執行計劃成本結構,建立如下的兩個測試表。沒有指定列的含義,ID列可以被定義爲聚集索引或非聚集索引的主鍵。在表掃描測試裏,沒有定義主鍵。僅僅指定固定長度的數據類型且不允許爲NULL。第一個表設計成每頁能存相當多的行(填充因子爲90%時大約320行),但是少於可能的行最大量。第二個表每頁存接近100行,在填充因子爲99%時實際能存99行。

CREATETABLE N1x (
ID intNOT NULL,
Value char(10) NOT NULL
)

CREATETABLE M2x (
ID intNOT NULL,
ID2 intNOT NULL,
ID3 intNOT NULL,
ID4 intNOT NULL,
ID5 intNOT NULL,
ID6 intNOT NULL,
GroupID intNOT NULL,
CodeID intNOT NULL,
Value char(10) NOT NULL,
randDecimal decimal(9,4) NOT NULL,
randMoney moneyNOT NULL,
randDate datetimeNOT NULL,
seqDate datetimeNOT NULL )

不同類型的索引組合產生特定的執行計劃。爲給定查詢產生幾個不同的執行計劃便於比較,有必要使用查詢提示。後綴顯示了主鍵索引類型,如,N1C表示在ID列上有聚集索引主鍵,N1N表示在ID列上有非聚集索引主鍵且表沒有聚集索引。N1H表示沒有索引。每個表都有一些列以便這些列上任何有用的搜索參數都能返回相同的行數,實際的行數儘可能的匹配估計行數。 

數據生成腳本

填充每一個表裏的數據以便觀察執行計劃裏的行數或頁數。下面是一個腳本:

DECLARE @I int, @rowCnt int
SELECT @I = 1, @rowCnt = 50000
WHILE @I <= @RowCnt
BEGIN
INSERT M2C_01 (ID, ID2, ID3, ID4, ID5, ID6, GroupID, CodeID,
        Value, randDecimal, randMoney, randDate, seqDate)  VALUES (@I, …)
SET @I = @I+1
END

下面是一些得到數據特定分佈的規則:

1. (@I-1)/10 + 1
2. (@I-1)%(@rowCnt/10) + 1
3. 1 + (@I-1)*100/@rowCnt + ((@I-1)*100)%@rowCnt
4. (@I-1)%(320) + 1

規則1通過對@I每隔10個增加1產生一個序列。這用於GroupID列,使得一個連續的數字有相同的GroupID值。

規則2通過儘可能的分開列值來產生一個序列。對於50000行中的一行,第一行的值爲1,第5001行的值也爲1,如此下去。這用於CodeID列。 在一些環境下,ID2列的值和ID列一樣。一個指定對ID2列的查詢,結果同ID列上的查詢一樣。這是爲了揭示執行計劃成本的不同依賴於通過主鍵或唯一索引產生的唯一條件。

規則3產生一個序列如1101……499012102等等。每個連續值增加100,直到50000。這個用於ID3列,爲了連接其他表裏不同頁面上的每個連續行(每頁有99行)。

規則4通過用模320簡單產生一個序列。 其他規則用來產生特定的數據分佈。 

綜述

這篇介紹性的文章包括:產生測試表的基本技術,揭示執行計劃成本規則的工具和邏輯IO計數,影響一些基本操作的表、索引的結構細節。下一步就是爲通常的查詢操作實際的檢查執行成本結構。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章