解讀在SQL Server中使用索引的技巧_Mssql數據庫教程
推薦:怎樣減少SQL Server死鎖發生的情況死鎖是指在某組資源中,兩個或兩個以上的線程在執行過程中,在爭奪某一資源時而造成互相等待的現象,若無外力的作用下,它們都將無法推進下去,死時就可能會產生死鎖,這些永遠在互相等待的進程稱為死鎖線程。簡單的說,進程A等待進程B釋放他的資源,B又等待A
在SQL Server中,為了查詢性能的優化,有時我們就需要對數據表通過建立索引的方式,目的主要是根據查詢要求,迅速縮小查詢范圍,避免全表掃描。
索引有兩種類型,分別是聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)。
聚集索引在一個表中只能有一個,默認情況下在主鍵建立的時候創建,它是規定數據在表中的物理存儲順序,我們也可以取消主鍵的聚集索引,所以必須考慮數據庫可能用到的查詢類型以及使用的最為頻繁的查詢類型,對其最常用的一個字段或者多個字段建立聚集索引或者組合的聚集索引,它就是SQL Server會在物理上按升序(默認)或者降序重排數據列,這樣就可以迅速的找到被查詢的數據。
非聚集索主要是數據存儲在一個地方,索引存儲在另一個地方,索引帶有指針指向數據的存儲位置。索引中的項目按索引鍵值的順序存儲,而表中的信息按另一種順序存儲。可以在一個表格中使用高達249個非聚集的索引,在查詢的過程中先對非聚集索引進行搜索,找到數據值在表中的位置,然后從該位置直接檢索數據。這使非聚集索引成為精確匹配查詢的最佳方法,因為索引包含描述查詢所搜索的數據值在表中的精確位置的條目。
所以我們在選擇創建聚集索引的時候要注意以下幾個方面:
1) 對表建立主鍵時,就會為主鍵自動添加了聚集索引,如自動編號字段,而我們沒有必要把聚集索引浪費在主鍵上,除非你只按主鍵查詢,所以會把聚集索引設置在按條件查詢頻率最高的那個字段或者組合的字段。
2) 索引的建立要根據實際應用的需求來進行,并非是在任何字段上建立索引就能提高查詢速度。聚集索引建立遵循下面幾個原則:
包含大量非重復值的列。
使用下列運算符返回一個范圍值的查詢:BETWEEN、>、>=、< 和 <=。
被連續訪問的列。
返回大型結果集的查詢。
經常被使用聯接或 GROUP BY 子句的查詢訪問的列;一般來說,這些是外鍵列。對ORDER BY 或 GROUP BY 子句中指定的列進行索引,可以使 SQL Server 不必對數據進行排序,因為這些行已經排序。這樣可以提高查詢性能。
OLTP 類型的應用程序,這些程序要求進行非常快速的單行查找(一般通過主鍵)。應在主鍵上創建聚集索引。
舉例來說,銀行交易日志中對交易日期建立聚合索引,數據物理上按順序存于數據頁上,重復值也排列在一起,因而在范圍查找時,可以先找到這個范圍的起末點,且只在這個范圍內掃描數據頁,避免了大范圍掃描,提高了查詢速度。而如果我們對員工的基本信息表中性別的字段列上建立聚集索引,就完全沒有必要,因為內容里只涉及到 “男”與“女”兩個不同值。
3) 在聚集索引中按常用的組合字段建立索引,形成復合索引,一般在為表建立多個主鍵的時候就會產生,如果一個表中的數據在查詢時有多個字段總是同時出現則這些字段就可以作為復合索引,這樣能形成索引覆蓋,提高where語句的查詢效率。
4)索引對查詢有一這的優化,但由于改變一個表的內容,將會引起索引的變化。頻繁的對數據操作如insert,update,delete語句將導致系統花費較大的代價進行索引更新,引起整體性能的下降。一般來講,在對查詢性能的要求高于對數據維護性能要求時,應該盡量使用索引,有時在這種操作數據庫比較頻繁的某些極端情況下,可先刪除索引,再對數據庫表更新大量數據,最后再重建索引,新建立的索引總是比較好用。
索引在使用了長久的時候,就會產生很多的碎片,查詢的性能就會受到影響,這時候有兩種方法解決,一是利用DBCC INDEXDEFRAG整理索引碎片,還有就是利用DBCC DBREINDEX重建索引。
DBCC INDEXDEFRAG 命令是聯機操作,所以索引只有在該命令正在運行時才可用。而且可以在不丟失已完成工作的情況下中斷該操作。這種方法的缺點是在重新組織數據方面沒有聚集索引的除去/重新創建操作有效。
重新創建聚集索引將對數據進行重新組織,其結果是使數據頁填滿。填滿程度可以使用 FILLFACTOR 選項進行配置。這種方法的缺點是索引在除去/重新創建周期內為脫機狀態,并且操作屬原子級。如果中斷索引創建,則不會重新創建該索引。
我們來看看索引重建使用的方法:
語法 DBCC DBREINDEX ( [ ‘TableName’ [ , index_name [ , fillfactor ] ] ] )
參數 ‘TableName’
是要重建其指定的索引的表名。數據庫、所有者和表名必須符合標識符的規則。有關更多信息,請參見使用標識符。如果提供 database 或 owner 部分,則必須使用單引號 (‘)將整個 database.owner.table_name 括起來。如果只指定 table_name,則不需要單引號。
index_name 是要重建的索引名。索引名必須符合標識符的規則。如果未指定 index_name 或指定為 ‘ ‘,就要對表的所有索引進行重建。
fillfactor 是創建索引時每個索引頁上要用于存儲數據的空間百分比。fillfactor替換起始填充因子以作為索引或任何其它重建的非聚集索引(因為已重建聚集索引)的新默認值。如果 fillfactor 為 0,DBCC DBREINDEX 在創建索引時將使用指定的起始fillfactor。
我們在查詢分析器中輸入如下的命令:
DBCC DBREINDEX (‘MyTable,’’,80)
這樣就會索引重建了。
分享:解析SQL Server數據庫觸發器的安全隱患觸發器權限和所有權 CREATE TRIGGER 權限默認授予定義觸發器的表所有者、sysadmin 固定服務器角色成員以及 db_owner 和 db_ddladmin 固定數據庫角色成員,并且不可轉讓。 需要的環境 本文需要的環境是已經獲取了sql服務器的以上其中一個權限,目的是為了留下
- sql 語句練習與答案
- 深入C++ string.find()函數的用法總結
- SQL Server中刪除重復數據的幾個方法
- sql刪除重復數據的詳細方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數據庫,提示 無法為該請求檢索數據 錯誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數的用法實例詳解
Mssql數據庫教程Rss訂閱編程教程搜索
Mssql數據庫教程推薦
猜你也喜歡看這些
- 深入mysql "ON DUPLICATE KEY UPDATE" 語法的分析
- 如何用命令行進入mysql具體操作步驟
- PHP mysqli擴展庫 預處理技術的使用分析
- jdbc調用mysql存儲過程實現代碼
- 解析mysql中:單表distinct、多表group by查詢去除重復記錄
- MySQL筆記之子查詢使用介紹
- MySQL SELECT同時UPDATE同一張表問題發生及解決
- 解決sql server 2005 express中sa不能登錄
- 網站模板:SQL2005CLR函數擴展 - 關于山寨索引
- 解決MYSQL出現Can''t create/write to file ''#sql_5c0_0.MYD''的問題
- 相關鏈接:
- 教程說明:
Mssql數據庫教程-解讀在SQL Server中使用索引的技巧
。