in 以及 not in 在SQL中是非常沒
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的固原網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
有效率的,應(yīng)該改用 exists 和 not exists 代替
給你一個(gè)使用exists的例句,你自己轉(zhuǎn)換一下
SELECT * FROM EMP (基礎(chǔ)表)
WHERE EMPNO 0 AND EXISTS (SELECT ‘X'
FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO
AND LOC = ‘MELB')
1:在plsql中按F5可以看SQL的執(zhí)行計(jì)劃
2:查系統(tǒng)視圖可以查看某個(gè)SQL的實(shí)際消耗
不一定的。
要看執(zhí)行計(jì)劃,具體的說就是表內(nèi)行數(shù),索引情況等。
另外這兩個(gè)語(yǔ)句的執(zhí)行結(jié)果并不一致,第一個(gè)sql 會(huì)更新t1中所有記錄,在 emp b中無符合條件的更新為null ,第二個(gè)語(yǔ)句只更新 滿足 exists (select 0 from emp c where c.ename = a.ename) 條件的記錄。
如果你用的是oracle 10g的話,這個(gè)有種很簡(jiǎn)單的方法就是查看awr報(bào)告。
很簡(jiǎn)單,你登陸到服務(wù)器的操作系統(tǒng),進(jìn)入到$ORACLE_HOME/rdbms/admin目錄下。然后sqlplus "/as sysdba"登陸到數(shù)據(jù)庫(kù),執(zhí)行
@awrrpt.sql;
然后按照提示一步一步做,注意格式選html(這樣方便你閱讀)。最后會(huì)讓你命名這個(gè)文件。
完了之后,你把那個(gè)文件拷貝到本地用IE打開就看到了。里面有很詳細(xì)的,包括這段時(shí)間占CPU,IO,等等最嚴(yán)重的SQL排行。很好很強(qiáng)大。
-------------------------
至于你說查看當(dāng)前的sql,你在v$session里查看長(zhǎng)期blocking別人的session ID,然后根據(jù)這個(gè)session id從v$text里就能查到這個(gè)sql了。
-------------------------
很明確了吧
比較一下的話,語(yǔ)句一查詢次數(shù)是兩次,而語(yǔ)句二只有一次,我們盡量減少查詢次數(shù)。
語(yǔ)句一其實(shí)就是二的另一種實(shí)現(xiàn),其效果是和語(yǔ)句一相同,但多了很多中間不必要的步驟,所以肯定優(yōu)先選擇二。
至于SQL效率問題多看看別人總結(jié)的經(jīng)驗(yàn)會(huì)很快了解,多看執(zhí)行計(jì)劃。
查看執(zhí)行計(jì)劃在SQL PLUS下可以用:explain sql語(yǔ)句;
PLSQL DEVELOPTER下可以寫好語(yǔ)句直接按F5;
我們通常知道使用索引要比全表好,使用索引的時(shí)候,ORACLE先通過索引快速找到記錄的物理地址,然后再通過物理地址找到記錄。全表則是直接掃描所有記錄,找到想要的,看起來慢多了,但它少了通過索引查找物理地址這一步,所以在有些情況下可能要比索引快,比如表里的記錄很少。
綁定變量,你可以參考:
;oldq=1
還有子查詢,group by,in,not in,很多人都說盡量不用,其實(shí)這些都不能一概而論,要看具體的實(shí)際情況,參考執(zhí)行計(jì)劃,根據(jù)需要去選擇,千萬(wàn)別有偏見
要分析SQL的效能,最好是看看執(zhí)行計(jì)劃什么怎么走的,根據(jù)你具體業(yè)務(wù)邏輯以及表中數(shù)據(jù)量來具體分析.在pl/sql developer 里是按f5