版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
轉(zhuǎn)載--如何提高數(shù)據(jù)庫的查詢效率
1、用Profiler來跟蹤查詢,得到查詢所需的時間,找出SQL的問題所在;用索引優(yōu)化器優(yōu)化索引
2、注意UNion和UNionall的區(qū)別。UNIONall好
3、注意使用DISTINCT,在沒有必要時不要用,它同UNION一樣會使查詢變慢。重復(fù)的記錄在查詢里是沒有問題的
4、查詢時不要返回不需要的行、列
5、用sp_configure'querygovernorcostlimit'或者SETQUERY_GOVERNOR_COST_LIMIT來限制查詢消耗的資源。當評估查詢消耗的資源超出限制時,服務(wù)器自動取消查詢,在查詢之前就扼殺掉。SETLOCKTIME設(shè)置鎖的時間
6、用selecttop100/10Percent來限制用戶返回的行數(shù)或者SETROWCOUNT來限制操作的行
7、在SQL2000以前,一般不要用如下的字句:"ISNULL","<>","!=","!>","!<","NOT","NOTEXISTS","NOTIN","NOTLIKE",and"LIKE'%500'",因為他們不走索引全是表掃描。也不要在WHere字句中的列名加函數(shù),如Convert,substring等,如果必須用函數(shù)的時候,創(chuàng)建計算列再創(chuàng)建索引來替代.還可以變通寫法:WHERESUBSTRING(firstname,1,1)='m'改為WHEREfirstnamelike'm%'(索引掃描),一定要將函數(shù)和列名分開。并且索引不能建得太多和太大。NOTIN會多次掃描表,使用EXISTS、NOTEXISTS,IN,LEFTOUTERJOIN來替代,特別是左連接,而Exists比IN更快,最慢的是NOT操作.如果列的值含有空,以前它的索引不起作用,現(xiàn)在2000的優(yōu)化器能夠處理了。相同的是ISNULL,"NOT","NOTEXISTS","NOTIN"能優(yōu)化她,而"<>"等還是不能優(yōu)化,用不到索引。
8、使用QueryAnalyzer,查看SQL語句的查詢計劃和評估分析是否是優(yōu)化的SQL。一般的20%的代碼占據(jù)了80%的資源,我們優(yōu)化的重點是這些慢的地方。
9、如果使用了IN或者OR等時發(fā)現(xiàn)查詢沒有走索引,使用顯示申明指定索引:
SELECT*FROMPersonMember(INDEX=IX_Title)WHEREprocessidIN('男','女')
10、將需要查詢的結(jié)果預(yù)先計算好放在表中,查詢的時候再SELECT。這在SQL7.0以前是最重要的手段。例如醫(yī)院的住院費計算。
11、MIN()和MAX()能使用到合適的索引。
12、數(shù)據(jù)庫有一個原則是代碼離數(shù)據(jù)越近越好,所以優(yōu)先選擇Default,依次為Rules,Triggers,Constraint(約束如外健主健CheckUNIQUE……,數(shù)據(jù)類型的最大長度等等都是約束),Procedure.這樣不僅維護工作小,編寫程序質(zhì)量高,并且執(zhí)行的速度快。
13、如果要插入大的二進制值到Image列,使用存儲過程,千萬不要用內(nèi)嵌INsert來插入(不知JAVA是否)。因為這樣應(yīng)用程序首先將二進制值轉(zhuǎn)換成字符串(尺寸是它的兩倍),服務(wù)器受到字符后又將他轉(zhuǎn)換成二進制值.存儲過程就沒有這些動作:方法:
Createprocedurep_insertasinsertintotable(Fimage)values(@image)
在前臺調(diào)用這個存儲過程傳入二進制參數(shù),這樣處理速度明顯改善。
14、Between在某些時候比IN速度更快,Between能夠更快地根據(jù)索引找到范圍。用查詢優(yōu)化器可見到差別。
select*fromchineseresumewheretitlein('男','女')
Select*fromchineseresumewheretitlebetween'男'and'女'
是一樣的。由于in會在比較多次,所以有時會慢些。
15、在必要是對全局或者局部臨時表創(chuàng)建索引,有時能夠提高速度,但不是一定會這樣,因為索引也耗費大量的資源。他的創(chuàng)建同是實際表一樣。
16、不要建沒有作用的事物例如產(chǎn)生報表時,浪費資源。只有在必要使用事物時使用它。
17、用OR的字句可以分解成多個查詢,并且通過UNION連接多個查詢。他們的速度只同是否使用索引有關(guān),如果查詢需要用到聯(lián)合索引,用UNIONall執(zhí)行的效率更高.多個OR的字句沒有用到索引,改寫成UNION的形式再試圖與索引匹配。一個關(guān)鍵的問題是否用到索引。
18、盡量少用視圖,它的效率低。對視圖操作比直接對表操作慢,可以用storedprocedure來代替她。特別的是不要用視圖嵌套,嵌套視圖增加了尋找原始資料的難度。我們看視圖的本質(zhì):它是存放在服務(wù)器上的被優(yōu)化好了的已經(jīng)產(chǎn)生了查詢規(guī)劃的SQL。對單個表檢索數(shù)據(jù)時,不要使用指向多個表的視圖,直接從表檢索或者僅僅包含這個表的視圖上讀,否則增加了不必要的開銷,查詢受到干擾.為了加快視圖的查詢,MsSQL增加了視圖索引的功能。
19、沒有必要時不要用DISTINCT和ORDERBY,這些動作可以改在客戶端執(zhí)行。它們增加了額外的開銷。這同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、當用SELECTINTO時,它會鎖住系統(tǒng)表(sysobjects,sysindexes等等),阻塞其他的連接的存取。創(chuàng)建臨時表時用顯示申明語句,而不是
selectINTO.droptablet_lxhbegintranselect*intot_lxhfromchineseresume
wherename='XYZ'--commit
在另一個連接中SELECT*fromsysobjects可以看到SELECTINTO會鎖住系統(tǒng)表,Createtable也會鎖系統(tǒng)表(不管是臨時表還是系統(tǒng)表)。所以千萬不要在事務(wù)內(nèi)使用它?。。∵@樣的話如果是經(jīng)常要用的臨時表請使用實表,或者臨時表變量。
22、一般在GROUPBY個HAVING字句之前就能剔除多余的行,所以盡量不要用它們來做剔除行的工作。他們的執(zhí)行順序應(yīng)該如下最優(yōu):select的Where字句選擇所有合適的行,GroupBy用來分組個統(tǒng)計行,Having字句用來剔除多余的分組。這樣GroupBy個Having的開銷小,查詢快.對于大的數(shù)據(jù)行進行分組和Having十分消耗資源。如果GroupBY的目的不包括計算,只是分組,那么用Distinct更快
23、一次更新多條記錄比分多次更新每次一條快,就是說批處理好
24、少用臨時表,盡量用結(jié)果集和Table類性的變量來代替它,Table類型的變量比臨時表好
25、在SQL2000下,計算字段是可以索引的,需要滿足的條件如下:
a、計算字段的表達是確定的
b、不能用在TEXT,Ntext,Image數(shù)據(jù)類型
c、必須配制如下選項ANSI_NULLS=ON,ANSI_PADDINGS=ON,…….
26、盡量將數(shù)據(jù)的處理工作放在服務(wù)器上,減少網(wǎng)絡(luò)的開銷,如使用存儲過程。存儲過程是編譯好、優(yōu)化過、并且被組織到一個執(zhí)行規(guī)劃里、且存儲在數(shù)據(jù)庫中的SQL語句,是控制流語言的集合,速度當然快。反復(fù)執(zhí)行的動態(tài)SQL,可以使用臨時存儲過程,該過程(臨時表)被放在Tempdb中。以前由于SQLSERVER對復(fù)雜的數(shù)學計算不支持,所以不得不將這個工作放在其他的層上而增加網(wǎng)絡(luò)的開銷。SQL2000支持UDFs,現(xiàn)在支持復(fù)雜的數(shù)學計算,函數(shù)的返回值不要太大,這樣的開銷很大。用戶自定義函數(shù)象光標一樣執(zhí)行的消耗大量的資源,如果返回大的結(jié)果采用存儲過程
27、不要在一句話里再三的使用相同的函數(shù),浪費資源,將結(jié)果放在變量里再調(diào)用更快
28、SELECTCOUNT(*)的效率教低,盡量變通他的寫法,而EXISTS快.同時請注意區(qū)別:selectcount(Fieldofnull)fromTable和selectcount(FieldofNOTnull)fromTable的返回值是不同的?。?!
29、當服務(wù)器的內(nèi)存夠多時,配制線程數(shù)量=最大連接數(shù)+5,這樣能發(fā)揮最大的效率;否則使用配制線程數(shù)量<最大連接數(shù)啟用SQLSERVER的線程池來解決,如果還是數(shù)量=最大連接數(shù)+5,嚴重的損害服務(wù)器的性能。
30、按照一定的次序來訪問你的表。如果你先鎖住表A,再鎖住表B,那么在所有的存儲過程中都要按照這個順序來鎖定它們。如果你(不經(jīng)意的)某個存儲過程中先鎖定表B,再鎖定表A,這可能就會導(dǎo)致一個死鎖。如果鎖定順序沒有被預(yù)先詳細的設(shè)計好,死鎖很難被發(fā)現(xiàn)
31、通過SQLServerPerformanceMonitor監(jiān)視相應(yīng)硬件的負載Memory:PageFaults/sec計數(shù)器如果該值偶爾走高,表明當時有線程競爭內(nèi)存。如果持續(xù)很高,則內(nèi)存可能是瓶頸。
Process:
1、%DPCTime指在范例間隔期間處理器用在緩延程序調(diào)用(DPC)接收和提供服務(wù)的百分比。(DPC正在運行的為比標準間隔優(yōu)先權(quán)低的間隔)。由于DPC是以特權(quán)模式執(zhí)行的,DPC時間的百分比為特權(quán)時間百分比的一部分。這些時間單獨計算并且不屬于間隔計算總數(shù)的一部分。這個總數(shù)顯示了作為實例時間百分比的平均忙時。
2、%ProcessorTime計數(shù)器如果該參數(shù)值持續(xù)超過95%,表明瓶頸是CPU??梢钥紤]增加一個處理器或換一個更快的處理器。
3、%PrivilegedTime指非閑置處理器時間用于特權(quán)模式的百分比。(特權(quán)模式是為操作系統(tǒng)組件和操縱硬件驅(qū)動程序而設(shè)計的一種處理模式。它允許直接訪問硬件和所有內(nèi)存。另一種模式為用戶模式,它是一種為應(yīng)用程序、環(huán)境分系統(tǒng)和整數(shù)分系統(tǒng)設(shè)計的一種有限處理模式。操作系統(tǒng)將應(yīng)用程序線程轉(zhuǎn)換成特權(quán)模式以訪問操作系統(tǒng)服務(wù))。特權(quán)時間的%包括為間斷和DPC提供服務(wù)的時間。特權(quán)時間比率高可能是由于失敗設(shè)備產(chǎn)生的大數(shù)量的間隔而引起的。這個計數(shù)器將平均忙時作為樣本時間的一部分顯示。
4、%UserTime表示耗費CPU的數(shù)據(jù)庫操作,如排序,執(zhí)行aggregatefunctions等。如果該值很高,可考慮增加索引,盡量使用簡單的表聯(lián)接,水平分割大表格等方法來降低該值。PhysicalDisk:CurretnDiskQueueLength計數(shù)器該值應(yīng)不超過磁盤數(shù)的1.5~2倍。要提高性能,可增加磁盤。SQLServer:CacheHitRatio計數(shù)器該值越高越好。如果持續(xù)低于80%,應(yīng)考慮增加內(nèi)存。注意該參數(shù)值是從SQLServer啟動后,就一直累加記數(shù),所以運行經(jīng)過一段時間后,該值將不能反映系統(tǒng)當前值。
32、分析selectemp_nameformemployeewheresalary>3000在此語句中若salary是Float類型的,則優(yōu)化器對其進行優(yōu)化為Convert(float,3000),因為3000是個整數(shù),我們應(yīng)在編程時使用3000.0而不要等運行時讓DBMS進行轉(zhuǎn)化。同樣字符和整型數(shù)據(jù)的轉(zhuǎn)換。
33、查詢的關(guān)聯(lián)同寫的順序
selecta.personMemberID,*fromchineseresumea,personmemberbwherepersonMemberID
=b.referenceidanda.personMemberID='JCNPRH39681'(A=B,B='號碼')
selecta.personMemberID,*fromchineseresumea,personmemberbwhere
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024盆景出租合同
- 04設(shè)備采購合同關(guān)于醫(yī)療設(shè)備的復(fù)雜協(xié)議
- 高效委托加工合同協(xié)議書范本
- 2024年簡單個人借款合同
- 2024寵物買賣合同范本模板
- 設(shè)備回購協(xié)議合同模板2024年
- 品牌旗艦店合作合同樣本
- 2024年度云計算平臺建設(shè)合同
- 個人門面買賣合同范本
- 2024年冷凍供貨合同
- 隨動曲軸磨床
- PurchaseOrder模板
- 施工進度計劃-橫道圖
- 清產(chǎn)核資基礎(chǔ)報表(模板)
- 垂直循環(huán)立體車庫設(shè)計
- 三年級語文家長會(課堂PPT)
- 氫氧化鈉標準溶液的配制和標定.
- 供貨保障方案及措施兩篇范文
- 金屬構(gòu)件失效分析精簡版
- 雷諾爾JJR系列軟起動器說明書
- 中國聯(lián)通GPON設(shè)備技術(shù)規(guī)范
評論
0/150
提交評論