查看全部128種考試
軟件水平考試
 考試動(dòng)態(tài) 報(bào)考指南 歷年真題 模擬試題 復(fù)習(xí)資料 心得技巧 專業(yè)英語 技術(shù)文章 軟考論壇 考試用書
 程序員 軟件設(shè)計(jì)師 網(wǎng)絡(luò)管理員 網(wǎng)絡(luò)工程師 系統(tǒng)分析師 數(shù)據(jù)庫系統(tǒng)工程師
1
2
3
4
5
6
7
8
9
10
yanruijie  
【字體: SQL SERVER優(yōu)化建議
SQL SERVER優(yōu)化建議
spks.exam8.com 來源:考試吧(Exam8.com) 更新:2007-1-25 16:13:03 軟件水平考試 考試論壇
  在實(shí)際的工作中,尤其是在生產(chǎn)環(huán)境里邊,SQL語句的優(yōu)化問題十分的重要,它對(duì)數(shù)據(jù)庫的性能的提升也起著顯著的作用。我們總是在抱怨機(jī)器的性能問題,總是在抱怨并發(fā)訪問所帶來的瑣問題,但是如果我們對(duì)沒一條SQL語句進(jìn)行優(yōu)化,盡管不能說可以解決全部問題,但是至少可以解決大部分問題。

1.Top排序問題
  我們經(jīng)常要對(duì)表某個(gè)字段進(jìn)行排序,然后取前N名。所以我們會(huì)寫如下的SQL語句:
  select top 100 * from 表 order by Score desc
  如果表非常大的話,那么這樣的操作是非常消耗資源的,因?yàn)镾QL SERVER要對(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 @DateTime datetime
  set @DateTime=getdate()
  select * from 表
  where convert(char(10),F_Time,120)=convert(char(10),@DateTime,120)


  但是這樣寫的SQL語句帶來的問題就是不能使用F_Time上的索引了。為了近可能的使用F_Time上的索引,我們可以使用時(shí)間段查詢的方式來代替上邊的語句。


  declare @start datetime
  declare @end datetime
  declare @datetime datetime
  set @datetime=getdate()
  set @start=convert(char(10),@datetime,120)  --  一天的其始時(shí)間
  set @end=dateadd(ss,-1,dateadd(d,1,@start))  --  一天的結(jié)束時(shí)間


  select *
  from 表
  where F_Time between @start and @end


  這樣就解決了使用不上索引的問題.


 3.利用索引進(jìn)行分組操作
  我們經(jīng)常要對(duì)某一字段進(jìn)行分組,而對(duì)另外一些字段進(jìn)行聚合操作。如果我們對(duì)分組的字段合理的使用索引,可以加快我們分組的速度.下邊以Northwind的Orders表為例:


  --  orders表的EmployeeID上建有索引。
  select EmployeeID,count(*)
  from orders
  group by EmployeeID


  --  查看執(zhí)行計(jì)劃,此查詢利用了EmployeeID上的索引。如改成如下查詢:
  select EmployeeID,sum(Freight)
  from orders
  group by EmployeeID


  --  查看執(zhí)行計(jì)劃,此查詢則沒有使用EmployeeID上的索引。而是使用了全表掃描。那么原因是什么呢?是因?yàn)镕reight沒有在EmployeeID的索引上,所以通過索引不能得到結(jié)果。而如果通過書簽查詢的成本太高,所以SQL SERVER選擇了使用全表掃描。而如果我們執(zhí)行在EmployeeID和Freight上建立復(fù)合索引呢?


  create index idx_EmployeeID on Orders(EmployeeID,Freight)


  --  再次執(zhí)行第二個(gè)查詢。查看執(zhí)行計(jì)劃。SQL SERVER使用的我們建立的索引。只需要使用索引就可以查詢到結(jié)果,極大的提高了我們的查詢速度。

更多軟考資料請(qǐng)?jiān)L問:考試吧軟件水平考試欄目

希望與更多網(wǎng)友交流,請(qǐng)進(jìn)入考試吧軟件水平考試論壇

轉(zhuǎn)帖于:軟件水平考試_考試吧
文章搜索  
看了本文的網(wǎng)友還看了:
網(wǎng)友評(píng)論
昵 稱: *  評(píng) 分: 1分 2分 3分 4分 5分
標(biāo)題:   匿名發(fā)表    (共有條評(píng)論)查看全部評(píng)論>>
版權(quán)聲明 -------------------------------------------------------------------------------------
  如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請(qǐng)注明出處。
關(guān)于本站  網(wǎng)站聲明  廣告服務(wù)  聯(lián)系方式  付款方式  站內(nèi)導(dǎo)航  客服中心  友情鏈接  考試論壇  網(wǎng)站地圖
Copyright © 2004-2008 考試吧軟件水平考試網(wǎng) All Rights Reserved    
中國科學(xué)院研究生院權(quán)威支持(北京) 電 話:010-62168566 傳 真:010-62192699
百度大聯(lián)盟黃金認(rèn)證  十佳網(wǎng)絡(luò)教育機(jī)構(gòu)  經(jīng)營許可證號(hào):京ICP060677