資源描述:
《sqlserver建立索引 注意的問題》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫(kù)。
1、SQLSERVER建立索引注意的問題SQLSERVER建立索引注意的問題2008-12-1716:23:19
2、分類:sqlserver
3、標(biāo)簽:
4、字號(hào)大中小訂閱.----人們?cè)谑褂肧QL時(shí)往往會(huì)陷入一個(gè)誤區(qū),即太關(guān)注于所得的結(jié)果是否正確,而忽略了不同的實(shí)現(xiàn)方法之間可能存在的性能差異,這種性能差異在大型的或是復(fù)雜的數(shù)據(jù)庫(kù)環(huán)境中(如聯(lián)機(jī)事務(wù)處理OLTP或決策支持系統(tǒng)DSS)中表現(xiàn)得尤為明顯。筆者在工作實(shí)踐中發(fā)現(xiàn),不良的SQL往往來自于不恰當(dāng)?shù)乃饕O(shè)計(jì)、不充份的連接條件和不可優(yōu)化的where子句。在對(duì)它們進(jìn)行適當(dāng)?shù)膬?yōu)化后,其運(yùn)行速度有了明顯地提
5、高!下面我將從這三個(gè)方面分別進(jìn)行總結(jié):----為了更直觀地說明問題,所有實(shí)例中的SQL運(yùn)行時(shí)間均經(jīng)過測(cè)試,不超過1秒的均表示為(<1秒)。----測(cè)試環(huán)境------主機(jī):HPLHII----主頻:330MHZ----內(nèi)存:128兆----操作系統(tǒng):Operserver5.0.4----數(shù)據(jù)庫(kù):Sybase11.0.3一、不合理的索引設(shè)計(jì)----例:表record有620000行,試看在不同的索引下,下面幾個(gè)SQL的運(yùn)行情況:----1.在date上建有一個(gè)非群集索引selectcount(*)fromrecordwheredate>'
6、19991201'anddate<'19991214'andamount>2000(25秒)selectdate,sum(amount)fromrecordgroupbydate(55秒)selectcount(*)fromrecordwheredate>'19990901'andplacein('BJ','SH')(27秒)----分析:----date上有大量的重復(fù)值,在非群集索引下,數(shù)據(jù)在物理上隨機(jī)存放在數(shù)據(jù)頁(yè)上,在范圍查找時(shí),必須執(zhí)行一次表掃描才能找到這一范圍內(nèi)的全部行。----2.在date上的一個(gè)群集索引selectcoun
7、t(*)fromrecordwheredate>'19991201'anddate<'19991214'andamount>2000(14秒)selectdate,sum(amount)fromrecordgroupbydate(28秒)selectcount(*)fromrecordwheredate>'19990901'andplacein('BJ','SH')(14秒)----分析:----在群集索引下,數(shù)據(jù)在物理上按順序在數(shù)據(jù)頁(yè)上,重復(fù)值也排列在一起,因而在范圍查找時(shí),可以先找到這個(gè)范圍的起末點(diǎn),且只在這個(gè)范圍內(nèi)掃描數(shù)據(jù)頁(yè),避免
8、了大范圍掃描,提高了查詢速度。----3.在place,date,amount上的組合索引selectcount(*)fromrecordwheredate>'19991201'anddate<'19991214'andamount>2000(26秒)selectdate,sum(amount)fromrecordgroupbydate(27秒)selectcount(*)fromrecordwheredate>'19990901'andplacein('BJ,'SH')(<1秒)----分析:----這是一個(gè)不很合理的組合索引,因?yàn)樗?/p>
9、的前導(dǎo)列是place,第一和第二條SQL沒有引用place,因此也沒有利用上索引;第三個(gè)SQL使用了place,且引用的所有列都包含在組合索引中,形成了索引覆蓋,所以它的速度是非??斓?。----4.在date,place,amount上的組合索引selectcount(*)fromrecordwheredate>'19991201'anddate<'19991214'andamount>2000(<1秒)selectdate,sum(amount)fromrecordgroupbydate(11秒)selectcount(*)fromr
10、ecordwheredate>'19990901'andplacein('BJ','SH')(<1秒)----分析:----這是一個(gè)合理的組合索引。它將date作為前導(dǎo)列,使每個(gè)SQL都可以利用索引,并且在第一和第三個(gè)SQL中形成了索引覆蓋,因而性能達(dá)到了最優(yōu)。----5.總結(jié):----缺省情況下建立的索引是非群集索引,但有時(shí)它并不是最佳的;合理的索引設(shè)計(jì)要建立在對(duì)各種查詢的分析和預(yù)測(cè)上。一般來說:----①.有大量重復(fù)值、且經(jīng)常有范圍查詢(between,>,<,>=,<=)和orderby、groupby發(fā)生的列,可考慮建立群集索引
11、;----②.經(jīng)常同時(shí)存取多列,且每列都含有重復(fù)值可考慮建立組合索引;----③.組合索引要盡量使關(guān)鍵查詢形成索引覆蓋,其前導(dǎo)列一定是使用最頻繁的列。二、不充份的連接條件:----例:表card有7896行