SQL SERVER的優(yōu)化建議與方法
發(fā)布日期:2022-02-04 08:22 | 文章來源:源碼中國
1.Top排序問題.
我們經(jīng)常要對(duì)表某個(gè)字段進(jìn)行排序,然后取前N名.所以我們會(huì)寫如下的SQL語句:
selecttop100*from表
orderbyScoredesc
如果表非常大的話,那么這樣的操作是非常消耗資源的,因?yàn)镾QLSERVER要對(duì)整個(gè)表進(jìn)行排序,然后取前N條記錄.這樣的造作是在Temdb里邊進(jìn)行的,所以極端的時(shí)候會(huì)報(bào)Log已滿這樣的錯(cuò)誤.為了避免進(jìn)行全表的排序,我們要做的僅僅是在Score上建立索引,這樣因?yàn)镾core索引的葉級(jí)是有序的,只要在Score所以的頁級(jí)取前100個(gè),然后根據(jù)書簽查找到實(shí)際的記錄,這樣對(duì)DB的性能就會(huì)有極大的提升.
2.同一天問題.
我們經(jīng)常要查找和一個(gè)日期同一天的記錄,所以我們回寫如下的SQL語句;
declare@DateTimedatetime
set@DateTime=getdate()
select*from表
whereconvert(char(10),F_Time,120)=convert(char(10),@DateTime,120)
但是這樣寫的SQL語句帶來的問題就是不能使用F_Time上的索引了.為了近可能的使用F_Time上的索引,我們可以使用時(shí)間段查詢的方式來代替上邊的語句.
declare@startdatetime
declare@enddatetime
declare@datetimedatetime
set@datetime=getdate()
set@start=convert(char(10),@datetime,120)--一天的其始時(shí)間
set@end=dateadd(ss,-1,dateadd(d,1,@start))--一天的結(jié)束時(shí)間
select*from表whereF_Timebetween@startand@end
這樣就解決了使用不上索引的問題.
3.利用索引進(jìn)行分組操作.】 我們經(jīng)常要對(duì)某一字段進(jìn)行分組,而對(duì)另外一些字段進(jìn)行聚合操作.如果我們對(duì)分組的字段合理的使用索引,可以加快我們分組的速度.下邊以Northwind的Orders表為例:
--orders表的EmployeeID上建有索引.
selectEmployeeID,count(*)
fromorders
groupbyEmployeeID
--查看執(zhí)行計(jì)劃,此查詢利用了EmployeeID上的索引.如改成如下查詢:
selectEmployeeID,sum(Freight)
fromorders
groupbyEmployeeID
--查看執(zhí)行計(jì)劃,此查詢則沒有使用EmployeeID上的索引.而是使用了全表掃描.那么原因是什么呢?是因?yàn)镕reight沒有在EmployeeID的索引上,所以通過索引不能得到結(jié)果.而如果通過書簽查詢的成本太高,所以SQLSERVER選擇了使用全表掃描.而如果我們執(zhí)行在EmployeeID和Freight上建立復(fù)合索引呢?
createindexidx_EmployeeIDonorders(EmployeeID,Freight)
--再次執(zhí)行第二個(gè)查詢.查看執(zhí)行計(jì)劃.SQLSERVER使用的我們建立的索引.只需要使用索引就可以查詢到結(jié)果,極大的提高了我們的查詢速度.
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
相關(guān)文章
關(guān)注官方微信