程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 重建索引提高SQLServer性能

重建索引提高SQLServer性能

編輯:關於SqlServer
大多數SQL Server表需要索引來提高數據的訪問速度,如果沒有索引,SQL Server要進行表格掃描讀取表中的每一個記錄才能找到索要的數據。索引可以分為簇索引和非簇索引,簇索引通過重排表中的數據來提高數據的訪問速度,而非簇索引則通過維護表中的數據指針來提高數據的索引。
  
  索引的體系結構:
  
  為什麼要不斷的維護表的索引?首先,簡單介紹一下索引的體系結構。SQL Server在硬盤中用8KB頁面在數據庫文件內存放數據。缺省情況下這些頁面及其包含的數據是無組織的。為了使混亂變為有序,就要生成索引。生成索引後,就有了索引頁和數據頁,數據頁保存用戶寫入的數據信息。索引頁存放用於檢索列的數據值清單(關鍵字)和索引表中該值所在紀錄的地址指針。索引分為簇索引和非簇索引,簇索引實質上是將表中的數據排序,就好像是字典的索引目錄。非簇索引不對數據排序,它只保存了數據的指針地址。向一個帶簇索引的表中插入數據,當數據頁達到100%時,由於頁面沒有空間插入新的的紀錄,這時就會發生分頁,SQL Server 將大約一半的數據從滿頁中移到空頁中,從而生成兩個半的滿頁。這樣就有大量的數據空間。簇索引是雙向鏈表,在每一頁的頭部保存了前一頁、後一頁地址以及分頁後數據移動的地址,由於新頁可能在數據庫文件中的任何地方,因此頁面的鏈接不一定指向磁盤的下一個物理頁,鏈接可能指向了另一個區域,這就形成了分塊,從而減慢了系統的速度。對於帶簇索引和非簇索引的表來說,非簇索引的關鍵字是指向簇索引的,而不是指向數據頁的本身。
  
  為了克服數據分塊帶來的負面影響,需要重構表的索引,這是非常費時的,因此只能在需要時進行。可以通過DBCC SHOWCONTIG來確定是否需要重構表的索引。下面舉例來說明DBCC SHOWCONTIG和DBCC REDBINDEX的使用方法。以SQL Server自帶的northwind數據作為例子
  
  帶開SQL Server的Query analyzer輸入命令:
  
  use pubs
  
  declare @table_id int
  
  set @table_id=object_id('tbldlvinfoback')
  
  dbcc showcontig(@table_id)
  
  這個命令顯示pubs數據庫中的tbldlvinfoback表的分塊情況,結果如下:
  
  DBCC SHOWCONTIG 正在掃描 'tblDlvInfoback' 表...
  表: 'tblDlvInfoback'(1797581442);索引 ID: 0,數據庫 ID: 5
  已執行 TABLE 級別的掃描。
  - 掃描頁數.....................................: 197214
  - 掃描擴展盤區數...............................: 24659
  - 擴展盤區開關數...............................: 24658
  - 每個擴展盤區上的平均頁數.....................: 8.0
  - 掃描密度[最佳值:實際值]....................: 99.97%[24652:24659]
  - 擴展盤區掃描碎片.............................: 15.46%
  - 每頁上的平均可用字節數.......................: 374.6
  - 平均頁密度(完整)...........................: 95.37%
  DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。
  
  通過分析這些結果可以知道該表的索引是否需要重構。表1.1描述了每一行的意義描述
  
  Pages Scanned          表或索引中的長頁數
  
  Extents Scanned         表或索引中的長區頁數
  
  Extent Switches         DBCC遍歷頁時從一個區域到另
  
  一個區域的次數
  
  Avg. Pages per Extent            相關區域中的頁數
  
  Scan Density                  Best Count是連續鏈接時的理想區
  
  [Best Count:Actual Count]        域改變數,Actual Count是實際區
  
  域改變數,Scan Density為100%
  
  表示沒有分塊。


  
  Logical Scan Fragmentation      掃描索引頁中失序頁的百分比
  
  Extent Scan Fragmentation        不實際相鄰和包含鏈路中所有鏈
  
  接頁的區域數
  
  Avg. Bytes Free per Page         掃描頁面中平均自由字節數
  
  Avg. Page Density (full)           平均頁密度,表示頁有多滿
  
  從上面命令的執行結果可以看的出來,Best count為3 而Actual Count為5這表明orders表有分塊需要重構表索引。下面通過DBCC DBREINDEX來重構表的簇索引。
  
  同樣在Query Analyzer中輸入命令:
  
  use northwind
  
  dbcc dbreindex('northwind.dbo.orders',pk_orders,90)
  
  執行結果:
  
  DBCC execution completed. If DBCC printed error messages, contact your system administrator.
  
  Dbcc dbreindex參數說明:第一個參數為要重構的表明。第二個參數為需要重構的索引表識,‘’表示所有的索引。第三個參數為頁的填充因子,填充因子越大,頁越滿。
  
  然後再用DBCC SHOWCONTIG查看重構簇索引後的結果:
  
  use northwind
  
  declare @table_id int
  
  set @table_id=object_id('orders')
  
  dbcc showcontig(@table_id)
  
  返回結果如下:
  
  DBCC SHOWCONTIG scanning 'Orders' table...
  
  Table: 'Orders' (21575115); index ID: 1, database ID: 6
  
  TABLE level scan performed.
  
  - Pages Scanned................................: 22
  
  - Extents Scanned..............................: 3
  
  - Extent Switches..............................: 2
  
  - Avg. Pages per Extent........................: 7.3
  
  - Scan Density [Best Count:Actual Count].......: 100.00% [3:3]
  
  - Logical Scan Fragmentation ..................: 0.00%
  
  - Extent Scan Fragmentation ...................: 33.33%
  
  - Avg. Bytes Free per Page.....................: 869.2
  
  - Avg. Page Density (full).....................:


您正在看的SQLserver教程是:重建索引提高SQLServer性能。89.26%
  
  DBCC execution completed. If DBCC printed error messages, contact your system administrator.
  
  通過結果我們可以看到Scan Denity為100%表沒有分塊不需要重構表索引了。如果重構表的簇索引Scan Denity還小於100%的話可以重構表的全部索引。命令如下:
  
  --use northwind
  
  --dbcc dbreindex('northwind.dbo.orders',’’,90)
  
  使用作業定時重構索引:
  
  如果你的數據庫訪問非常頻繁的話,非常容易出現數據分塊的現象,因此你可以利用作業來幫你在系統相對空閒的時候重構你的索引。
  
  為什麼要不斷的維護表的索引?首先,簡單介紹一下索引的體系結構。SQL Server在硬盤中用8KB頁面在數據庫文件內存放數據。缺省情況下這些頁面及其包含的數據是無組織的。

為了使混亂變為有序,就要生成索引。生成索引後,就有了索引頁和數據頁,數據頁保存用戶寫入的數據信息。索引頁存放用於檢索列的數據值清單(關鍵字)和索引表中該值所在紀錄的地址指針。索引分為簇索引和非簇索引,簇索引實質上是將表中的數據排序,就好像是字典的索引目錄。非簇索引不對數據排序,它只保存了數據的指針地址。向一個帶簇索引的表中插入數據,當數據頁達到100%時,由於頁面沒有空間插入新的的紀錄,這時就會發生分頁,SQL Server 將大約一半的數據從滿頁中移到空頁中,從而生成兩個半的滿頁。這樣就有大量的數據空間。簇索引是雙向鏈表,在每一頁的頭部保存了前一頁、後一頁地址以及分頁後數據移動的地址,由於新頁可能在數據庫文件中的任何地方,因此頁面的鏈接不一定指向磁盤的下一個物理頁,鏈接可能指向了另一個區域,這就形成了分塊,從而減慢了系統的速度。對於帶簇索引和非簇索引的表來說,非簇索引的關鍵字是指向簇索引的,而不是指向數據頁的本身。
  
  為了克服數據分塊帶來的負面影響,需要重構表的索引,這是非常費時的,因此只能在需要時進行。可以通過DBCC SHOWCONTIG來確定是否需要重構表的索引。下面舉例來說明DBCC SHOWCONTIG和DBCC REDBINDEX的使用方法。以SQL Server自帶的northwind數據作為例子
  
  帶開SQL Server的Query analyzer輸入命令:
  
  use pubs
  
  declare @table_id int
  
  set @table_id=object_id('tbldlvinfoback')
  
  dbcc showcontig(@table_id)
  
  這個命令顯示pubs數據庫中的tbldlvinfoback表的分塊情況,結果如下:
  
  DBCC SHOWCONTIG 正在掃描 'tblDlvInfoback' 表...
  表: 'tblDlvInfoback'(1797581442);索引 ID: 0,數據庫 ID: 5
  已執行 TABLE 級別的掃描。
  - 掃描頁數.....................................: 197214
  - 掃描擴展盤區數...............................: 24659
  - 擴展盤區開關數...............................: 24658
  - 每個擴展盤區上的平均頁數.....................: 8.0
  - 掃描密度[最佳值:實際值]....................: 99.97%[24652:24659]
  - 擴展盤區掃描碎片.............................: 15.46%
  - 每頁上的平均可用字節數.......................: 374.6
  - 平均頁密度(完整)...........................: 95.37

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