oracle sql優化

摘要:數據庫性能問題一直是決策者及技術人員共同關注的焦點,影響數據庫性能的 一個重要因素就是SQL查詢語句的低效率,而在SQL查詢語句中多表聯接查詢的使用頻率很是之高,最能體現查詢複雜性,每每是SQL優化的重點與難點。爲 了提升查詢速度,提升數據庫應用系統的執行效率,文章從分析關係數據庫多表查詢處理過程入手討論查詢優化技巧,指出多表查詢優化的原則。經過幾種優化策略 的研究,在時間和空間上提升了系統的性能,在必定程度上提升了查詢效率。
關鍵詞:SQL 優化 聯接
        引言
        多表聯接操做每每要耗費大量的CPU時間和內存,因此 多表聯接查詢在查詢優化中起到了相當重要的做用,是數據庫中最基本、最經常使用、最複雜的操做。在數據庫的管理信息系統中,聯接查詢操做是全部數據庫操做中所 佔據比重最大的操做。當數據庫系統積累到必定程度,若查詢時採用單條順序掃描,那麼掃描一遍全部的記錄可能就得花上幾十分鐘,甚至幾小時,這樣的系統就失 去了現實的使用價值。採起什麼樣的查詢策略,使聯接查詢時間下降,就是本文須要研究的查詢優化問題。
        1 優化原理
        聯接查詢操做的前提是笛卡兒積,即要將多表中全部的元 組拿來運算,再從中找出符合條件的,其自己就增長了運算的負擔,因此咱們在作優化時儘可能避免聯接查詢。若是必需要使用聯接查詢時也要儘可能使用較少的聯接 表,查詢優化力圖找出給定等價的表達式,但執行效率更高,一個查詢每每會有許多實現方法,關鍵是如何找出一個與之等價的且操做時間又少的表達式。優化的核 心問題是儘量減小查詢中各表的參與加工的數據量,從而達到優化時間和空間的目的。
        2 聯接查詢優化的原則
        2.1 儘可能使用單表操做
        給定三個關係模式:(如下實例均以此爲例)
        s(sno,sname,sec,birthday,email)
        c(cno,cname,creadit,tname)
        sc(sno,cno,score)
        例:查詢1001學生選修的課程成績。
        分析:在此查詢中涉及到sno和score兩個字段,sno在s表中,score在sc表中,若要使用s和sc的聯接,
SQL語句爲:SELECT score FROM s,sc WHERE s.sno=sc.sno and sno=‘1001’
則此查詢就是多表聯接查詢,這樣勢必要作笛卡兒積操做,因此會增長檢索的時間。
        分析:在此查詢中涉及到的sno和score兩個字段能夠在sc表中所有找到,按照儘可能使用單表操做原則,能夠只用一個sc表。
        SQL語句改成:SELECT score FROM sc WHERE sno=‘1001’這樣避免了聯接時的笛卡兒積操做,大大提升檢索速度。
        2.2 避免不了的聯接操做要作到如下幾個原則:
        2.2.1 聯接表時聯少不聯多 在作多表聯接查詢時,聯接的表的個數儘可能少,這樣就能夠減小查詢中參與加工的數據量,從而達到優化時間和空間的目的。
        例:查詢選修了「數據庫應用」課程的學生的學號和成績。

 


        分析:此查詢中涉及到sno、cname和score三個字段,分別在s、c和sc中,若要使用s、c和sc的聯接,
SQL語句爲:SELECT sno,score FROM s,c,sc WHERE s.sno=sc.sno and c.cno=sc.cno and cname=‘數據庫應用’
        則此查詢是多表聯接查詢,而且聯接的三表中,兩兩都要作笛卡兒積操做,因此會增長檢索的時間。
        分析:此查詢中涉及到sno、cname和score三個字段,分別在c表和sc表中就能夠所有找到,按照聯接表時聯少不聯多的原則,能夠只用c和sc表。
        SQL語句改成:SELECT sno,score FROM c,sc WHERE c.cno=sc.cno and cname=‘數據庫應用’
        2.2.2 聯接表時在聯少不聯多的基礎上要能實現聯接 在作多表聯接查詢時,使聯接的表的個數儘可能少,可是不能一味的追求表的個數,若是表的使用不能達到咱們要查詢的數據,或者不能實現聯接,那也是不成功的。
        例3:查詢選修了「數據庫應用」課程的學生的姓名。
        分析:此查詢中涉及到sname和cname兩個字 段,分別在s表和c表中,若要使用s和c的聯接,SQL語句爲:SELECT sname,cname FROM s,c WHERE  cname=‘數據庫應用’則此查詢是多表聯接查詢,但兩個表沒有公共屬性,因此實現不了聯接,這樣此操做就變成了單純的笛卡兒積操做,在此聯接中會查詢 出不符合條件的記錄,失去了查詢的意義。
        分析:此查詢中涉及到sname和cname兩個字段,分別在s表和c表中,可是s表和c表沒有公共屬性,不能實現聯接,因此必須藉助sc表,因此此查詢是s表、c表和sc表三表的聯接。
        SQL語句改成:SELECT sname,cname FROM s,c,sc WHERE s.sno=sc.sno and c.cno=sc.cno and cname=‘數據庫應用’
        2.3 先篩選後聯接
        當查詢多個數據表時,要先過濾後聯接。
        例5:查詢全部成績大於70分的學生的信息。
        分析:要作s表和sc表兩表聯接,並篩選出符合條件的記錄。
        SQL語句爲:SELECT*FROM s,sc WHERE s.sno=sc.sno   and score>70
        此查詢語句首先將兩個數據表按照學號進行聯接,而後再將符合條件的記錄篩選。因爲兩個數據表進行聯接時有些記錄是之後要篩選掉的,且多個數據表聯接是笛卡爾積運算,消耗的時間會隨着記錄個數的增長很快地增加。
        SQL語句改成:SELECT*FROM s,sc WHERE score>70 and s.sno=sc.sno
此聯接查詢語句克服了以上缺點,首先篩選出符合條件的記錄,減小了進行聯接的記錄個數,而後再執行聯接查詢,大大提升了查詢效率。
        3 結束語
        查詢優化要抓住關鍵問題,對於數據庫應用程序來講,重 點在於如何提升SQL的執行效率。在數據庫的開發和維護過程當中,多表聯接查詢的優化設計能夠提升系統性能,對於數據量大的數據庫系統尤其重要。以上介紹的 幾種優化策略使多表聯接查詢在時間和空間上提升了系統的性能,在必定程度上提升了查詢效率。 數據庫

 

相關文章
相關標籤/搜索