亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        SQL查詢優(yōu)化分析

        2020-11-28 07:39:56徐愛蕓
        西部論叢 2020年11期

        徐愛蕓

        摘 要:SQL對數(shù)據(jù)執(zhí)行最多的操作是對數(shù)據(jù)的查詢,查詢的方法不唯一,因此查詢的速度和效率差別也很大。本文分析了幾種查詢的方法:相關(guān)子查詢、無關(guān)子查詢、集合的查詢,分析查詢執(zhí)行的過程,并對每一種查詢方法進(jìn)行了定量的分析,從而得出了比較優(yōu)化的查詢方法。

        關(guān)鍵詞:SQL語句;相關(guān)子查詢;無關(guān)子查詢;集合查詢;查詢優(yōu)化

        1前言

        子查詢也稱嵌套查詢,它嵌套在 SELECT、INSERT、UPDATE、DELETE 語句或其它子查詢中,任何允許使用表達(dá)式的地方都可以使用子查詢。如果子查詢的條件中使用了其外層的表的字段,這種子查詢就叫作相關(guān)子查詢。相關(guān)子查詢可以用EXISTS、NOT EXISTS引入。子查詢可以計算一個變化的聚合函數(shù)值,并返回到外圍查詢進(jìn)行比較。子查詢比較靈活、方便,常作為增刪改查的篩選條件,適合于操縱一個表的數(shù)據(jù)。但是在性能上,往往一個不合適的子查詢用法會形成一個性能瓶頸。

        2子查詢分類

        一個查詢語句塊(select-from-where)可以嵌套在另外一個查詢塊的where子句中,從子查詢的語法規(guī)則和執(zhí)行過程不同,子查詢分為無關(guān)子查詢和相關(guān)子查詢兩種。

        2.1無關(guān)子查詢

        無關(guān)子查詢的結(jié)構(gòu)如下:SELECT ——FROM——WHERE? (SELECT ——FROM——WHERE)

        無關(guān)子查詢的工作方式是由內(nèi)向外處理:先執(zhí)行內(nèi)查詢,外層查詢利用內(nèi)層查詢的結(jié)果作條件,子查詢返回結(jié)果的數(shù)據(jù)類型必須與外查詢 WHERE 語句的數(shù)據(jù)類型相匹配。

        2.2相關(guān)子查詢

        相關(guān)子查詢的結(jié)構(gòu)如下:SELECT ——FROM——WHERE? NOT? EXISTS (SELECT? *? ?FROM——? WHERE? NOT? EXISTS? ? (SELECT? * FROM —— WHERE? ?));

        帶有EXISTS量詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯值,子查詢的查詢條件依賴于外層父查詢的某個屬性值,這就是相關(guān)子查詢的由來,內(nèi)查詢的執(zhí)行次數(shù)與外查詢執(zhí)行次數(shù)相同。

        3查詢執(zhí)行過程分析

        以下面的三張表為例子,要求查詢被所有學(xué)生都選修了的課程信息。

        Student(Sno ,Sname,Sdep ) Course(Cno, Cname, Credit)? SC(Sno, Cno, Score)

        3.1采用相關(guān)子查詢

        根據(jù)傳統(tǒng)的方法,我們采用三層嵌套,對應(yīng)的SQL語句如下:

        SELECT Cno, Cname? ?FROM? Course? ?WHERE NOT EXISTS (SELECT? *? FROM Student WHERE NOT EXISTS? ? ?(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno));

        這個算是一個比較復(fù)雜的sql語句了,兩個 NOT EXISTS和三個WHERE,這個sql語句可以分為3層:最外層語句,最內(nèi)層語句,中間層語句。

        其執(zhí)行過程如下:①進(jìn)入第一層:在外層Course中取出一個元組的Cno,如Cno值‘C1;②進(jìn)入第二層:取Student表中的一個Sno值‘S1;③進(jìn)入第三層:判斷SC表中是否有 Cno=‘C1 并且Sno=‘S1這樣的元組,經(jīng)過NOT EXISTS的取反,存在F,不存在就是T—— 結(jié)果F④返回第二層:取第二個Sno值‘S2⑤進(jìn)入第三層:判斷是否存在 Cno=‘C1 并且Sno=‘S2這樣的元組,結(jié)果取反 —— 結(jié)果F;⑥經(jīng)過多次這樣的迭代,取最后一個Sno值,結(jié)果取反 —— 結(jié)果F,返回第一層的結(jié)果:T(NOT EXISTS再次取反),所以將Cno='C1課程信息取出放入結(jié)果表中,即對應(yīng)Course的'C1記錄,Student表中的所有的記錄對應(yīng)的中間層的返回值為假,所以最外層的NOT EXISTS對應(yīng)的值為真,最外層的WHERE的值也為真,則'C1對應(yīng)的課程的記錄符合查詢條件,裝入結(jié)果表中。

        重復(fù)上述步驟,直到將Course中的元組取完。

        這是一個帶有全稱量詞的謂詞查詢(題中帶有“全部”),將其轉(zhuǎn)換為等價的存在量詞的謂詞查詢,即:不存在一個學(xué)生沒有選修這門課程的,即所有學(xué)生都選了這門課程。

        可以看出:相關(guān)子查詢從上往下順序執(zhí)行,主查詢的每一行查詢都執(zhí)行一次完整的子查詢。EXISTS 操作符檢查在子查詢中是否存在滿足條件的行:如果在子查詢中存在滿足條件的行:不在子查詢中繼續(xù)查找,條件返回 TRUE;如果在子查詢中不存在滿足條件的行,條件返回 FALSE, 繼續(xù)在子查詢中查找。假設(shè)學(xué)生表有10條記錄,課程表有8條記錄,選課表按平均每人選6門課算,則整個查詢要執(zhí)行10×8×6=480次。

        3.2 采用綜合查詢法

        如果將外層設(shè)計為相關(guān)子查詢,而在中間層為無關(guān)子查詢,對應(yīng)的SQL語句如下:SELECT Cno,Cname? FROM Course WHERE NOT EXISTS (SELECT * FROM Student WHERE Sno? NOT IN (SELECT Sno? FROM? SC? WHERE Cno=C.Cno)) ;

        其執(zhí)行過程如下:① 進(jìn)入第一層:在外層Course中取出一個元組的Cno,如Cno值‘C1;② 進(jìn)入第二層:執(zhí)行無關(guān)子查詢,按照無關(guān)子查詢執(zhí)行的順序,先執(zhí)行最內(nèi)層的查詢,在選課表中查詢選修了C1課程的學(xué)生的學(xué)號,返回到中間層;③ 經(jīng)過NOT? IN 的取反,得到的是沒有選修‘C1課程的學(xué)生的學(xué)號;④ 根據(jù)相關(guān)子查詢的執(zhí)行原理,將中間層的結(jié)果返回到第一層,再一次經(jīng)過NOT EXISTS的取反,得到的是不存在沒有選修‘C1課程的學(xué)生,說明所有學(xué)生都選修了‘C1課程。

        可以看出:這里采用了相關(guān)子查詢和無關(guān)子查詢兩種方法,同樣按上面的例子,由于第二層和第三層之間采用的無關(guān)子查詢,只需要在子查詢中查找滿足條件的元組,不需要外層查詢中的字段值,整個查詢要執(zhí)行10×8=80次。顯然,這種方法更好理解,且只有一層相關(guān)子查詢,執(zhí)行速度快。

        3.3 采用集合的查詢

        SQL的SELECT語句查詢結(jié)果是元組的集合,如果將外層設(shè)計為相關(guān)子查詢,而把內(nèi)層設(shè)計為集合的查詢,集合操作可以用差運算。這樣三層嵌套查詢可以用兩層嵌套查詢完成。對應(yīng)的SQL語句如下:SELECT? Cno,Cname? FROM C? WHERE NOT EXISTS? (( SELECT? Sno? ?FROM S)? ? EXCEPT? ?(SELECT Sno? FROM? SC? )? WHERE Cno=C.Cno? ) ;

        其執(zhí)行過程如下:① 進(jìn)入第一層:在外層Course中取出一個元組的Cno,如Cno值‘C1;② 進(jìn)入第二層:執(zhí)行集合的子查詢,在學(xué)生表中投影全部學(xué)生學(xué)號Sno,同時在選課表中查選修了‘C1課程的學(xué)生學(xué)號,然后執(zhí)行集合的差運算,得到的是沒有選修‘C1課程的學(xué)生學(xué)號,返回到外層;③ 經(jīng)過NOT? EXISTS的取反,得到的是不存在沒有選修‘C1課程的學(xué)生,說明所有學(xué)生都選修了‘C1課程。

        采用了相關(guān)子查詢和集合查詢,同樣按上面的例子,只有兩層查詢,則整個查詢要執(zhí)行10次。顯然,這種方法最簡單,方法直接,易理解,執(zhí)行速度最快,效率最高。

        結(jié)束語

        一個查詢是可以用多種方法來實現(xiàn)的,一個復(fù)雜的查詢要用到嵌套查詢,相關(guān)子查詢最不好理解,執(zhí)行的過程長,效率低;如果采用無關(guān)子查詢、集合查詢等,可以加快查詢的速度,提高查詢效率。

        參考文獻(xiàn)

        [1] 姜代紅,蔣秀蓮 .數(shù)據(jù)庫原理及應(yīng)用(第2版)清華大學(xué)出版社,2010.12

        [2] 何玉潔 數(shù)據(jù)庫系統(tǒng)教程(第2版)人民郵電出版社,2015.12

        精品亚洲天堂一区二区三区| 无码人妻精品一区二区三区下载| 国产免费三级三级三级| 精品久久一品二品三品| 国产亚洲精品久久久久久国模美| 国产成人午夜精华液| ZZIJZZIJ亚洲日本少妇| 黄片一级二级三级四级| 无码国产精成人午夜视频一区二区| 曰本大码熟中文字幕| 免费在线视频一区| 激情乱码一区二区三区| 日本一区二区三级在线观看| 欧美放荡的少妇| 国产999视频| 精品国产麻豆免费人成网站| 中国国产不卡视频在线观看 | 精品不卡久久久久久无码人妻| 中文字幕久久国产精品| 日本免费视频| 伊人久久五月丁香综合中文亚洲| 国产精品国产三级国产专播| 男女啪啪动态视频在线观看| 亚洲理论电影在线观看| 亚洲精品无码国模| 国产在线一区二区视频免费观看| 极品一区二区在线视频| 久久久久久曰本av免费免费| 国产成人精选在线不卡| 天堂av一区二区在线| 18禁在线永久免费观看| 亚洲美免无码中文字幕在线| 国产剧情无码中文字幕在线观看不卡视频 | 国偷自拍av一区二区三区| 午夜成人鲁丝片午夜精品 | 久久精品韩国日本国产| 亚洲国产女性内射第一区二区| 高清不卡一区二区三区| 精品国产免费久久久久久| 日韩女优一区二区在线观看| 成年站免费网站看v片在线|