新聞中心
以下的文章主要描述的是SQL Server評(píng)價(jià)索引之有效性(Evaluating Index Usefulness),SQL Server數(shù)據(jù)庫(kù)所提供的索引主要有2個(gè)原因:***是作為一種保證數(shù)據(jù)庫(kù)表中數(shù)據(jù)唯一性的方法;其二,提供了一種快速訪問(wèn)表中數(shù)據(jù)的方法。

創(chuàng)建合適的索引是數(shù)據(jù)庫(kù)物理設(shè)計(jì)時(shí)最為重要的方面之一。因?yàn)槟悴荒茉谝粋€(gè)表上無(wú)限制地創(chuàng)建索引,而且不管怎么說(shuō),它也是不可行的。所以,你將想在一些具有高選擇性 (high Selectivity )的列上創(chuàng)建索引,這樣,查詢時(shí)系統(tǒng)將會(huì)利用這些索引。一個(gè)SQL Server評(píng)價(jià)索引的選擇性定義如下:
引用
選擇率 = (唯一索引值的個(gè)數(shù))/ (表中所有行數(shù))
- Selectivity ratio = (Number of unique index values)/ (Total number of rows in the
如果選擇率高——也就是說(shuō),大量行都可以用索引鍵值來(lái)唯一標(biāo)識(shí)——那么該SQL Server評(píng)價(jià)索引就具有高選擇性,即對(duì)優(yōu)化器來(lái)說(shuō)也是有用的。***的選擇性是1,即每一行都有一個(gè)唯一的索引鍵值。低選擇性意味著表中有許多重復(fù)的鍵值,這樣的索引將很少有用。
SQL Server優(yōu)化器基于索引的選擇性來(lái)決定對(duì)一個(gè)查詢是否使用索引。越高的選擇性,SQL Server檢索結(jié)果集(Result set)就越快和越有效。
例如,你正在對(duì)authors 表中的索引的有效性進(jìn)行評(píng)估。假如大多數(shù)查詢是以author's last name或者state來(lái)進(jìn)行訪問(wèn)的。因?yàn)榇罅康牟l(fā)用戶會(huì)修改該表的數(shù)據(jù),你只允許一個(gè)索引——author's last name或者state,你將會(huì)選擇誰(shuí)?讓我們進(jìn)行一些分析來(lái)判斷哪個(gè)索引更有效些,或者更有選擇性。首先,利用一個(gè)查詢來(lái)確定pubs數(shù)據(jù)庫(kù)中 author表的last name列的有效性:
Sql代碼
- select count(distinct au_lname) as '# unique',
- count(*) as '# rows',
- str(count(distinct au_lname) / cast (count(*) as real),4,2) as 'selectivity'
- from authors
- go
- select count(distinct au_lname) as '# unique',
- count(*) as '# rows',
- str(count(distinct au_lname) / cast (count(*) as real),4,2) as 'selectivity'
- from authors
- go
- # unique # rows selectivity
- 22 23 0.96
author表的au_lname列的有效率計(jì)算值為0.96,表明在au_lname創(chuàng)建的SQL Server評(píng)價(jià)索引將具有高選擇性,也是一個(gè)好的候選索引。除了一行外,其余所有行的last name值都唯一。 現(xiàn)在,來(lái)分析state列的選擇性:
Sql代碼
- select count(distinct state) as '# unique',
- count(*) '# rows',
- str(count(distinct state) / cast (count(*) as real),4,2) as 'selectivity'
- from authors
- go
- select count(distinct state) as '# unique',
- count(*) '# rows',
- str(count(distinct state) / cast (count(*) as real),4,2) as 'selectivity'
- from authors
- go
- # unique # rows selectivity
- 8 23 0.35
正如你所看到的,state列的SQL Server評(píng)價(jià)索引選擇率(0.35)比au_lname索引選擇率要低很多,將不太有用。
對(duì)于這一點(diǎn),你可能會(huì)問(wèn),是否因?yàn)閟tate列中的一些值具有較高的重復(fù)性而導(dǎo)致了選擇性的下降,或者說(shuō)僅僅只有一些值具有唯一性。你可以用下面的查詢來(lái)確定:
Sql代碼
- select state, count(*)
- from authors
- group by state
- order by 2 desc
- go
- select state, count(*)
- from authors
- group by state
- order by 2 desc
- go
- state
- CA 15
- UT 2
- TN 1
- MI 1
- OR 1
- IN 1
- KS 1
- MD 1
正如你所預(yù)料到的,state值,除了一個(gè)外,其余值都相對(duì)唯一。因?yàn)楸碇杏卸嘁话氲膕tate值都為‘CA’。所以state可能不是一個(gè)好的候選索引列,特別是假如大部分時(shí)間你都以CA來(lái)進(jìn)行查詢,此時(shí),SQL Server將發(fā)現(xiàn)掃描整個(gè)表將比借助索引進(jìn)行查詢數(shù)據(jù)更有效。
一般來(lái)說(shuō),如果一個(gè)鍵值的選擇率低于0.85,那么優(yōu)化器通常會(huì)選擇表掃描來(lái)處理查詢。在這種情況下,使用表掃描來(lái)獲取所有滿足條件的數(shù)據(jù)行將比通過(guò)B-Tree來(lái)定位大量數(shù)據(jù)行來(lái)查找更有效率。
如果有更多的索引可以選擇,那么SQL Server將怎樣來(lái)確定每個(gè)索引是否具有選擇性和到底選擇哪一個(gè)索引對(duì)用戶來(lái)說(shuō)更有效呢?例如,SQL Server怎么知道下面的索引能夠返回多少行?
- select * from table where key between 1000000 and 2000000
如果該表在0到20,000,000之間有10,000,000行記錄,優(yōu)化器如何知道是使用一個(gè)索引還是進(jìn)行表掃描呢?如果在該范圍內(nèi)有10行記錄,或者900,000,又如何選擇?SQL Server如何來(lái)估計(jì)在1,000,000 至2,000,000之間有多少行?等等諸如此類(lèi)的問(wèn)題,優(yōu)化器是從SQL Server評(píng)價(jià)索引統(tǒng)計(jì)(Index Statistics)中獲得這些信息的。
新聞名稱:SQLServer評(píng)價(jià)索引之有效性
網(wǎng)站鏈接:http://m.fisionsoft.com.cn/article/ccicsgc.html


咨詢
建站咨詢
