|
大多數(shù)SQL Server表需要索引來提高數(shù)據(jù)的訪問速度,如果沒有索引,SQL Server 要全表進行掃描讀取表中的每一個記錄才能找到所要的數(shù)據(jù)。索引可以分為簇索引和非簇索引:簇索引通過重排表中的數(shù)據(jù)來提高數(shù)據(jù)的訪問速度;而非簇索引則通過維護表中的數(shù)據(jù)指針來提高數(shù)據(jù)的訪問速度。 1. 索引的體系結(jié)構(gòu) SQL Server 2005在硬盤中用8KB頁面在數(shù)據(jù)庫文件內(nèi)存放數(shù)據(jù)。缺省情況下這些頁面及其包含的數(shù)據(jù)是無組織的。為了使混亂變?yōu)橛行?,就要生成索引。生成索引后,就有了索引頁和?shù)據(jù)頁之分:數(shù)據(jù)頁用來保存用戶寫入的數(shù)據(jù)信息;索引頁存放用于檢索列的數(shù)據(jù)值清單(關鍵字)和索引表中該值所在紀錄的地址指針。索引分為簇索引和非簇索引,簇索引實質(zhì)上是將表中的數(shù)據(jù)排序,就好像是字典的索引目錄。非簇索引不對數(shù)據(jù)排序,它只保存了數(shù)據(jù)的地址。向一個帶簇索引的表中插入數(shù)據(jù),當數(shù)據(jù)頁達到100%時,由于頁面沒有空間插入新的的紀錄,這時就會發(fā)生分頁,SQL Server 將大約一半的數(shù)據(jù)從滿頁中移到空頁中,從而生成兩個1/2滿頁。這樣就有大量的空的數(shù)據(jù)空間。簇索引是雙向鏈表,在每一頁的頭部保存了前一頁、后一頁以及分頁后數(shù)據(jù)移出的地址。由于新頁可能在數(shù)據(jù)庫文件中的任何地方,因此頁面的鏈接不一定指向磁盤的下一個物理頁。鏈接可能指向了另一個區(qū)域,這就形成了分塊,從而減慢了系統(tǒng)的速度。對于帶簇索引和非簇索引的表來說,非簇索引的關鍵字是指向簇索引的,而不是指向數(shù)據(jù)頁的本身。 為了克服數(shù)據(jù)分塊帶來的負面影響,需要重構(gòu)表的索引,這是非常費時的,因此只能在需要時進行??梢酝ㄟ^DBCC SHOWCONTIG來確定是否需要重構(gòu)表的索引。 2. DBCC SHOWCONTIG用法 下面舉例來說明DBCC SHOWCONTIG和DBCC REDBINDEX的使用方法。以應用程序中的Employee數(shù)據(jù)表作為例子,在 SQL Server的Query analyzer輸入命令:use database_name declare @table_id int set @table_id=object_id('Employee') dbcc showcontig(@table_id)
復制代碼輸出結(jié)果:DBCC SHOWCONTIG scanning 'Employee' table... Table: 'Employee' (1195151303); index ID: 1, database ID: 53 TABLE level scan performed. - Pages Scanned................................: 179 - Extents Scanned..............................: 24 - Extent Switches..............................: 24 - Avg. Pages per Extent........................: 7.5 - Scan Density [Best Count:Actual Count].......: 92.00% [23:25] - Logical Scan Fragmentation ..................: 0.56% - Extent Scan Fragmentation ...................: 12.50% - Avg. Bytes Free per Page.....................: 552.3 - Avg. Page Density (full).....................: 93.18% DBCC execution completed. 復制代碼If DBCC printed error messages, contact your system administrator. 通過分析這些結(jié)果可以知道該表的索引是否需要重構(gòu)。如下描述了每一行的意義: 信息 描述Pages Scanned 表或索引中的長頁數(shù)Extents Scanned 表或索引中的長區(qū)頁數(shù)Extent Switches DBCC遍歷頁時從一個區(qū)域到另一個區(qū)域的次數(shù)Avg. Pages per Extent 相關區(qū)域中的頁數(shù)Scan Density[Best Count:Actual Count]Best Count是連續(xù)鏈接時的理想?yún)^(qū)域改變數(shù),Actual Count是實際區(qū)域改變,Scan Density為100%表示沒有分塊。Logical Scan Fragmentation 掃描索引頁中失序頁的百分比Extent Scan Fragmentation 不實際相鄰和包含鏈路中所有鏈接頁的區(qū)域數(shù)Avg. Bytes Free per Page 掃描頁面中平均自由字節(jié)數(shù)Avg. Page Density (full) 平均頁密度,表示頁有多滿 從上面命令的執(zhí)行結(jié)果可以看的出來,Best count為23 而Actual Count為25。這表明orders表有分塊,需要重構(gòu)表索引。下面通過DBCC DBREINDEX來重構(gòu)表的簇索引。 3. DBCC DBREINDEX 用法 重建指定數(shù)據(jù)庫中表的一個或多個索引。DBCC DBREINDEX ( [ 'database.owner.table_name' [ , index_name [ , fillfactor ] ] ] )
復制代碼參數(shù) 'database.owner.table_name' 是要重建其指定的索引的表名。數(shù)據(jù)庫、所有者和表名必須符合標識符的規(guī)則。有關更多信息,請參見使用標識符。如果提供 database 或 owner 部分,則必須使用單引號 (') 將整個 database.owner.table_name 括起來。如果只指定table_name,則不需要單引號。 index_name 是要重建的索引名。索引名必須符合標識符的規(guī)則。如果未指定 index_name 或指定為 ' ',就要對表的所有索引進行重建。 fillfactor 是創(chuàng)建索引時每個索引頁上要用于存儲數(shù)據(jù)的空間百分比。fillfactor 替換起始填充因子以作為索引或任何其它重建的非聚集索引(因為已重建聚集索引)的新默認值。如果 fillfactor 為 0,DBCC DBREINDEX 在創(chuàng)建索引時將使用指定的起始fillfactor。 同樣在Query Analyzer中輸入命令: dbcc dbreindex('database_name.dbo.Employee','',90) 然后再用DBCC SHOWCONTIG查看重構(gòu)索引后的結(jié)果:DBCC SHOWCONTIG scanning 'Employee' table... Table: 'Employee' (1195151303); index ID: 1, database ID: 53 TABLE level scan performed. - Pages Scanned................................: 178 - Extents Scanned..............................: 23 - Extent Switches..............................: 22 - Avg. Pages per Extent........................: 7.7 - Scan Density [Best Count:Actual Count].......: 100.00% [23:23] - Logical Scan Fragmentation ..................: 0.00% - Extent Scan Fragmentation ...................: 0.00% - Avg. Bytes Free per Page.....................: 509.5 - Avg. Page Density (full).....................: 93.70% DBCC execution completed. If DBCC printed error messages, contact your system administrator. 復制代碼通過結(jié)果我們可以看到Scan Denity為100%。 原文出自【比特網(wǎng)】,轉(zhuǎn)載請保留原文鏈接:http://bbs./thread-366635-1-1.html |
|
|
來自: Jason(徐子) > 《Sql server》