各位CSDN的大牛們,你們好!
本人小白一枚
今天做Oracle存盤程序的時候遇到一個很奇怪的問題。
將select出來的資料insert到一張臨時表時花費時間特別的長(注:該表在此存盤程序中第一次被使用,且一開始就被清空)
然后我將這一段insert和select復制到外面單獨執行,能夠正確出來資料且花費時間很短(正常)。
后來咨詢部門同事,同事建議在插入到這張臨時表的時候,先執行以下陳述句
execute immediate 'analyze table 臨時表 compute statistics';
添加之后,果然就能順利運行了。
然后我問同事,為什么要這么做,他表示也不清楚,只知道以前遇到這個問題就是這么做的。
最后我就被大伙慫恿來到CSDN來向各位大牛請教了。
第一次發帖,請多多指教!
問:出現上述問題的原因是什么?analyze table的本質是什么?
uj5u.com熱心網友回復:
按理說不應該發生這種情況的,確定analyze的是被insert的表?而不是select查詢中的表?或者說,insert表本身也在select查詢中出現了?如果不是,那么這種方法就沒什么普適性了。另外你說select和insert各自執行都很快?insert沒有select子句跟著,只有跟上values才能是個合法的insert陳述句,不知道你是怎么insert的?而select查詢獨自執行很快也很可疑,用的是什么工具?有沒有回傳所有的結果資料?
uj5u.com熱心網友回復:
忘了說了。analyze的本質就是對表進行各種統計,比如表里有多少資料?表里資料的分布情況如何等等,實際上到了9i之后,oracle建議使用dbms_stats包來完成統計資訊的收集作業,analyze命令不大用了,它有一些缺陷,比如不能并行,比如收集磁區表的時候存在一些問題等等。
uj5u.com熱心網友回復:
樓主是什么樣的臨時表?temporary的嗎?
uj5u.com熱心網友回復:
analyze table的本質是收集表(資料)的統計資訊,下次在對該表進行操作的時候,就會省去一些決議的時間,因此檢索速度自然就會快很多。uj5u.com熱心網友回復:
重要的是可能生成更好的執行計劃,生下來的動態采樣的時間幾乎是可以忽略不計的。。。
uj5u.com熱心網友回復:
臨時表資料是不是 用delete 了,臨時表可能數也有索引等,資料洗掉了,但是統計資訊沒有邊,分析表只是為執行計劃增加更新表資訊!oracle 執行計劃自動根據表統計資訊選擇最優的方法!或者你們建幾個表,如果臨時表的資料是全部洗掉建議用 turncate table xx!轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/80547.html
標籤:高級技術
