oracle 两个诡异的问题

shadow1986a 2018-11-16 02:58:22
最近发现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 也很快结束。 完全不知道怎么回事了。



以上两个情况,大家遇到过没,有没有什么方向?
...全文
69 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
卖水果的net 2018-11-20
  • 打赏
  • 举报
回复
第一个问题,我忽略了,建议 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 不涉及。
ckc 2018-11-17
  • 打赏
  • 举报
回复
oracle会对表的数据进行统计,会进行一些“智能化"的处理,决定用不用索引啊之类,但是这种智能经常实际上很sb,就会造成有时好有时不好的情况
没有太好的办法解决,只能就事论事,遇到事情的时候检查分析

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧