索引的使用說明

2022-01-30 10:05:33 字數 2321 閱讀 2540

索引的使用說明

題外話:

昨天比較鬱悶,維護一客戶的資料庫系統時候,發現系統處理資料就出現假死。

開始因為是軟體問題,拷得亂忙一下午還沒有拷定,後來一直弄到晚上7點,突然想起索引問題。

後來就使用了一命令:

dbcc

dbreindex(

'tablename',

'',80)

為什麼要建立合適的索引,重要的目的就是提高查詢效率。

這裡簡單說一下索引的兩種型別:

幫助的說明

聚集

聚集索引基於資料行的鍵值在表內排序和儲存這些資料行。由於資料行按基於聚集索引鍵的排序次序儲存,因此聚集索引對查詢行很有效。每個表只能有乙個聚集索引,因為資料行本身只能按乙個順序儲存。資料行本身構成聚集索引的最低級別。

只有當表包含聚集索引時,表內的資料行才按排序次序儲存。如果表沒有聚集索引,則其資料行按堆集方式儲存。

非聚集

非聚集索引具有完全獨立於資料行的結構。非聚集索引的最低行包含非聚集索引的鍵值,並且每個鍵值項都有指標指向包含該鍵值的資料行。資料行不按基於非聚集鍵的次序儲存。

在非聚集索引內,從索引行指向資料行的指標稱為行定位器。行定位器的結構取決於資料頁的儲存方式是堆集還是聚集。對於堆集,行定位器是指向行的指標。對於有聚集索引的表,行定位器是聚集索引鍵。

來的例子說明最能體現建立索引的好處。

--測試表dtest (無索引)

select

identity

(int,1

,1) as[id

],b.[id

]astkey,b.

[name]as

[tname

]into

dtest 

from

master..syscolumns 

asa ,master..sysobjects asb

--測試表ttest (建立索引)

select

identity

(int,1

,1) as[id

],b.[id

]astkey,b.

[name]as

[tname

]into

ttest 

from

master..syscolumns 

asa ,master..sysobjects asb

在我的測試中,dtest,ttest表有500多萬條記錄,可以滿足測試要求。

操作如圖:

1、設定表ttest的字段id為主鍵。

2、對錶ttest中的列tname建立乙個非聚集索引。

3、測試查詢語句的效率。

在查詢分析器中輸入:

select

*from

dtest 

where

tname='

sp_activedirectory_obj

'按鍵盤ctrl+l,顯示預計的執行計畫,可以檢視執行效率。

預計的成本是31.8.

再在查詢分析器中輸入:

select

*from

ttest 

where

tname='

sp_activedirectory_obj

'按鍵盤ctrl+l,顯示預計的執行計畫,可以檢視執行效率。

預計的成本是28.5 .

從這圖可以看出,使用索引後,查詢效率差不多提高了10的百分點。

下面我們再看實際查詢的結果用時:

沒有索引時候,用時:26秒。

對列tname加索引,用時:0秒。

呵呵,明顯看出效率的提高。

這裡寫幾點注意:

1、將更新盡可能多的行的查詢寫入單個語句內,而不要使用多個查詢更新相同的行。僅使用乙個語句,就可以利用優化的索引維護。

2、對聚集索引使用整型鍵。另外,在唯一列、非空列或 identity 列上建立聚集索引可以獲得效能收益

3、在查詢經常用到的所有列上建立非聚集索引。這可以最大程度地利用隱蔽查詢

4、重建索引可以重新組織索引資料(對於聚集索引還包括表資料)的儲存,清除碎片。如我開始提到的使用

dbcc

dbreindex(

'tablename',

'',80)

來重構索引。

在實際的應用中,會發現很多問題,得具體問題具體分析,這裡只是簡單乙個例子說明使用索引的好處。

(完)

搜尋引擎使用說明

搜尋引擎使用說明 在檢索輸入框中輸入關鍵字,然後按下enter鍵 或者單擊search按鈕 即可得到相關資料。如果僅需要檢索中文網頁,請選擇 搜尋所有中文網頁 輸入英文關鍵字的時候不區分英文本母大小寫。如果要避免搜尋某個詞語,可以在這個詞前面加上乙個減號 半形字元 但在減號之前必須留乙個空格。比如,...

使用說明 附註工具使用說明

附註工具使用說明 附註工具用途 附註工具主要用於更新利用word附註應用程式生成的帶域 的附註,該工具在word右鍵 更新鏈結 的基礎上進行了優化,故在使用時,不能再利用word右鍵 更新鏈結 而要用本工具的 更新當前鏈結 或 更新所有鏈結 使用說明 一 更換路徑 當利用word附註應用程式生成帶域...

this的使用說明

student類中 private string name public void setname string name main函式中 student stu1 newstudent stu1.setname 小冪冪 此時main函式中stu1儲存了student類的記憶體位址,當stu1呼叫s...