版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
轉(zhuǎn)載--如何提高數(shù)據(jù)庫的查詢效率
1、用Profiler來跟蹤查詢,得到查詢所需的時(shí)間,找出SQL的問題所在;用索引優(yōu)化器優(yōu)化索引
2、注意UNion和UNionall的區(qū)別。UNIONall好
3、注意使用DISTINCT,在沒有必要時(shí)不要用,它同UNION一樣會(huì)使查詢變慢。重復(fù)的記錄在查詢里是沒有問題的
4、查詢時(shí)不要返回不需要的行、列
5、用sp_configure'querygovernorcostlimit'或者SETQUERY_GOVERNOR_COST_LIMIT來限制查詢消耗的資源。當(dāng)評(píng)估查詢消耗的資源超出限制時(shí),服務(wù)器自動(dòng)取消查詢,在查詢之前就扼殺掉。SETLOCKTIME設(shè)置鎖的時(shí)間
6、用selecttop100/10Percent來限制用戶返回的行數(shù)或者SETROWCOUNT來限制操作的行
7、在SQL2000以前,一般不要用如下的字句:"ISNULL","<>","!=","!>","!<","NOT","NOTEXISTS","NOTIN","NOTLIKE",and"LIKE'%500'",因?yàn)樗麄儾蛔咚饕潜頀呙?。也不要在WHere字句中的列名加函數(shù),如Convert,substring等,如果必須用函數(shù)的時(shí)候,創(chuàng)建計(jì)算列再創(chuàng)建索引來替代.還可以變通寫法:WHERESUBSTRING(firstname,1,1)='m'改為WHEREfirstnamelike'm%'(索引掃描),一定要將函數(shù)和列名分開。并且索引不能建得太多和太大。NOTIN會(huì)多次掃描表,使用EXISTS、NOTEXISTS,IN,LEFTOUTERJOIN來替代,特別是左連接,而Exists比IN更快,最慢的是NOT操作.如果列的值含有空,以前它的索引不起作用,現(xiàn)在2000的優(yōu)化器能夠處理了。相同的是ISNULL,"NOT","NOTEXISTS","NOTIN"能優(yōu)化她,而"<>"等還是不能優(yōu)化,用不到索引。
8、使用QueryAnalyzer,查看SQL語句的查詢計(jì)劃和評(píng)估分析是否是優(yōu)化的SQL。一般的20%的代碼占據(jù)了80%的資源,我們優(yōu)化的重點(diǎn)是這些慢的地方。
9、如果使用了IN或者OR等時(shí)發(fā)現(xiàn)查詢沒有走索引,使用顯示申明指定索引:
SELECT*FROMPersonMember(INDEX=IX_Title)WHEREprocessidIN('男','女')
10、將需要查詢的結(jié)果預(yù)先計(jì)算好放在表中,查詢的時(shí)候再SELECT。這在SQL7.0以前是最重要的手段。例如醫(yī)院的住院費(fèi)計(jì)算。
11、MIN()和MAX()能使用到合適的索引。
12、數(shù)據(jù)庫有一個(gè)原則是代碼離數(shù)據(jù)越近越好,所以優(yōu)先選擇Default,依次為Rules,Triggers,Constraint(約束如外健主健CheckUNIQUE……,數(shù)據(jù)類型的最大長度等等都是約束),Procedure.這樣不僅維護(hù)工作小,編寫程序質(zhì)量高,并且執(zhí)行的速度快。
13、如果要插入大的二進(jìn)制值到Image列,使用存儲(chǔ)過程,千萬不要用內(nèi)嵌INsert來插入(不知JAVA是否)。因?yàn)檫@樣應(yīng)用程序首先將二進(jìn)制值轉(zhuǎn)換成字符串(尺寸是它的兩倍),服務(wù)器受到字符后又將他轉(zhuǎn)換成二進(jìn)制值.存儲(chǔ)過程就沒有這些動(dòng)作:方法:
Createprocedurep_insertasinsertintotable(Fimage)values(@image)
在前臺(tái)調(diào)用這個(gè)存儲(chǔ)過程傳入二進(jìn)制參數(shù),這樣處理速度明顯改善。
14、Between在某些時(shí)候比IN速度更快,Between能夠更快地根據(jù)索引找到范圍。用查詢優(yōu)化器可見到差別。
select*fromchineseresumewheretitlein('男','女')
Select*fromchineseresumewheretitlebetween'男'and'女'
是一樣的。由于in會(huì)在比較多次,所以有時(shí)會(huì)慢些。
15、在必要是對(duì)全局或者局部臨時(shí)表創(chuàng)建索引,有時(shí)能夠提高速度,但不是一定會(huì)這樣,因?yàn)樗饕埠馁M(fèi)大量的資源。他的創(chuàng)建同是實(shí)際表一樣。
16、不要建沒有作用的事物例如產(chǎn)生報(bào)表時(shí),浪費(fèi)資源。只有在必要使用事物時(shí)使用它。
17、用OR的字句可以分解成多個(gè)查詢,并且通過UNION連接多個(gè)查詢。他們的速度只同是否使用索引有關(guān),如果查詢需要用到聯(lián)合索引,用UNIONall執(zhí)行的效率更高.多個(gè)OR的字句沒有用到索引,改寫成UNION的形式再試圖與索引匹配。一個(gè)關(guān)鍵的問題是否用到索引。
18、盡量少用視圖,它的效率低。對(duì)視圖操作比直接對(duì)表操作慢,可以用storedprocedure來代替她。特別的是不要用視圖嵌套,嵌套視圖增加了尋找原始資料的難度。我們看視圖的本質(zhì):它是存放在服務(wù)器上的被優(yōu)化好了的已經(jīng)產(chǎn)生了查詢規(guī)劃的SQL。對(duì)單個(gè)表檢索數(shù)據(jù)時(shí),不要使用指向多個(gè)表的視圖,直接從表檢索或者僅僅包含這個(gè)表的視圖上讀,否則增加了不必要的開銷,查詢受到干擾.為了加快視圖的查詢,MsSQL增加了視圖索引的功能。
19、沒有必要時(shí)不要用DISTINCT和ORDERBY,這些動(dòng)作可以改在客戶端執(zhí)行。它們?cè)黾恿祟~外的開銷。這同UNION和UNIONALL一樣的道理。
selecttop20panyname,comid,position,ad.referenceid,worklocation,
convert(varchar(10),ad.postDate,120)aspostDate1,workyear,degreedescriptionFROM
jobcn_query.dbo.COMPANYAD_queryadwherereferenceIDin('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345',
'JCNAD00333138','JCNAD00303570','JCNAD00303569',
'JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933',
'JCNAD00254567','JCNAD00254585','JCNAD00254608',
'JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618',
'JCNAD00279196','JCNAD00268613')orderbypostdatedesc
20、在IN后面值的列表中,將出現(xiàn)最頻繁的值放在最前面,出現(xiàn)得最少的放在最后面,減少判斷的次數(shù)。
21、當(dāng)用SELECTINTO時(shí),它會(huì)鎖住系統(tǒng)表(sysobjects,sysindexes等等),阻塞其他的連接的存取。創(chuàng)建臨時(shí)表時(shí)用顯示申明語句,而不是
selectINTO.droptablet_lxhbegintranselect*intot_lxhfromchineseresume
wherename='XYZ'--commit
在另一個(gè)連接中SELECT*fromsysobjects可以看到SELECTINTO會(huì)鎖住系統(tǒng)表,Createtable也會(huì)鎖系統(tǒng)表(不管是臨時(shí)表還是系統(tǒng)表)。所以千萬不要在事務(wù)內(nèi)使用它?。。∵@樣的話如果是經(jīng)常要用的臨時(shí)表請(qǐng)使用實(shí)表,或者臨時(shí)表變量。
22、一般在GROUPBY個(gè)HAVING字句之前就能剔除多余的行,所以盡量不要用它們來做剔除行的工作。他們的執(zhí)行順序應(yīng)該如下最優(yōu):select的Where字句選擇所有合適的行,GroupBy用來分組個(gè)統(tǒng)計(jì)行,Having字句用來剔除多余的分組。這樣GroupBy個(gè)Having的開銷小,查詢快.對(duì)于大的數(shù)據(jù)行進(jìn)行分組和Having十分消耗資源。如果GroupBY的目的不包括計(jì)算,只是分組,那么用Distinct更快
23、一次更新多條記錄比分多次更新每次一條快,就是說批處理好
24、少用臨時(shí)表,盡量用結(jié)果集和Table類性的變量來代替它,Table類型的變量比臨時(shí)表好
25、在SQL2000下,計(jì)算字段是可以索引的,需要滿足的條件如下:
a、計(jì)算字段的表達(dá)是確定的
b、不能用在TEXT,Ntext,Image數(shù)據(jù)類型
c、必須配制如下選項(xiàng)ANSI_NULLS=ON,ANSI_PADDINGS=ON,…….
26、盡量將數(shù)據(jù)的處理工作放在服務(wù)器上,減少網(wǎng)絡(luò)的開銷,如使用存儲(chǔ)過程。存儲(chǔ)過程是編譯好、優(yōu)化過、并且被組織到一個(gè)執(zhí)行規(guī)劃里、且存儲(chǔ)在數(shù)據(jù)庫中的SQL語句,是控制流語言的集合,速度當(dāng)然快。反復(fù)執(zhí)行的動(dòng)態(tài)SQL,可以使用臨時(shí)存儲(chǔ)過程,該過程(臨時(shí)表)被放在Tempdb中。以前由于SQLSERVER對(duì)復(fù)雜的數(shù)學(xué)計(jì)算不支持,所以不得不將這個(gè)工作放在其他的層上而增加網(wǎng)絡(luò)的開銷。SQL2000支持UDFs,現(xiàn)在支持復(fù)雜的數(shù)學(xué)計(jì)算,函數(shù)的返回值不要太大,這樣的開銷很大。用戶自定義函數(shù)象光標(biāo)一樣執(zhí)行的消耗大量的資源,如果返回大的結(jié)果采用存儲(chǔ)過程
27、不要在一句話里再三的使用相同的函數(shù),浪費(fèi)資源,將結(jié)果放在變量里再調(diào)用更快
28、SELECTCOUNT(*)的效率教低,盡量變通他的寫法,而EXISTS快.同時(shí)請(qǐng)注意區(qū)別:selectcount(Fieldofnull)fromTable和selectcount(FieldofNOTnull)fromTable的返回值是不同的!?。?/p>
29、當(dāng)服務(wù)器的內(nèi)存夠多時(shí),配制線程數(shù)量=最大連接數(shù)+5,這樣能發(fā)揮最大的效率;否則使用配制線程數(shù)量<最大連接數(shù)啟用SQLSERVER的線程池來解決,如果還是數(shù)量=最大連接數(shù)+5,嚴(yán)重的損害服務(wù)器的性能。
30、按照一定的次序來訪問你的表。如果你先鎖住表A,再鎖住表B,那么在所有的存儲(chǔ)過程中都要按照這個(gè)順序來鎖定它們。如果你(不經(jīng)意的)某個(gè)存儲(chǔ)過程中先鎖定表B,再鎖定表A,這可能就會(huì)導(dǎo)致一個(gè)死鎖。如果鎖定順序沒有被預(yù)先詳細(xì)的設(shè)計(jì)好,死鎖很難被發(fā)現(xiàn)
31、通過SQLServerPerformanceMonitor監(jiān)視相應(yīng)硬件的負(fù)載Memory:PageFaults/sec計(jì)數(shù)器如果該值偶爾走高,表明當(dāng)時(shí)有線程競爭內(nèi)存。如果持續(xù)很高,則內(nèi)存可能是瓶頸。
Process:
1、%DPCTime指在范例間隔期間處理器用在緩延程序調(diào)用(DPC)接收和提供服務(wù)的百分比。(DPC正在運(yùn)行的為比標(biāo)準(zhǔn)間隔優(yōu)先權(quán)低的間隔)。由于DPC是以特權(quán)模式執(zhí)行的,DPC時(shí)間的百分比為特權(quán)時(shí)間百分比的一部分。這些時(shí)間單獨(dú)計(jì)算并且不屬于間隔計(jì)算總數(shù)的一部分。這個(gè)總數(shù)顯示了作為實(shí)例時(shí)間百分比的平均忙時(shí)。
2、%ProcessorTime計(jì)數(shù)器如果該參數(shù)值持續(xù)超過95%,表明瓶頸是CPU。可以考慮增加一個(gè)處理器或換一個(gè)更快的處理器。
3、%PrivilegedTime指非閑置處理器時(shí)間用于特權(quán)模式的百分比。(特權(quán)模式是為操作系統(tǒng)組件和操縱硬件驅(qū)動(dòng)程序而設(shè)計(jì)的一種處理模式。它允許直接訪問硬件和所有內(nèi)存。另一種模式為用戶模式,它是一種為應(yīng)用程序、環(huán)境分系統(tǒng)和整數(shù)分系統(tǒng)設(shè)計(jì)的一種有限處理模式。操作系統(tǒng)將應(yīng)用程序線程轉(zhuǎn)換成特權(quán)模式以訪問操作系統(tǒng)服務(wù))。特權(quán)時(shí)間的%包括為間斷和DPC提供服務(wù)的時(shí)間。特權(quán)時(shí)間比率高可能是由于失敗設(shè)備產(chǎn)生的大數(shù)量的間隔而引起的。這個(gè)計(jì)數(shù)器將平均忙時(shí)作為樣本時(shí)間的一部分顯示。
4、%UserTime表示耗費(fèi)CPU的數(shù)據(jù)庫操作,如排序,執(zhí)行aggregatefunctions等。如果該值很高,可考慮增加索引,盡量使用簡單的表聯(lián)接,水平分割大表格等方法來降低該值。PhysicalDisk:CurretnDiskQueueLength計(jì)數(shù)器該值應(yīng)不超過磁盤數(shù)的1.5~2倍。要提高性能,可增加磁盤。SQLServer:CacheHitRatio計(jì)數(shù)器該值越高越好。如果持續(xù)低于80%,應(yīng)考慮增加內(nèi)存。注意該參數(shù)值是從SQLServer啟動(dòng)后,就一直累加記數(shù),所以運(yùn)行經(jīng)過一段時(shí)間后,該值將不能反映系統(tǒng)當(dāng)前值。
32、分析selectemp_nameformemployeewheresalary>3000在此語句中若salary是Float類型的,則優(yōu)化器對(duì)其進(jìn)行優(yōu)化為Convert(float,3000),因?yàn)?000是個(gè)整數(shù),我們應(yīng)在編程時(shí)使用3000.0而不要等運(yùn)行時(shí)讓DBMS進(jìn)行轉(zhuǎn)化。同樣字符和整型數(shù)據(jù)的轉(zhuǎn)換。
33、查詢的關(guān)聯(lián)同寫的順序
selecta.personMemberID,*fromchineseresumea,personmemberbwherepersonMemberID
=b.referenceidanda.personMemberID='JCNPRH39681'(A=B,B='號(hào)碼')
selecta.personMemberID,*fromchineseresumea,personmemberbwhere
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版建筑材料購銷合同書模板
- 二零二五年度臺(tái)球室租賃及品牌形象合作合同3篇
- 2025購銷合同常用文本
- 二零二五年度全新租賃房屋合同住宅押金退還管理協(xié)議3篇
- 2025年度全新出售房屋買賣貸款擔(dān)保合同3篇
- 2025年度年度全新高空纜車運(yùn)營意外事故免責(zé)服務(wù)協(xié)議3篇
- 二零二五年度智慧社區(qū)建設(shè)與運(yùn)營管理協(xié)議合同范文2篇
- 2025年農(nóng)村兄弟分家協(xié)議及遺產(chǎn)分配執(zhí)行方案
- 2025年度養(yǎng)殖場勞務(wù)合同(養(yǎng)殖場安全生產(chǎn)監(jiān)管)3篇
- 二零二五年度創(chuàng)業(yè)投資股權(quán)代持專項(xiàng)合同2篇
- 《特種設(shè)備重大事故隱患判定準(zhǔn)則》知識(shí)培訓(xùn)
- 山東省棗莊市滕州市2023-2024學(xué)年高二上學(xué)期期末考試政治試題 含答案
- 《外盤期貨介紹》課件
- 2024年07月11396藥事管理與法規(guī)(本)期末試題答案
- 《PMC培訓(xùn)資料》課件
- 2025年初級(jí)社會(huì)工作者綜合能力全國考試題庫(含答案)
- 企業(yè)發(fā)展培訓(xùn)
- 江蘇省徐州市2023-2024學(xué)年高一上學(xué)期1月期末抽測(cè)試題 化學(xué) 含答案
- 軍事理論-綜合版智慧樹知到期末考試答案章節(jié)答案2024年國防大學(xué)
- 2024年時(shí)事政治熱點(diǎn)題庫200道含完整答案(必刷)
- 叉車日常使用狀況點(diǎn)檢記錄表(日常檢查記錄)
評(píng)論
0/150
提交評(píng)論