優(yōu)秀的索引是SQL Server數(shù)據(jù)庫(kù)性能的關(guān)鍵,然而高效的索引都是經(jīng)過精心設(shè)計(jì)而成的。眾所周知,主鍵是儲(chǔ)存數(shù)據(jù)對(duì)象的唯一標(biāo)識(shí),如果數(shù)據(jù)表中沒有聚簇索引,為了維護(hù)主鍵的唯一性,SQL Server數(shù)據(jù)庫(kù)在默認(rèn)情況下將為主鍵創(chuàng)建聚簇索引(Clustered index),除非用
優(yōu)秀的索引是SQL Server性能的關(guān)鍵,然而高效的索引都是經(jīng)過精心設(shè)計(jì)而成的。眾所周知,主鍵是儲(chǔ)存數(shù)據(jù)對(duì)象的唯一標(biāo)識(shí),如果數(shù)據(jù)表中沒有聚簇索引,為了維護(hù)主鍵的唯一性,SQL Server在默認(rèn)情況下將為主鍵創(chuàng)建聚簇索引(Clustered index),除非用戶特別指定將索引創(chuàng)建為非聚簇索引(Non-clustered index)。
毫無(wú)疑問,我們應(yīng)當(dāng)為頻繁訪問的數(shù)據(jù)創(chuàng)建聚簇索引,當(dāng)然頻繁訪問的字段應(yīng)當(dāng)經(jīng)過詳細(xì)的分析和慎重選擇,并且索引值應(yīng)當(dāng)盡可能短。提到創(chuàng)建索引,大家往往首先想到主鍵,但是主鍵的數(shù)據(jù)并不一定被頻繁訪問,而且很多時(shí)候?yàn)榱吮WC主鍵的唯一性,主鍵的數(shù)值往往不是很短,比如我們經(jīng)常會(huì)選擇全局唯一標(biāo)識(shí)符(GUID)類型作為主鍵的數(shù)據(jù)類型,唯一標(biāo)識(shí)符的長(zhǎng)度一般是16個(gè)字節(jié),就長(zhǎng)度而言,這種數(shù)據(jù)類型并不是最理想的聚簇索引選項(xiàng),在這種情況下,可以為主鍵創(chuàng)建非聚簇索引,因?yàn)橹麈I值在WHERE語(yǔ)句中用來(lái)查詢特定的記錄是非常高效的,創(chuàng)建非聚簇索引可以將查詢的效率再上一個(gè)臺(tái)階。如果您選擇了整型作為主鍵的數(shù)據(jù)類型,那就可以考慮將為主鍵生成聚簇索引。
SQL Server 2008為我們提供了另外一種索引——設(shè)定過濾條件索引(Filtered index),一個(gè)設(shè)定過濾條件索引是一個(gè)特殊的非聚簇索引,它是某些字段的特定子集。換句話說,設(shè)定過濾條件索引是基于一部分選定的字段生成的。比如說,在銷售業(yè)績(jī)數(shù)據(jù)表中,分公司所在城市的數(shù)據(jù)存儲(chǔ)在City字段,如果我們創(chuàng)建一個(gè)非聚簇索引,那么所有的分公司所在的城市,都會(huì)被納入索引當(dāng)中。但是如果我們使用設(shè)定過濾條件索引,我們就可以只選擇一部分城市被索引,比如北京,上海和廣州,代碼如下:
?CREATE?NONCLUSTERED?INDEX?FilteredCities?ON?Sales(City)? ?WHERE?City?IN?(‘北京’,’上海’,’廣州’) |
與常規(guī)索引的區(qū)別在于,我們使用了WHERE語(yǔ)句來(lái)設(shè)定我們的過濾條件。假定公司的絕大部分收入都是來(lái)自于這三個(gè)城市的,那么我們的數(shù)據(jù)庫(kù)查詢會(huì)經(jīng)常訪問到在這三個(gè)城市產(chǎn)生的銷售記錄,在這種情況下,設(shè)定過濾條件索引會(huì)占據(jù)較少的磁盤空間,因?yàn)橹挥蠧ity字段的數(shù)值是北京,上海和廣州的記錄會(huì)被索引,這些記錄只是整個(gè)銷售數(shù)據(jù)表格中的一部分。
利用設(shè)定過濾條件索引可以提升數(shù)據(jù)庫(kù)的性能,首先,只有被索引到記錄發(fā)生變化的時(shí)候,才需要重建索引。比如,某一條在北京發(fā)生的銷售記錄需要調(diào)整,在更新操作之后,索引也要隨之更新,這跟其他的索引是一樣的。但如果發(fā)生在西安的銷售記錄發(fā)生了變化,無(wú)論添加或刪除了多少條記錄,我們之前建立的設(shè)定過濾條件索引都是不需要任何操作的,因?yàn)橹挥形挥诒本⑸虾:蛷V州分公司的銷售記錄有影響到這個(gè)索引。設(shè)定過濾條件索引的另外一個(gè)優(yōu)勢(shì)是可以減少磁盤讀寫操作,比如我們要查詢所有北京分公司的銷售記錄,那么使用剛才建立的設(shè)定過濾條件索引比常規(guī)的非聚簇索引要減少很多不必要的磁盤操作。