问题描述
我有一个存储过程,它使用一个全局临时表,称为在提交时带有delete的项目 (基于会话的统计信息)。在存储过程中,有时会将1行添加到项目中,有时会将200,000行添加到该表中。然后在存储过程中的其他一些查询/更新中使用项目。
我只向项目添加1行,运行统计信息,* 然后 * 编译存储过程。然后在执行存储的proc时,proc将插入到项目中。如果它只有一个在项目中添加了几个项目,它的速度相对较快。如果它有成千上万的物品,那么它就太慢了。
当然,如果我向项目添加200,000行,请运行统计信息,然后 * 编译存储过程。然后结果被翻转。
我考虑过使用立即执行来解决这个问题,但是我不喜欢这个想法,原因有很多,包括它不容易编辑,而且我没有编译时间错误。
有没有其他方法可以使存储过程中的sql与自适应执行计划一起运行?
我只向项目添加1行,运行统计信息,* 然后 * 编译存储过程。然后在执行存储的proc时,proc将插入到项目中。如果它只有一个在项目中添加了几个项目,它的速度相对较快。如果它有成千上万的物品,那么它就太慢了。
当然,如果我向项目添加200,000行,请运行统计信息,然后 * 编译存储过程。然后结果被翻转。
我考虑过使用立即执行来解决这个问题,但是我不喜欢这个想法,原因有很多,包括它不容易编辑,而且我没有编译时间错误。
有没有其他方法可以使存储过程中的sql与自适应执行计划一起运行?
专家解答
我会考虑另一种策略... 因为它看起来比你 * 知道 * 插入的行数,为什么不让优化器知道,即,类似 (伪代码)
procedure sp is
begin
insert into gtt values (1);
dbms_stats.set_table_stats('','GTT',numrows=>1,numblks=>1,no_invalidate=>false);
insert into gtt select ....;
x := sql%rowcount;
dbms_stats.set_table_stats('','GTT',numrows=>x,numblks=>x/50,no_invalidate=>false);
end;
/
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




