一周以來遇到的問題和經驗(oracle)

來源:互聯網
上載者:User

      很久以前,在我還在某國企的時候,我被領導要求最佳化一段SQL。說真的那個時候我根本不知道SQL的最佳化為何物,但是百度google之後我發現所有的資料都寫有這麼一條:把選擇性大的條件子句寫在最後。因為oracle在執行的時候從底向頂執行。這句話我當時篤信不疑。可是後來我查到更多資料以及對SQL最佳化有了更深的理解之後,我發現那句話是RBO,而現在的oracle採取CBO。那麼SQL到底是不是從下向上執行的?這個疑問後來在一次錯誤中被解決了。

      有這麼一個表,叫做test,有兩個欄位ser_id,area_id。但是我記不住了,我寫了以下的SQL:

      

select * from test 
where area_id = 290
and name = 'Lee'
and class_id = '201201';

       執行一把:

       

      系統會報錯,但是系統不會說“name”也是無效的,只是檢測出了class_id無效。這也就是說明,在進行語句的解析時,oracle確確實實是從下向上執行的。那麼是不是說把選擇性大的條件寫到最底下會最快呢?我想這個還是靠執行計畫說話。

      還是這個test表,現在有12582912條資料,其中area_id=290的資料有4291456條,而ser_id=100001的有2097152條。很明顯,area_id=290更具有選擇性。好,現在SQL語句1如下:

     

select * from test
where ser_id = 100001
and area_id = 290;

      它的執行計畫如下:

      

      將條件反轉,在看執行計畫:

      

     驚奇的發現兩個的執行計畫是一樣的。但是有點不同,就是物理讀。可以看到第一個進行了27次物理讀,而第二個SQL沒有物理讀。我想物理讀的產生原因大家都是知道的,這裡物理讀少了是因為需要的資料是一樣的,所以第二次直接從緩衝中讀出了需要的資料。但是不管物理讀如何,兩個執行計畫是一樣的,這就證明了oracle,起碼是我本機裝的11g,並沒有因為條件子句的選擇性高低而更改其執行計畫。

     

 

     下面是第二部分,這周學會了一個基本的SQL語句:having。

     這個語句很好用,一般用來統計重複資料的時候非常非常好使。比如說我上面那個test表吧,我想知道ser_id=100001這條資料記錄重複了多少遍,只需要這樣寫SQL:

select ser_id, count(*)
from TEST
WHERE ser_id = 100001
group by ser_id
having count(*) > 1;

     就能得到結果。

     

     

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.