昨天的報表資料庫中有一條sql,執行計畫很差 ,full table scan ,索引以及全部統計資訊完整。
select × from wpay201004 where org_code='01013340c' and op_code not in ('1330');
使用者很著急,試著採取了幾個方法 :
1.刪除統計資訊,重新收集
2.對索引進行重建。
結果還是不通過索引來進行查詢。強行在sql語句中加上hint提示(),執行計畫可以了,可這就要改程式,已經來不及,只能想別的方法。
這是一張月份表,同樣對比前乙個月的查詢,3月的執行計畫通過走了索引而四月卻是全表掃瞄,效率差了一大截。仔細檢視,表、索引結構相同,唯一的差別就是統計資訊數值不一樣。我跟使用者說換個思路,把3月表的統計資訊複製到4月,通過這種方法改變執行計畫,得到使用者的肯定我開始進行操作。
建stata表
execute dbms_stats.create_stat_table(ownname=>'owner',stattab=>'stat_tab',tblspace=>'ts_name');
匯出表wpay201003分析資料:
execute dbms_stats.export_table_stats(ownname=>'owner',tabname=>'wpay201003',stattab=>'stat_tab');
刪除表wpay201004的分析資料:
execute dbms_stats.delete_table_stats(ownname=>'owner',tabname=>'wpay201004');
修改統計資訊
對stat_tab統計資訊做休息,讓資料復合wpay201004使用。
匯入分析資料
execute dbms_stats.import_table_stats(ownname=>'owner',tabname=>'wpay201004',stattab=>'stat_tab');
完成,測試結果完全按照預想,執行計畫走了索引。執行時間從50多秒縮短到4秒左右。
Oracle修改統計資訊收集計畫時間
一 查詢收集統計資訊計畫 select from dba scheduler windows t1,dba scheduler wingroup members t2 where t1.window name t2.window name and t2.window group name in ma...
AUTOTRACE執行計畫中,統計資訊詳解
i m me 索引相關 全表掃瞄是怎麼掃瞄的?oracle最小的儲存單位是block 物理上連續的block組成了extent 也就是說乙個區中的所有塊在物理上是連續的 很多個extent組成了segment 乙個segment中的區在物理上可能是連續的,也可能是不連續的 全表掃瞄是乙個區乙個區的掃...
通過鎖定統計資訊來鎖定執行計畫
今天在群裡面看到乙個訊息。提問是這樣的 他認為oracle 10g很痛苦,隨著資料量的變化,sql的執行計畫在不停的改變,導致同乙個儲存過程,時間點不同,執行效率就不同.他的問題是有沒有好的方法讓執行計畫不改變,個人認為是鎖定統計資訊。如何鎖定統計資訊,下面來分布說明 1.首先收集統計資訊 begi...