如何解决存储过程中关联临时表时快时慢的情况

     调用一个存储过程,同样的条件,数据库负载也是正常的情况下,时快时慢。原因是数据库无法获取临时表的统计信息,导致执行计划会走错。之前写过一个帖子,被临时表坑了,http://blog.csdn.net/stevendbaguo/article/details/39964807,就是用hint/*+ dynamic_sampling(T 10) */来做动态采集,这种解决方案实践证明还是没有很好的解决问题,出现时快时慢的几率只是小了一点。

     最优的解决方案是什么呢?

     一般我们会选择事务型的临时表,如果你用的是oracle 12c,恭喜你,插入临时表后,直接收集统计信息即可,dbms_stats.gather_table_stats是不会提交事务的。

如果是11g及以下的数据库,会提交事务,表会被清空。

     那换成基于会话的临时表,也有问题,weblogic连接池中的session是不会释放的,临时表的数据会不断累积。

     最终的解决方案是:用基于会话的统计信息,向临时表中插入数据后,紧接着收集统计信息,在存储过程的末尾truncate表。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle存储过程,你可以使用临时表来存储临时数据。临时表是在会话级别创建的,仅在当前会话可见,并在会话结束后自动删除。以下是使用临时表的一般步骤: 1. 创建临时表:使用CREATE GLOBAL TEMPORARY TABLE语句创建临时表临时表可以是全局临时表(GLOBAL TEMPORARY TABLE)或本地临时表(LOCAL TEMPORARY TABLE)。全局临时表在所有会话之间共享结构定义,但数据仅在当前会话可见。本地临时表在会话级别创建和使用,并且只在当前会话可见。 2. 定义临时表结构:在CREATE TABLE语句定义临时表的列和其他约束。 3. 在存储过程使用临时表:在存储过程,你可以像使用任何其他表一样使用临时表。你可以插入、更新、删除、查询临时表的数据,并在存储过程执行期间将其作为间结果使用。 4. 清空或删除临时表:当你需要清空或删除临时表的数据时,可以使用TRUNCATE TABLE或DELETE语句。TRUNCATE TABLE语句会快速删除表的所有数据,而保留表结构。DELETE语句可以根据条件删除表的数据。 5. 存储过程结束后临时表自动删除:一旦存储过程执行完毕或会话结束,临时表会自动删除,无需手动清理。 使用临时表可以在存储过程方便地存储和处理临时数据,提高性能和简化逻辑。注意,临时表的数据仅在当前会话可见,不会对其他会话产生影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值