sqlserver 索引


什么是索引

拿漢語字典的目錄頁(索引)打比方正如漢語字典中的漢字按頁存放一樣,SQL Server中的數據記錄也是按頁存放的,每頁容量一般為4K 。為了加快查找的速度,漢語字(詞)典一般都有按拼音、筆畫、偏旁部首等排序的目錄(索引),我們可以選擇按拼音或筆畫查找方式,快速查找到需要的字(詞)。

同理,SQL Server允許用戶在表中創建索引,指定按某列預先排序,從而大大提高查詢速度。

          SQL Server中的數據也是按頁( 4KB )存放

          索引:是SQL Server編排數據的內部方法。它為SQL Server提供一種方法來編排查詢數據 

          索引頁:數據庫中存儲索引的數據頁;索引頁類似於漢語字(詞)典中按拼音或筆畫排序的目錄頁。

          索引的作用:通過使用索引,可以大大提高數據庫的檢索速度,改善數據庫性能。

 

索引類型

          唯一索引:唯一索引不允許兩行具有相同的索引值

          主鍵索引:為表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的,並且不能為空

          聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個表只能有一個

          非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數據存儲在一個位置,索引存儲在另一個位置,索引中包含指向數據存儲位置的指針。可以有多個,小於249

 

索引類型:再次用漢語字典打比方,希望大家能夠明白聚集索引和非聚集索引這兩個概念。

 

唯一索引:

唯一索引不允許兩行具有相同的索引值。

如果現有數據中存在重復的鍵值,則大多數數據庫都不允許將新創建的唯一索引與表一起保存。當新數據將使表中的鍵值重復時,數據庫也拒絕接受此數據。例如,如果在stuInfo表中的學員員身份證號(stuID) 列上創建了唯一索引,則所有學員的身份證號不能重復。

提示:創建了唯一約束,將自動創建唯一索引。盡管唯一索引有助於找到信息,但為了獲得最佳性能,建議使用主鍵約束或唯一約束。

 

主鍵索引:

在數據庫關系圖中為表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的。當在查詢中使用主鍵索引時,它還允許快速訪問數據。

 

聚集索引(clustered index

在聚集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。表只能包含一個聚集索引。例如:漢語字(詞)典默認按拼音排序編排字典中的每頁頁碼。拼音字母abcd……xyz就是索引的邏輯順序,而頁碼123……就是物理順序。默認按拼音排序的字典,其索引順序和邏輯順序是一致的。即拼音順序較后的字(詞)對應的頁碼也較大。如拼音“ha”對應的字()頁碼就比拼音“ba” 對應的字()頁碼靠后。

 

非聚集索引(Non-clustered)

如果不是聚集索引,表中各行的物理順序與鍵值的邏輯順序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的數據訪問速度。例如,按筆畫排序的索引就是非聚集索引,“1”畫的字(詞)對應的頁碼可能比“3”畫的字(詞)對應的頁碼大(靠后)。

提示:SQL Server中,一個表只能創建1個聚集索引,多個非聚集索引。設置某列為主鍵,該列就默認為聚集索引


什么情況下設置索引 

動作描述

使用聚集索引 

 使用非聚集索引

 外鍵列

 應

 應

 主鍵列

 應

 應

 列經常被分組排序(order by)

 應

 應

 返回某范圍內的數據

 應

 不應

 小數目的不同值

 應

 不應

 大數目的不同值

 不應

 應

 頻繁更新的列

不應 

 應

 頻繁修改索引列

 不應

 應

 一個或極少不同值

 不應

 不應

 

建立索引的原則:

1) 定義主鍵的數據列一定要建立索引。 (一般為非聚集索引)

2) 定義有外鍵的數據列一定要建立索引。 (一般為非聚集索引)

3) 對於經常查詢的數據列最好建立索引。 (一般為非聚集索引)

4) 對於需要在指定范圍內的快速或頻繁查詢的數據列; (一般為非聚集索引)

5) 經常用在WHERE子句中的數據列。 (一般為非聚集索引)

6) 經常出現在關鍵字order by、group by、distinct后面的字段,建立索引。如果建立的是復合索引,索引的字段順序要和這些關鍵字后面的字段順序一致,否則索引不會被使用。 (一般為非聚集索引)

7) 對於那些查詢中很少涉及的列,重復值比較多的列不要建立索引。 (一般為非聚集索引)

8) 對於定義為textimagebit的數據類型的列不要建立索引。 (一般為非聚集索引)

9) 對於經常存取的列避免建立索引  (一般為非聚集索引)

9) 限制表上的索引數目。對一個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。索引雖說提高了訪問速度,但太多索引會影響數據的更新操作。

10) 對復合索引,按照字段在查詢條件中出現的頻度建立索引。在復合索引中,記錄首先按照第一個字段排序。對於在第一個字段上取值相同的記錄,系統再按照第二個字段的取值排序,以此類推。因此只有復合索引的第一個字段出現在查詢條件中,該索引才可能被使用,因此將應用頻度高的字段,放置在復合索引的前面,會使系統最大可能地使用此索引,發揮索引的作用。

 

  1.4 如何創建索引

  1.41 創建索引的語法:

CREATE [UNIQUE][CLUSTERED | NONCLUSTERED]  INDEX  index_name  

ON {table_name | view_name} [WITH [index_property [,....n]]

說明:

UNIQUE: 建立唯一索引。

CLUSTERED: 建立聚集索引。

NONCLUSTERED: 建立非聚集索引。

Index_property: 索引屬性。

 UNIQUE索引既可以采用聚集索引結構,也可以采用非聚集索引的結構,如果不指明采用的索引結構,則SQL Server系統默認為采用非聚集索引結構。

1.42 刪除索引語法:

DROP INDEX table_name.index_name[,table_name.index_name]

說明:table_name: 索引所在的表名稱。

index_name : 要刪除的索引名稱。

1.43 顯示索引信息:

使用系統存儲過程:sp_helpindex 查看指定表的索引信息。

執行代碼如下:

Exec sp_helpindex book1;

 

  1.5 索引使用次數、索引效率、占用CPU檢測、索引缺失

  當我們明白了什么是索引,什么時間創建索引以后,我們就會想,我們創建的索引到底效率執行的怎么樣?好不好?我們創建的對不對?

  首先我們來認識一下DMV,DMV (dynamic management view)動態管理視圖和函數返回特定於實現的內部狀態數據。推出SQL Server 2005時,微軟介紹了許多被稱為dmvs的系統視圖,讓您可以探測SQL Server 的健康狀況,診斷問題,或查看SQL Server實例的運行信息。統計數據是在SQL Server運行的時候開始收集的,並且在SQL Server每次啟動的時候,統計數據將會被重置。當你刪除或者重新創建其組件時,某些dmv的統計數據也可以被重置,例如存儲過程和表,而其它的dmv信息在運行dbcc命令時也可以被重置。

  當你使用一個dmv時,你需要緊記SQL Server收集這些信息有多長時間了,以確定這些從dmv返回的數據到底有多少可用性。如果SQL Server只運行了很短的一段時間,你可能不想去使用一些dmv統計數據,因為他們並不是一個能夠代表SQL Server實例可能遇到的真實工作負載的樣本。另一方面,SQL Server只能維持一定量的信息,有些信息在進行SQL Server性能管理活動的時候可能丟失,所以如果SQL Server已經運行了相當長的一段時間,一些統計數據就有可能已被覆蓋。

  因此,任何時候你使用dmv,當你查看從SQL Server 2005dmvs返回的相關資料時,請務必將以上的觀點裝在腦海中。只有當你確信從dmvs獲得的信息是准確和完整的,你才能變更數據庫或者應用程序代碼。

下面就看一下dmv到底能帶給我們那些好的功能呢?




 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM