來點小技巧,將buffer gets降到最低!


    這兩天在準備寫一個關於下降buffer gets進行sql優化的文章時,無心中發現一篇熊軍老師2012年寫的文章:《Oracle Index Internals》,就先學習了一下。文章對B-Tree索引進行了深刻的闡述,我上一篇的is null使用聯合索引的案例,這篇文章也提到了。更巧的是,本文下面的內容,也與文章的的這一頁有關:sql


    這些描述都是比較準確的,你們若是有興趣均可以本身動手操做一下,相信都會獲得一樣的結論。對於其中全表掃描的4次邏輯讀,好像只有在建表時同時插入記錄的狀況纔會只有4次邏輯讀,若是是先建空表,再插入記錄,此時的全表掃描最少要7~8個邏輯讀了,這個問題老虎劉尚未深刻研究(只是簡單作了一些dump block的對比,沒發現真相),若是有哪位大師搞清楚了,可讓老虎劉學習一下。性能優化

    上面文章中的數據已經說明了一個問題,就是:小表也須要建索引。    微信


    

     今天咱們主要研究最後一種狀況,也就是2個邏輯讀的狀況,有沒有辦法讓它再減小一個邏輯讀?  oracle

    先來看某客戶一個大型系統awr TOP CPU的top 6 SQL(top1在上上篇文章中提到過):性能

   


SQL代碼:學習

select free_minus_name, free_type測試

from table_conf優化

where free_code = :FREE_CODE;spa


table_conf(化名)是一個只有80幾條記錄的小表,free_code字段上有單字段unique索引。這個sql的平均buffer gets就是2(在awr的top gets部分有顯示)。.net


    通常來講這種sql沒人再去優化了,可是這個sql執行次數多,若是能把buffer gets下降1個,基本上對CPU的消耗也會下降一半,在這裏仍是值得研究一下的。通過一些分析和測試,老虎劉給出的方法是:    

  一、建立free_code+free_minus_name+free_type 3字段聯合索引(注意:free_code必定要在第一位,是否unique index不要緊);

  二、在where 條件中增長rownum=1(SQL邏輯沒有變)

  通過上面優化後能夠從2 buffer gets 降到1buffer gets。


    若是你的SQL執行次數很少,你就不必作這個優化了。固然,優化方法仍是值得參考的。有時候,小表與大表關聯,若是執行次數多,也可使用這個方法。


總結:

小表也須要索引;

小表的索引,通過上面的優化後,能減小一個buffer gets。


大家發現沒有,包括這篇文章在內,老虎劉有不少SQL優化都用到了rownum,相信能對你們有所幫助。

本文分享自微信公衆號 - 老虎劉談oracle性能優化(sql_tigerliu)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索