freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

oracle-sql性能優(yōu)化-wenkub

2023-07-08 19:08:14 本頁面
 

【正文】 ERE NVL(‘X’,) = NVL(‘X’,(+))AND NVL(‘X’,) = NVL(‘X’,(+))AND NVL(‘X’,) = NVL(‘X’,(+))AND (+) = 1234AND (+) = 10AND (+) = ‘RD’。 你可以用DECODE函數(shù)高效地得到相同結(jié)果 SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT,COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT,SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SALFROM EMP WHERE ENAME LIKE ‘SMITH%’。END。FETCH C1 INTO …,..,.. 。 6. SELECT子句中避免使用 ‘ * ‘當(dāng)你想在SELECT子句中列出所有的COLUMN時(shí),使用動(dòng)態(tài)SQL列引用 ‘*’ ,這是一個(gè)非常低效的方法. 實(shí)際上,ORACLE在解析的過程中, 會(huì)將’*’ 依次轉(zhuǎn)換成所有的列名, 這個(gè)工作是通過查詢數(shù)據(jù)字典完成的, 這意味著將耗費(fèi)更多的時(shí)間. 7. 減少訪問數(shù)據(jù)庫的次數(shù)當(dāng)執(zhí)行每條SQL語句時(shí), ORACLE在內(nèi)部執(zhí)行了許多工作: 解析SQL語句, 估算索引的利用率, 綁定變量 , 讀數(shù)據(jù)塊等等. 由此可見, 減少訪問數(shù)據(jù)庫的次數(shù) , 就能實(shí)際上減少ORACLE的工作量. 例如,以下有三種方法可以檢索出雇員號(hào)等于0342或0291的職員. 方法1 (最低效)SELECT EMP_NAME , SALARY , GRADEFROM EMPWHERE EMP_NO = 342。 b.select pin , name from people where pin = :。不能每個(gè)用戶都有一個(gè)private synonym sal_limit , 它們是不同的對(duì)象select count(*0 from work_city where sdesc like 39。和下列每一個(gè)都不同SELECT * from EMP。Select * From Emp。NEW%39。select pin , name from people where pin = :。 SELECT EMP_NAME , SALARY , GRADEFROM EMPWHERE EMP_NO = 291?!?.OPEN C1(291)。 方法3 (高效) SELECT , , , , , FROM EMP A,EMP BWHERE = 342AND = 291。 類似的,DECODE函數(shù)也可以運(yùn)用于GROUP BY 和ORDER BY子句中. 9. 整合簡(jiǎn)單,無關(guān)聯(lián)的數(shù)據(jù)庫訪問 如果你有幾個(gè)簡(jiǎn)單的數(shù)據(jù)庫查詢語句,你可以把它們整合到一個(gè)查詢中(即使它們之間沒有關(guān)系)例如: SELECT NAMEFROM EMPWHERE EMP_NO = 1234。 (譯者按: 雖然采取這種方法,效率得到提高,但是程序的可讀性大大降低,所以讀者 還是要權(quán)衡之間的利弊) 10. 刪除重復(fù)記錄最高效的刪除重復(fù)記錄方法 ( 因?yàn)槭褂昧薘OWID) DELETE FROM EMP EWHERE (SELECT MIN()FROM EMP XWHERE = )。 通過調(diào)用下面的函數(shù)可以提高效率.FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2ASTDESC VARCHAR2(30)。CLOSE C1。CURSOR C1 ISSELECT ENAMEFROM EMPWHERE EMPNO=EMP。RETURN (NVL(ENAME,’?’))。 (更高效)SELECT ENAMEFROM DEPT D,EMP EWHERE = AND DEPT_CAT = ‘A’ 。 /*traceonly 可以不顯示執(zhí)行結(jié)果*/或者SQL set autotrace traceonly exp。DEPT39。EMP39。DEPT39。 WHERE子句條件包括一系列值, ORACLE將通過索引范圍查詢的方式查詢LODGING_PK . 由于索引范圍查詢將返回一組值, 它的效率就要比索引唯一掃描低一些. 例2: SELECT LODGINGFROM LODGINGWHERE MANAGER = ‘BILL GATES’。這里,DEPTNO索引將被最先檢索,然后同EMP_CAT索引檢索出的記錄進(jìn)行合并. 執(zhí)行路徑如下: TABLE ACCESS BY ROWID ON EMPANDEQUALINDEX RANGE SCAN ON DEPT_IDXINDEX RANGE SCAN ON CAT_IDX 29. 等式比較和范圍比較當(dāng)WHERE子句中有索引列, ORACLE不能合并它們,ORACLE將用范圍比較. 舉例:DEPTNO上有一個(gè)非唯一性索引,EMP_CAT也有一個(gè)非唯一性索引.SELECT ENAMEFROM EMPWHERE DEPTNO 20AND EMP_CAT = ‘A’。 INDEX_NAME UNIQUENES EMPNO UNIQUEEMPTYPE NONUNIQUE SQL select * from emp where empno = 2 and emp_type = 39。EMP39。 優(yōu)化器會(huì)注意到EMP_TYPE上的索引并使用它. 這是目前唯一的選擇. 如果,一段時(shí)間以后, 另一個(gè)非唯一性建立在EMP_CLASS上,優(yōu)化器必須對(duì)兩個(gè)索引進(jìn)行選擇,在通常情況下,優(yōu)化器將使用兩個(gè)索引并在他們的結(jié)果集合上執(zhí)行排序及合并. 然而,如果其中一個(gè)索引(EMP_TYPE)接近于唯一性而另一個(gè)索引(EMP_CLASS)上有幾千個(gè)重復(fù)的值. 排序及合并就會(huì)成為一種不必要的負(fù)擔(dān). 在這種情況下,你希望使優(yōu)化器屏蔽掉EMP_CLASS索引.用下面的方案就可以解決問題.SELECT ENAMEFROM EMPWHERE EMP_TYPE = ‘A’AND EMP_CLASS||’’ = ‘X’。 這里,只有EMPNO上的索引是唯一性的,所以EMPNO索引將用來檢索記錄.TABLE ACCESS BY ROWID ON EMPINDEX UNIQUE SCAN ON EMP_NO_IDX 34. 避免在索引列上使用NOT通常, 我們要避免在索引列上使用NOT, NOT會(huì)產(chǎn)生在和在索引列上使用函數(shù)相同的影響. 當(dāng)ORACLE”遇到”NOT,他就會(huì)停止使用索引轉(zhuǎn)而執(zhí)行全表掃描.舉例: 低效: (這里,不使用索引) SELECT …FROM DEPTWHERE DEPT_CODE NOT = 0。EMP39。no rows selectedExecution Plan0 SELECT STATEMENT Optimizer=CHOOSE1 0 TABLE ACCESS (BY INDEX ROWID) OF 39。 (UNIQUE) 兩者的效率完全一樣,也許這符合作者關(guān)于” 在某些時(shí)候, ORACLE優(yōu)化器會(huì)自動(dòng)將NOT轉(zhuǎn)化成相對(duì)應(yīng)的關(guān)系操作符” 的觀點(diǎn). 35. 用=替代 如果DEPTNO上有一個(gè)索引, 高效: SELECT *FROM EMPWHERE DEPTNO =4 低效: SELECT *FROM EMPWHERE DEPTNO 3 兩者的區(qū)別在于, 前者DBMS將直接跳到第一個(gè)DEPT等于4的記錄而后者將首先定位到DEPTNO=3的記錄并且向前掃描到第一個(gè)DEPT大于3的記錄.ORACLE SQL性能優(yōu)化系列 (十一) 36. 用UNION替換OR (適用于索引列)通常情況下, 用UNION替換WHERE子句中的OR將會(huì)起到較好的效果. 對(duì)索引列使用OR將造成全表掃描. 注意, 以上規(guī)則只針對(duì)多個(gè)索引列有效. 如果有column沒有被索引, 查詢效率可能會(huì)因?yàn)槟銢]有選擇OR而降低.在下面的例子中, LOC_ID 和REGION上都建有索引.高效:SELECT LOC_ID , LOC_DESC , REGIONFROM LOCATIONWHERE LOC_ID = 10UNIONSELECT LOC_ID , LOC_DESC , REGIONFROM LOCATIONWHERE REGION = “MELBOURNE” 低效:SELECT LOC_ID , LOC_DESC , REGIONFROM LOCATIONWHERE LOC_ID = 10 OR REGION = “MELBOURNE” 如果你堅(jiān)持要用OR, 那就需要返回記錄最少的索引列寫在最前面. 注意: WHERE KEY1 = 10 (返回最少記錄)OR KEY2 = 20 (返回最多記錄) ORACLE 內(nèi)部將以上轉(zhuǎn)換為WHERE KEY1 = 10 AND((NOT KEY1 = 10) AND KEY2 = 20) 譯者按: 下面的測(cè)試數(shù)據(jù)僅供參考: (a = 1003 返回一條記錄 , b = 1 返回1003條記錄)SQL select * from unionvsor /*1st test*/2 where a = 1003 or b = 1。UB39。UA39。3 2 INDEX (RANGE SCAN) OF 39。5 4 INDEX (RANGE SCAN) OF 39。UNIONVSOR39。UNIONVSOR39。 譯者按:這是一條簡(jiǎn)單易記的規(guī)則,但是實(shí)際的執(zhí)行效果還須檢驗(yàn),在ORACLE8i下,兩者的執(zhí)行路徑似乎是相同的.  38. 避免在索引列上使用IS NULL和IS NOT NULL避免在索引中使用任何可以為空的列,ORACLE將無法使用該索引.對(duì)于單列索引,如果列包含空值,索引中將不存在此記錄. 對(duì)于復(fù)合索引,如果每個(gè)列都為空,索引中同樣不存在此記錄. 如果至少有一個(gè)列不為空,則記錄存在于索引中.舉例:如果唯一性索引建立在表的A列和B列上, 并且表中存在一條記錄的A,B值為(123,null) , ORACLE將不接受下一條具有相同A,B值(123,null)的記錄(插入). 然而如果所有的索引列都為空,ORACLE將認(rèn)為整個(gè)鍵值為空而空不等于空. 因此你可以插入1000條具有相同鍵值的記錄,當(dāng)然它們都是空! 因?yàn)榭罩挡淮嬖谟谒饕兄?所以WHERE子句中對(duì)索引列進(jìn)行空值比較將使ORACLE停用該索引.舉例: 低效: (索引失效)SELECT …FROM DEPARTMENTWHERE DEPT_CODE IS NOT NULL。Index created.SQL set autotrace traceonly SQL select * from multiindexusage where inda = 1。MULTINDEX39。 很明顯, 當(dāng)僅引用索引的第二個(gè)列時(shí),優(yōu)化器使用了全表掃描而忽略了索引 40. ORACLE內(nèi)部操作當(dāng)執(zhí)行查詢時(shí),ORACLE采用了內(nèi)部的操作. 下表顯示了幾種重要的內(nèi)部操作.ORACLE Clause內(nèi)部操作ORDER BYSORT ORDER BYUNIONUNIONALLMINUSMINUSINTERSECTINTERSECTDISTINCT,MINUS,INTERSECT,UNIONSORT UNIQUEMIN,MAX,COUNTSORT AGGREGATEGROUP BYSORT GROUP BYROWNUMCOUNT or COUNT STOPKEYQueries involving JoinsSORT JOIN,MERGE JOIN,NESTED LOOPSCONNECT BYCONNECT BY 41. 用UNIONALL 替換UNION ( 如果有可能的話) 當(dāng)SQL語句需要UNION兩個(gè)查詢結(jié)果集合時(shí),這兩個(gè)結(jié)果集合會(huì)以UNIONALL的方式被合并, 然后在輸出最終結(jié)果前進(jìn)行排序.如果用UNION ALL替代UNION,
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1