什么是索引
拿漢語字典的目錄頁(索引)打比方:正如漢語字典中的漢字按頁存放一樣,SQL Server中的數據記錄也是按頁存放的,每頁容量一般為4K 。為了加快查找的速度,漢語字(詞)典一般都有按拼音、筆畫、偏旁部首等排序的目錄(索引),我們可以選擇按拼音或筆畫查找方式,快速查找到需要的字(詞)。
同理,SQL Server允許用戶在表中創建索引,指定按某列預先排序,從而大大提高查詢速度。
• SQL Server中的數據也是按頁( 4KB )存放
• 索引:是SQL Server編排數據的內部方法。它為SQL Server提供一種方法來編排查詢數據 。
• 索引頁:數據庫中存儲索引的數據頁;索引頁類似於漢語字(詞)典中按拼音或筆畫排序的目錄頁。
• 索引的作用:通過使用索引,可以大大提高數據庫的檢索速度,改善數據庫性能。
索引類型
• 唯一索引:唯一索引不允許兩行具有相同的索引值
• 主鍵索引:為表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的,並且不能為空
• 聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個表只能有一個
• 非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數據存儲在一個位置,索引存儲在另一個位置,索引中包含指向數據存儲位置的指針。可以有多個,小於249個
索引類型:再次用漢語字典打比方,希望大家能夠明白聚集索引和非聚集索引這兩個概念。
唯一索引:
唯一索引不允許兩行具有相同的索引值。
如果現有數據中存在重復的鍵值,則大多數數據庫都不允許將新創建的唯一索引與表一起保存。當新數據將使表中的鍵值重復時,數據庫也拒絕接受此數據。例如,如果在stuInfo表中的學員員身份證號(stuID) 列上創建了唯一索引,則所有學員的身份證號不能重復。
提示:創建了唯一約束,將自動創建唯一索引。盡管唯一索引有助於找到信息,但為了獲得最佳性能,建議使用主鍵約束或唯一約束。
主鍵索引:
在數據庫關系圖中為表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的。當在查詢中使用主鍵索引時,它還允許快速訪問數據。
聚集索引(clustered index)
在聚集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。表只能包含一個聚集索引。例如:漢語字(詞)典默認按拼音排序編排字典中的每頁頁碼。拼音字母a,b,c,d……x,y,z就是索引的邏輯順序,而頁碼1,2,3……就是物理順序。默認按拼音排序的字典,其索引順序和邏輯順序是一致的。即拼音順序較后的字(詞)對應的頁碼也較大。如拼音“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) 對於定義為text、image和bit的數據類型的列不要建立索引。 (一般為非聚集索引)
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 2005的dmvs返回的相關資料時,請務必將以上的觀點裝在腦海中。只有當你確信從dmvs獲得的信息是准確和完整的,你才能變更數據庫或者應用程序代碼。
下面就看一下dmv到底能帶給我們那些好的功能呢?