索引是數據庫調優重要的一方面,索引占用大量的表空間,所以索引必須要定期來維護。就目前的數據庫而言,索引大概可以分為兩個類型,以Oracle、db2,msql為代表的行索引,而以sysbase為代表的列索引(位索引),下面就以行索引和大家做一詳細的探討。
1、索引占用大量的空間:
----------建立測試表
if object_id('ppp') is null
drop table ppp
go
create table ppp (a int , b XML)
insert into ppp
select 1,'dsfsd'
-------------查看表空間
exec sp_spaceused ppp
/*
ppp 1 16 KB 8 KB 8 KB 0 KB
*/
-------建立非聚湊索引
create index index_name on ppp(a)
-------------查看表空間
exec sp_spaceused ppp
/*
ppp 1 32 KB 8 KB 24 KB 0 KB
*/
從上邊的例子看出 索引占用大量表空間
2、建立主鍵的時候,數據庫引擎會自動建立聚湊索引,這對索引是個浪費,因為很少有人把主鍵當搜索條件。
3、索引的填充因子是索引頁面的填充率的概念,如果填充小子設置的大,就容易插入,這樣的索引頁面的數據比較松散,查詢比較困難,如果填充因子小,查詢容易,插入就困難,一般我建議用40-50就可以。但是sql 2005在新建索引的時候,索引的填充因子默認為0
4、要定期對索引進行分析,下邊以例子來說明:
---查詢索引的名字
sp_helpindex join_product_ty
---分析索引
dbcc showcontig (join_product_ty,PK_join_product_ty)
/*
DBCC SHOWCONTIG 正在掃描 'join_product_ty' 表...
表: 'join_product_ty'(1030176803);索引 ID: 1,數據庫 ID: 8
已執行 TABLE 級別的掃描。
- 掃描頁數.....................................: 1475
- 掃描擴展盤區數...............................: 188
- 擴展盤區開關數...............................: 188
- 每個擴展盤區上的平均頁數.....................: 7.8
- 掃描密度[最佳值:實際值]....................: 97.88%[185:189]
- 邏輯掃描碎片.................................: 0.07%
- 擴展盤區掃描碎片.............................: 2.13%
- 每頁上的平均可用字節數.......................: 4324.2
- 平均頁密度(完整)...........................: 46.58%
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。
*/
參數的作用,請參考msdn。
5、要定期對索引進行重建
DECLARE @database_name sysname
DECLARE @syntax sysname
DECLARE CUR_database CURSOR FOR
SELECT name FROM sysobjects where xtype = 'u'
OPEN CUR_database
FETCH NEXT FROM CUR_database INTO @database_name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @syntax = 'DBCC DBREINDEX (, '''',0)'
EXEC (@syntax)
PRINT @database_name + '重建索引完成'
FETCH NEXT FROM CUR_database INTO @database_name
END
--release memory
CLOSE CUR_database
DEALLOCATE CUR_database
GO
DBCC CHECKDB
GO