久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

sql中in與exist效率是怎么樣的

162次閱讀
沒有評論

共計(jì) 1670 個(gè)字符,預(yù)計(jì)需要花費(fèi) 5 分鐘才能閱讀完成。

這篇文章將為大家詳細(xì)講解有關(guān) sql 中 in 與 exist 效率是怎么樣的,丸趣 TV 小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

一、IN 與 EXISTS
1、理解
IN 的執(zhí)行流程
SELECT * FROM T1 WHERE X IN (SELECT Y FROM T2)
事實(shí)上可以理解為:
SELECT * FROM T1, (SELECT DISTINCT Y FROM T2) T2 WHERE T1.X =T2.Y
從這里可以看出,IN 需要先處理 T2 表,然后再和 T1 進(jìn)行關(guān)聯(lián)

EXISTS 的執(zhí)行流程

SELECT *FROM T1 WHEREEXISTS (SELECT
NULLFROM T2 WHEREY = X)– 可以理解為:for xin (select
* fromt1 ) LOOP if(exists ( selectnull
from t2where y =x.x )THEN OUTPUTTHE RECORD endifend loop

從這里看出,EXISXTS 會(huì)先查詢 T1 表,然后再 LOOP 處理 T2 表

2、結(jié)論
對于 in 和 exists 的區(qū)別: 如果子查詢得出的結(jié)果集記錄較少,主查詢中的表較大且又有索引時(shí)應(yīng)該用 in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時(shí)使用 exists。其實(shí)我們區(qū)分 in 和 exists 主要是造成了驅(qū)動(dòng)順序的改變(這是性能變化的關(guān)鍵),如果是 exists,那么以外層表為驅(qū)動(dòng)表,先被訪問,如果是 IN,那么先執(zhí)行子查詢,所以我們會(huì)以驅(qū)動(dòng)表的快速返回為目標(biāo),那么就會(huì)考慮到索引及結(jié)果集的關(guān)系了。
綜合以上對 IN/EXISTS 的討論,我們可以得出一個(gè)基本通用的結(jié)論:IN 適合于外表大而內(nèi)表小的情況;EXISTS 適合于外表小而內(nèi)表大的情況。

二、NOT IN 與 NOT EXISTS
1、理解
NOT IN 的執(zhí)行流程
SELECT * FROM T1 WHERE X NOT IN (SELECT Y FROM T2)
事實(shí)上可以理解為:
SELECT * FROM T1, (SELECT DISTINCT Y FROM T2) T2 WHERE T1.X !=T2.Y

NOT EXISTS 的執(zhí)行流程

SELECT .. … FROMROLLUP R WHERE NOTEXISTS (SELECT Found
FROM TITLE TWHERE R.SOURCE_ID = T.TITLE_ID);– 可以理解為:for xin (select
* fromrollup ) loop if(
not exists (that query) ) then OUTPUT endif; end;

注意:NOT EXISTS 與 NOT IN 不能完全互相替換,看具體的需求。如果選擇的列可以為空,則不能被替換。具體見:in/exists 和 notin/not exists 語意探討

2、結(jié)論
not in 只有當(dāng)子查詢中,select 關(guān)鍵字后的字段有 not null 約束或者有這種暗示時(shí)用 notin, 另外如果主查詢中表大,子查詢中的表小但是記錄多,則應(yīng)當(dāng)使用 not in, 并使用 anti hashjoin. 如果主查詢表中記錄少,子查詢表中記錄多,并有索引,可以使用 not exists, 另外 not in 最好也可以用或者外連接 +isnull. 一般情況下建議使用 not exists

– 比如:SELECT .. …. FROMROLLUP R WHERE NOTEXISTS (SELECT Found
FROM TITLE TWHERE R.SOURCE_ID = T.TITLE_ID);– 改成 SELECT .. …. FROMTITLE T, ROLLUP
R WHERE R.SOURCE_ID =T.TITLE_ID(+) ANDT.TITLE_ID
IS NULL;– 或者 SELECT…. .. FROMROLLUP R WHERE OURCE_IDNOT
IN (SELECTOURCE_ID
FROM TITLE TWHERE OURCE_ID
ISNOT NULL);

關(guān)于“sql 中 in 與 exist 效率是怎么樣的”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-15發(fā)表,共計(jì)1670字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 酒泉市| 黔江区| 黄梅县| 隆化县| 东明县| 宜阳县| 江永县| 榆社县| 兴文县| 张北县| 新安县| 宜川县| 东乌珠穆沁旗| 天祝| 石城县| 普定县| 青铜峡市| 呼伦贝尔市| 南漳县| 蓝山县| 连江县| 沂南县| 石台县| 晋中市| 红桥区| 资中县| 宁陵县| 宣化县| 建水县| 南城县| 沿河| 越西县| 繁昌县| 鄯善县| 阜新市| 恩施市| 美姑县| 托克逊县| 无锡市| 益阳市| 吉木萨尔县|