SQL SERVER 2008索引維護實作篇

查看索引資訊

我們可以透過指令與親和力的圖形使用者介面進行查看。

(1) 透過 sp_helpindex 儲存程序

clip_image001

(2) 透過 SQL SERVER Management Studio 進行檢索索引資訊

透過物件總管工具,展開目標資料庫->資料表,將會看到索引鍵資料夾

clip_image003clip_image004

建立索引

透過 Create Index 語法來建立索引

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON <object> ( column [ ASC | DESC ] [ ,...n ] )

A. 建立簡單的非叢集索引

 1: USE AdventureWorks;
 2:
 3: GO
 4:
 5: IF EXISTS (SELECT name FROM sys.indexes
 6:
 7: WHERE name = N'IX_ProductVendor_VendorID')
 8:
 9: DROP INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor;
 10:
 11: GO
 12:
 13: CREATE INDEX IX_ProductVendor_VendorID
 14:
 15: ON Purchasing.ProductVendor (VendorID);
 16:
 17: GO

B. 建立簡單的非叢集複合索引

 1: USE AdventureWorks
 2:
 3: GO
 4:
 5: IF EXISTS (SELECT name FROM sys.indexes
 6:
 7: WHERE name = N'IX_SalesPerson_SalesQuota_SalesYTD')
 8:
 9: DROP INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson ;
 10:
 11: GO
 12:
 13: CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD
 14:
 15: ON Sales.SalesPerson (SalesQuota, SalesYTD);
 16:
 17: GO

C. 建立唯一的非叢集索引

 1: USE AdventureWorks;
 2:
 3: GO
 4:
 5: IF EXISTS (SELECT name from sys.indexes
 6:
 7: WHERE name = N'AK_UnitMeasure_Name')
 8:
 9: DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure;
 10:
 11: GO
 12:
 13: CREATE UNIQUE INDEX AK_UnitMeasure_Name
 14:
 15: ON Production.UnitMeasure(Name);
 16:
 17: GO

D.建立唯一的叢集所引

 1: USE AdventureWorks;
 2:
 3: GO
 4:
 5: IF EXISTS (SELECT name from sys.indexes
 6:
 7: WHERE name = N'PK_UnitMeasure_ID')
 8:
 9: DROP INDEX PK_UnitMeasure_ID ON Production.UnitMeasure;
 10:
 11: GO
 12:
 13: CREATE UNIQUE CLUSTERED INDEX PK_UnitMeasure_ID
 14:
 15: ON Production.UnitMeasure(ID);
 16:
 17: GO

修改索引

語法:

ALTER INDEX { index_name | ALL } ON <object>

{ REBUILD | DISABLE | REORGANIZE}

A. 重建索引

在 Employee 資料表上,重建單一索引。

 1: USE AdventureWorks;
 2:
 3: GO
 4:
 5: ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee
 6:
 7: REBUILD;

GO

B. 在資料表上重新組織索引

 1: USE AdventureWorks;
 2:
 3: GO
 4:
 5: ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto
 6:
 7: REORGANIZE ;

GO

C. 停用索引

 1: USE AdventureWorks;
 2:
 3: GO
 4:
 5: ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee
 6:
 7: DISABLE ;
 8:
 9: GO

刪除索引

語法:

DROP INDEX ON 資料表名.索引名 | 檢視表名.索引名

CODE:

 1: DROP INDEX [CustomerID] ON [dbo].[Orders] WITH ( ONLINE = OFF )

 

使用系統內建的系統資料表查看索引資訊

clip_image006

詳細欄位意義請查詢MSDN官方定義
http://technet.microsoft.com/zh-tw/library/ms190283(SQL.90).aspx

維護索引的統計資訊

索引的統計資訊,可以協助SQL SERVER 的查詢引擎利用這些資訊來確定最佳的查詢計畫,進而提高查詢的效率。

 

(1) 透過SQL SERVER Management Studio工具進行查看索引統計資訊

依序選擇目標資料庫->資料表->統計資料,如圖示

clip_image008

在要進行查看的索引統計資訊,雙擊滑鼠兩下,將可以看到更詳細的資訊

clip_image010

(2) 透過命令語法

使用系統檢視表sys.stats進行查看

clip_image012

欄位定義請查詢MSDN完整的定義
http://technet.microsoft.com/zh-tw/library/ms177623.aspx

使用DBCC SHOW_STATISTICS 命令

DBCC SHOW_STATISTICS 會針對資料表或索引檢視表顯示目前的查詢最佳化統計資料。

語法

 1: DBCC SHOW_STATISTICS ( table_or_indexed_view_name , target )
 2:
 3: [ WITH [ NO_INFOMSGS ] < option > [ , n ] ]
 4:
 5: < option > :: =
 6:
 7: STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM

clip_image014

更完整的欄位資訊,請參閱線上MSDN

http://technet.microsoft.com/zh-tw/library/ms174384.aspx

使用系統預存程序 sp_autostats 來查看資料庫中指定的資料表或索引檢視之所有索引和統計資料的自動 UPDATE STATISTICS 設定

clip_image015

(TIP) 在SQL SERVER 2008,資料庫選項的AUTO_CREATE_STATISTICS是最作用於控制是否自動建立索引統計資訊,預設值為ON,因此如果執行了SELECT 、INSERT、UPDATE和DELETE語法中使用到索引指定的欄位,則資料庫會自動為該欄位建立對應的統計資訊,以加速執行查詢計畫。

手動建立索引統計資訊

透過Create Statistics 語法建立

 1: CREATE STATISTICS statistics_name
 2: ON { table | view } ( column [ ,...n ] )
 3: [ WHERE <filter_predicate> ]
 4: [ WITH
 5: [ [ FULLSCAN
 6: | SAMPLE number { PERCENT | ROWS }
 7: | STATS_STREAM = stats_stream ] [ , ] ]
 8: [ NORECOMPUTE ]
 9: ] ;

例如,以下為Contact資料表的ContactID, EmailAddress兩個欄位建立統計資訊

 1: CREATE STATISTICS ContactMail1
 2:
 3: ON Person.Contact (ContactID, EmailAddress)

使用sp_createstats 預存程序

改程序主要是針對目前資料庫中的所有使用者資料表和內部資料表,建立所有適用資料列的單一資料行統計資料。

語法

sp_createstats [ [ @indexonly = ] ‘indexonly’ ]

[ , [ @fullscan = ] ‘fullscan’ ]

[ , [ @norecompute = ] ‘norecompute’ ]

引數

[ @indexonly = ] ‘indexonly’

指定只應考慮建立參與索引之資料行的統計資料。indexonly 是 char(9)。預設值是 NO。

[ @fullscan = ] ‘fullscan’

指定搭配 CREATE STATISTICS 來使用 FULLSCAN 選項。如果省略 fullscan,SQL Server Database Engine 會執行預設範例掃描。fullscan 是 char(9)。預設值是 NO。

[ @norecompute = ] ‘norecompute’

指定針對新建的統計資料來停用統計資料的自動重新計算。norecompute 是 char(12)。預設值是 NO。

範例是針對目前資料庫中的所有使用者資料表,建立所有適用資料列的統計資料。

 1: EXEC sp_createstats;

 

 

 

修改統計資訊

語法

 1: UPDATE STATISTICS table | view
 2: [
 3: {
 4: { index | statistics_name }
 5: | ( { index |statistics_name } [ ,...n ] )
 6: }
 7: ]
 8: [ WITH
 9: [
 10: [ FULLSCAN ]
 11: | SAMPLE number { PERCENT | ROWS } ]
 12: | RESAMPLE
 13: ]

此語法結構跟前面講的Create Statistics語法相似,在此直接與取之MSDN範例說明。

A. 更新單一資料表的所有統計資料

 1: UPDATE STATISTICS Sales.SalesOrderDetail;

 

B. 只更新單一索引的統計資料

 1: UPDATE STATISTICS Sales.SalesOrderDetail AK_SalesOrderDetail_rowguid;

 

C. 利用 50% 取樣來更新特定統計資料群組 (集合) 的統計資料

 1: CREATE STATISTICS Products
 2:
 3: ON Production.Product ([Name], ProductNumber)
 4:
 5: WITH SAMPLE 50 PERCENT
 6:
 7: -- Time passes. The UPDATE STATISTICS statement is then executed.
 8:
 9: UPDATE STATISTICS Production.Product(Products)
 10:
 11: WITH SAMPLE 50 PERCENT;

D. 利用 FULLSCAN 和 NORECOMPUTE 來更新特定統計資料群組 (集合) 的統計資料

 1: UPDATE STATISTICS Production.Product(Products)
 2:
 3: WITH FULLSCAN, NORECOMPUTE;

刪除統計資訊

有了前面的基礎,新增、修改統計資訊的觀念後,最後當然也有刪除的語法,刪除很簡單,只要透過簡單的語法 DROP STATISTICS 資料表.索引名,就可以進行刪除。

 

後續有時間會繼續寫索引如何優化資料庫的觀念………By Allen

Database Tuning

資料庫Tuning,大致上可分為以下議題:

1. Configuring the System

2. Tuning the Server

3. Tuning SQL

4. Tuning the Client

5. Tuning the Network

clip_image002

目前我針對 SQL SERVER 來探討,也作為此文章的開始,當我們的資料庫應用程式遇到執行效能的瓶頸時,資料庫開發人員或許先想到的就是索引問題,是否應該在資料庫多新增索引,進而來提高查詢的速度,因此就索引為題先來介紹索引類別。

何謂索引?

資料庫索引事實上和書上的索引意義是相同的,有了索引的整理,就可以快速搜尋到想要的資訊內容(透過索引得知頁碼),而不需要從整本書上的第一頁翻到最後一頁,來逐頁查看所需資訊。而資料庫索引是存放資料表中所包含的值,彙整出的列表,此表紀錄了各個值的列所存在的位置,我們可以為資料庫設定單欄(Field)索引,也可以多欄索引。

SQL SERVER 的索引有兩大類型:

叢集索引:此類型索引,資料表各列的次序與索引鍵值的次序是相符的。

該類型索引在一個表格中只能有一個。

(優點)對Update 和 Delete 的執行效能能明顯提升,因為此兩個command,通常需要先執行讀取大量數據。

(缺點)建立叢集索引與變更需要花費較大的時間成本。

非叢集索引:此類型索引具有獨立於資料列的資料結構。非叢集索引包含一個非叢集索引鍵值,此鍵值項都有指向包含該鍵值的資料列的指標。

此兩種索引類型,都可以是唯一的索引值,也就是在資料表中具有唯一性。

索引注意事項:

索引不是建多就代表效能好,通常只有在針對經常需要查詢或過濾的欄位時,才會建立該索引。建立索引相對會造成硬碟空間的負擔,也會造成新增(INSERT)、刪除(DELETE)、更新(Update)的命令的執行速度。所以應該是使用情境的狀況去調整才是最佳措施。