一、索引壓縮數(shù)據(jù)和索引壓縮在SQL Server2008被引入。壓縮一個(gè)索引意味著將在一個(gè)頁(yè)面中獲得更多的關(guān)鍵字信息。這可以造成重大的性能改進(jìn),因?yàn)榇鎯?chǔ)索引需要的頁(yè)面和索引級(jí)別更少。因?yàn)樗饕械逆I值被壓縮和解壓縮,也將造成CPU和內(nèi)存的開銷,所以這并不是適合所有索引的方案。 默認(rèn)情況下,索引將不會(huì)被壓縮。必須明確地在創(chuàng)建索引時(shí)要求索引被壓縮。有兩種壓縮類型:行級(jí)壓縮和頁(yè)面級(jí)壓縮。索引中的非葉子頁(yè)面不接受頁(yè)面類型壓縮。 創(chuàng)建壓縮索引的語(yǔ)法如下: CREATE NONCLUSTERED INDEX IX_Person_Name ON PersonOneMillion(Name) WITH(DATA_COMPRESSION = Page) 下面以一個(gè)示例來(lái)看看壓縮索引的作用: 正常索引:
行級(jí)壓縮索引:
頁(yè)面級(jí)壓縮索引:
我們看到對(duì)于100萬(wàn)索引的Name列索引,索引數(shù)據(jù)頁(yè)面分別是:
從上面的例子我們可以得出結(jié)論,的確壓縮能夠能夠大幅減少索引的頁(yè)面量。但是舉個(gè)很簡(jiǎn)單的例子,如果一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器上,內(nèi)存和CPU已是瓶頸,那么壓縮數(shù)據(jù)作用實(shí)際上并不大。 至于更具體的哪個(gè)更好,這個(gè)有時(shí)間了再慢慢測(cè)試?,F(xiàn)在只是知道了索引可以壓縮已減少索引數(shù)據(jù)頁(yè)面數(shù)量。 附上一個(gè)查看索引消息的SQL語(yǔ)句: --查看索引數(shù)據(jù)頁(yè)數(shù) SELECT i.name,i.type_desc,s.page_count,s.record_count,s.index_level,compressed_page_count FROM sys.indexes i JOIN sys.dm_db_index_physical_stats(DB_ID(N'DataExample'),OBJECT_ID(N'PersonOneMillion'),NULL,NULL,'DETAILED') AS s ON i.index_id = s.index_id WHERE i.OBJECT_ID = OBJECT_ID(N'PersonOneMillion') 二、 附加特性1、不同的列排序順序 SQL Server支持使用不同的排序順序?yàn)樗饕牟煌袆?chuàng)建一個(gè)復(fù)雜的索引。如果希望一個(gè)索引的第一列按照升序排列二第二列按照降序排列,可以用如下語(yǔ)句完成: CREATE NONCLUSTERED INDEX IX ON Table(c1 ASC,c2 DESC) 2、BIT數(shù)據(jù)類型列上的索引 SQL Server允許創(chuàng)建在BIT數(shù)據(jù)類型列上的索引。創(chuàng)建BIT數(shù)據(jù)類型列上的索引的能力本身不是一個(gè)大的優(yōu)點(diǎn),因?yàn)檫@樣的列只能有兩個(gè)不同的值。這么低的選擇性的列通常不是好的索引后選擇。但是,這個(gè)功能在考慮覆蓋索引時(shí)非常有用。因?yàn)楦采w索引需要包含所有搜索中的返回列,而在索引中添加BIT數(shù)據(jù)類型列將使得覆蓋索引在需要時(shí)包含這樣的列。 3、CREATE INDEX語(yǔ)句也會(huì)使用索引提升速度 CREATE INDEX操作被集成到查詢處理器。優(yōu)化器可能使用已有的索引來(lái)減少掃描開銷并在創(chuàng)建索引時(shí)排序。
在第一個(gè)索引中由于已經(jīng)包含了Name列,而第二個(gè)索引也要使用Name列的時(shí)候,創(chuàng)建索引SQL Server直接使用索引掃描的方式來(lái)創(chuàng)建索引。 4、并行索引創(chuàng)建 SQL Server支持CREATE INDEX語(yǔ)句的并行計(jì)劃,正如在其他SQL查詢中一樣。在一個(gè)多處理器的機(jī)器上,索引創(chuàng)建不限于單個(gè)處理器而是從多個(gè)處理器中獲益??梢允褂肧QL Server的max degree of parallelism配置參數(shù)來(lái)控制用于CREATE INDEX語(yǔ)句中的處理器數(shù)量。這個(gè)參數(shù)的默認(rèn)值為0,0表示可以使用任意的CPU數(shù)量。 EXEC sp_configure 'max degree of parallelism' --默認(rèn)值為0 EXEC sp_configure 'max degree of parallelism', 2 --使用2個(gè)CPU RECONFIGURE WITH OVERRIDE 這個(gè)配置設(shè)置立即生效,不需要重啟服務(wù)器。 |
|