當前位置: 首頁 > 新聞動態

在SQL Server中使用索引的技巧

2009-11-13 強訊科技 供稿 【
  在SQLServer中,為了查詢性能的優化,有時我們就需要對數據表通過建立索引的方式。所以以下介紹了SQL Server中使用索引的技巧方便大家優化查詢。

在SQLServer中,為了查詢性能的優化,有時我們就需要對數據表通過建立索引的方式,目的主要是根據查詢要求,迅速縮小查詢范圍,避免全表掃描。
    索引有兩種類型,分別是聚集索引(clusteredindex,也稱聚類索引、簇集索引)和非聚集索引(nonclusteredindex,也稱非聚類索引、非簇集索引)。
    聚集索引在一個表中只能有一個,默認情況下在主鍵建立的時候創建,它是規定數據在表中的物理存儲順序,我們也可以取消主鍵的聚集索引,所以必須考慮數據庫可能用到的查詢類型以及使用的最為頻繁的查詢類型,對其最常用的一個字段或者多個字段建立聚集索引或者組合的聚集索引,它就是SQLServer會在物理上按升序(默認)或者降序重排數據列,這樣就可以迅速的找到被查詢的數據。

非聚集索主要是數據存儲在一個地方,索引存儲在另一個地方,索引帶有指針指向數據的存儲位置。索引中的項目按索引鍵值的順序存儲,而表中的信息按另一種順序存儲。可以在一個表格中使用高達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)
        這樣就會索引重建了。

分享到:

北京強訊科技有限公司-呼叫中心專家 版權所有© 2013     客戶服務熱線:400-700-8003   值班電話:151-2001-5266

  • 聯系電話    北京總部:(010)82015266  上海:(021)64865166  廣州:(020)83503506
现代战争走势图 大排档赚钱么 双色球复式投注 网球比分查询 天津麻将必胜技巧 20选5复式中奖计算表 上海时时乐走势图图感觉 天津快乐十分 超神计划软件江苏快3 英雄杀攻略 足球即时指数捷报网 浙江飞鱼 福建省福彩25选5走势图 6号彩票安卓 大众麻将 上海快3开奖查询 青海11选5