交流(1)-- 執行計劃錯誤問題

yezhibin發表於2011-01-07

     前幾天參加了一個專案的資料庫技術交流,就提出的問題提供一些思路:

      1、執行計劃錯誤問題

      2、分割槽表統計分析耗時太長

  一、執行計劃錯誤問題

       執行計劃錯誤問題,通常我們可以觀察cardinality值的誤差情況,在語句中加

gather_plan_statistics hint ,具體的例子可以參看前面記錄《oracle 10g如何使用

dbms_xplan分析執行計劃》。

      cardinality值是基於統計分析產生的評估值,語句加gather_plan_statistics,使

我們能評估出SQL語句實際輸出的行數與評估輸出的行數的差異情況,當我們發現

兩者值差異較大的時候,需要考慮可能以下的原因造成該差異:

      1、表沒有統計,或者統計資訊是stale

      2、表的資料分佈不均勻,CBO的模型是所有rows平均分配到distinct value上。

      3、where 後面的判斷col1 = A and col2=B,col1和col2之間有個包含關係,比

            如:省='福建‘ and 分支機構=’廈門‘,CBO並不知道兩者是包含關係,所有計

           算selectivity=selectivity(col1)*selectivity(col2),實際的selectivity=

           selectivity(col2),造成計算出來的cardinality值偏差。在11g中引入了

           擴充套件統計解決該問題。

       4、多個列關聯後引起的問題,如3例子,where a.省=b.省 and a.分支機構= b.

           分支機構。

       5、where function = 'xxx',這個是老生常談的問題了

       6、一些複雜的預測,如>=、<=、!=等表示式,該解決方法只能採用動態取樣方

           式解決。

   擴充套件統計方法可以參看11g的隨機手冊,命令方式如下:

       1、設定收集column group 為300秒

             exec dbms_stats.seed_col_usage(null, null, 300)

        2、生成column使用報告

             select dbms_stats.report_col_usage(USER, 'table_name') from dual;

       3、對錶進行擴充套件統計

            exec dbms_stats.create_extended_stats(USER, 'table_name');

    動態取樣:

      10g中,optimizer_dynamic_sample預設為2,可以根據實際設定。

 



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

相關文章