oracle sql tuning 5--避免防範或者減少問題SQL

oracle_db發表於2010-03-12

SQL語句這麼容易出問題,能不能採取措施避免防範呢?

1.核查優化器的統計資訊

查詢優化器通過表,索引等的統計資訊來決定使用那種執行計劃.如果說統計資訊沒有被收集,或者說統計資訊是過時的,不能代表資料庫中最新的統計資訊情況,那麼優化器將沒有足夠的資訊來生成好的執行計劃.

大致可以通過以下兩種方式核查

#1.收集部分表的統計資訊,或者全部。這樣對於那些使用表關聯的語句有好處

#2.如果統計資訊過時了,完全不能反映資料庫現狀的話,那麼就需要重新收集。通過檢視一個表現有的統計條數,在看統計資訊中的條數是否一樣,如果相差很遠,那不用說了,統計資訊肯定過時了.有用的檢視有user_tables,dba_tables這裡邊都能看到表的條數,最後統計時間等資訊

#3.評估執行計劃

當在OLTP環境下調整SQL的時候,要儘量使少的資料流入到下一步操作中,如果下一步是一個表的關聯,那麼這就著只有少數行在參與關聯。確認執行路徑是否是最佳的

當檢查執行計劃時,可以關注下以下資訊

  • The plan is such that the driving table has the best filter.我認為是驅動表應該被充分過慮

  • 每一步的連線順序應該滿足一個總體條件,那就是,流入下一步的資料要儘可能減少

  • 連線要適當,所謂適當就是返回資料的量不要太大。比如:nested loop joins 中用到了索引,這本來是好事,但是當返回的資料量很大時,這可能就不是最優的了

  • 有效的使用檢視,檢查select列表,看訪問檢視是否是必要的

  • 笛卡爾集不要出現,那怕是很小的表!

  • 要讓每個表被有效的訪問

    考慮語句中的關鍵詞,表的記錄數。查詢可疑處,例如對於大表的FULL TABLE SCANS 。在WHERE條件中有關鍵詞出現等。確定為什麼SELECT語句沒有使用索引.

    全表掃描並不意味著效率不高,對於小表它更有用。如果說以上需要注意的地方都覺得有問題,那還是重寫SQL吧!

    當SQL問題太多,不得不重建SQL的時候...

    通常重寫無效SQL,比取調整它要來得容易,如果你理解語句的目的,那麼寫出符合要求的語句是很輕鬆的事

    重建SQL可以考慮以下一些情況

    #1.關聯的時候儘量用=,and

    #2.避免WHERE條件中有轉換情況出現,如:

    WHERE A.ORDER_NO =B.ORDER_NOd要好過

    WHERE TO_NUMBER (SUBSTR(a.order_no, INSTR(b.order_no, '.') - 1))
    = TO_NUMBER (SUBSTR(a.order_no, INSTR(b.order_no, '.') - 1))

    在謂詞或者WHERE條件中不要使用SQL函式,因為這種情況下優化器很有可能不能利用到索引,除去函式是基於索引的函式這種情況.

    避免寫不清楚的SQL,小心ORACLE的隱式轉換,例如:當你想使用索引,在varchar2_col列上,你在條件中卻寫到  and varchar2_col = number_col[數字列]

    這種情況下ORACLE會做什麼呢,to_numbwr(varchar2_col)=number_col

    避免複雜的表示式,例如:

  • col1 = NVL (:b1,col1)

  • NVL (col1,-999) = ….

  • TO_DATE(), TO_NUMBER(), 等
    原因在於這種些表示式影響優化器選擇基數,影響全域性執行計劃

     

     

     

  • 來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15720542/viewspace-629379/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章