最近發現2個很奇怪的問題,一直沒有找到合理的解釋,有沒有高手來看看。
1.有一個package,里面放了很多procedure. 某次專案現場人員使用 call 包名.程序名 的方法 運行了1天沒有出結果,session也一直沒有死掉。 后來改成了 begin 包名.程序名 end; 呼叫很快就出結果. 不知道是什么原因。 代碼本身沒有問題,在其它專案現場一直是call 好好的。
2. 有一段 sql : insert into tablea nologging select XXXX from XXX; 運行好長時間一直把 臨時表空間撐爆,報錯退出。
但實際查出來的結果集只有6000多行。 表也重建過,沒有解決。 然后試了 create table tableb as select XXXX from XXX; 很快出結果, 再使用 insert into tablea nologging select * from tableb 也很快結束。 完全不知道怎么回事了。
以上兩個情況,大家遇到過沒,有沒有什么方向?
uj5u.com熱心網友回復:
oracle會對表的資料進行統計,會進行一些“智能化"的處理,決定用不用索引啊之類,但是這種智能經常實際上很sb,就會造成有時好有時不好的情況沒有太好的辦法解決,只能就事論事,遇到事情的時候檢查分析
uj5u.com熱心網友回復:
第一個問題,我忽略了,建議 call 和 begin end 執行時各跟蹤一下,看看有什么等待事件。第二個問題,ctas 確實是比 insert select 速度 要快。
大概原因如下,不一定準確,也不權威:
1、insert 是一個 DML 陳述句,要為每一行數生成 redo 和 undo 資料。而 ctas 是一個 ddl ,涉及到的 undo和 redo 資料,要小太多。
2、如果原表上存在:索引、約束 等等條件,將會在每一個 insert 時檢查他們,這個要的時間不好估計,而 ctas 卻不涉及。
3、insert into Mytable 要對每行資料的值,和 Mytable 的欄位做匹配,如果型別不一致,還要做隱性轉換,而 ctas 不涉及。
4、insert into 如果沒有加 append 選項的話,會查找可用塊,而 ctas 不涉及。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/57081.html
標籤:高級技術
上一篇:天健HIS前臺和后臺知識
