資源描述:
《Sqlserver SQL性能優(yōu)化經(jīng)驗.doc》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、SqlserverSQL性能優(yōu)化經(jīng)驗1.選擇最有效率的表名順序(只在基于規(guī)則的優(yōu)化器中有效) SQLSERVER的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最后的表(基礎表drivingtable)將被最先處理,在FROM子句中包含多個表的情況下,必須選擇記錄條數(shù)最少的表作為基礎表,當SQLSERVER處理多個表時,會運用排序及合并的方式連接它們, 首先,掃描第一個表(FROM子句中最后的那個表)并對記錄進行排序;然后掃描第二個表(FROM子句中最后第二個表);最后將所有從
2、第二個表中檢索出的記錄與第一個表中合適記錄進行合并 例如:表TAB116,384條記錄表TAB25條記錄,選擇TAB2作為基礎表(最好的方法)selectcount(*)fromtab1,tab2執(zhí)行時間0.96秒,選擇TAB2作為基礎表(不佳的方法)selectcount(*)fromtab2,tab1執(zhí)行時間26.09秒;如果有3個以上的表連接查詢,那就需要選擇交叉表(intersectiontable)作為基礎表,交叉表是指那個被其他表所引用的表 例如: EMP表描述了LOCATION表和CAT
3、EGORY表的交集 SELECT* FROMLOCATIONL, CATEGORYC, EMPE WHEREE.EMP_NOBETWEEN1000AND2000 ANDE.CAT_NO=C.CAT_NO ANDE.LOCN=L.LOCN 將比下列SQL更有效率 SELECT* FROMEMPE, LOCATIONL, CATEGORYC WHEREE.CAT_NO=C.CAT_NO ANDE.LOCN=L.LOCN ANDE.EMP_NOBETWEEN1000AND2000
4、2.WHERE子句中的連接順序 SQLSERVER采用自下而上的順序解析WHERE子句,根據(jù)這個原理,表之間的連接必須寫在其他WHERE條件之前,那些可以過濾掉最大數(shù)量記錄的條件必須寫在WHERE子句的末尾 例如: (低效,執(zhí)行時間156.3秒) SELECT* FROMEMPE WHERESAL>50000 ANDJOB=’MANAGER’ AND25<(SELECTCOUNT(*)FROMEMPWHEREMGR=E.EMPNO); (高效,執(zhí)行時間10.6秒) SELECT*
5、 FROMEMPE WHERE25<(SELECTCOUNT(*)FROMEMPWHEREMGR=E.EMPNO) ANDSAL>50000 ANDJOB=’MANAGER’; 3.SELECT子句中避免使用’*’。當你想在SELECT子句中列出所有的COLUMN時,使用動態(tài)SQL列引用’*’是一個方便的方法,不幸的是,這是一個非常低效的方法。實際上,SQLSERVER在解析的過程中,會將’*’依次轉(zhuǎn)換成所有的列名,這個工作是通過查詢數(shù)據(jù)字典完成的,這意味著將耗費更多的時間 4.減少訪問數(shù)據(jù)庫的次數(shù)
6、。當執(zhí)行每條SQL語句時,SQLSERVER在內(nèi)部執(zhí)行了許多工作:解析SQL語句,估算索引的利用率,綁定變量,讀數(shù)據(jù)塊等等 由此可見,減少訪問數(shù)據(jù)庫的次數(shù),就能實際上減少SQLSERVER的工作量,例如: 以下有三種方法可以檢索出雇員號等于0342或0291的職員 方法1(最低效) SELECTEMP_NAME,SALARY,GRADE FROMEMP WHEREEMP_NO=342; SELECTEMP_NAME,SALARY,GRADE FROMEMP WHEREEMP_NO=291;
7、 方法2(次低效) DECLARE CURSORC1(E_NONUMBER)IS SELECTEMP_NAME,SALARY,GRADE FROMEMP WHEREEMP_NO=E_NO; BEGIN OPENC1(342); FETCHC1INTO…,…,…; … OPENC1(291); FETCHC1INTO…,…,…; … CLOSEC1; END; 方法2(高效) SELECTA.EMP_NAME,A.SALARY,A.GRADE, B.EMP_NAME,B
8、.SALARY,B.GRADE FROMEMPA,EMPB WHEREA.EMP_NO=342 ANDB.EMP_NO=291; 5.使用DECODE函數(shù)來減少處理時間 使用DECODE函數(shù)可以避免重復掃描相同記錄或重復連接相同的表 例如: SELECTCOUNT(*),SUM(SAL) FROMEMP WHEREDEPT_NO=’0020’ ANDENAM