防止Oracle中的失控SQL

时间:2014-09-23 17:43:12

标签: sql oracle

在现有应用程序中,有几个动态生成的SQL语句正在执行。其中一些性能非常慢并阻止了用户界面。

在不更改生成SQL的代码的情况下,我想知道是否有办法过早地停止超出的Oracle / SQL语句 a)执行时间阈值 b)结果行数

虽然b)听起来很容易,但在我正在处理的应用程序基础架构中并不容易,因为我没有得到记录集,因为我正在执行SQL时可以迭代。我想在某些方面,大量的结果行最终会触发时间阈值。

我读了一些关于使用Oracle资源管理器的内容,但我不确定是否可以解决a)和b),如果这是解决这个问题的最简单方法。我希望有会话/连接选项可以帮助我。

提前致谢!

2 个答案:

答案 0 :(得分:4)

创建配置文件以限制单个SQL调用的CPU时间。将该配置文件分配给应用程序用户。

--Create profile that limits CPU per call to 1 second.
create profile temp_profile limit cpu_per_call 100;

--Create user, assign profile.
create user profile_test_user identified by "asDF1234!";
alter user profile_test_user profile temp_profile;
grant connect to profile_test_user;

该用户将收到如下错误:

PROFILE_TEST_USER@someDB> select count(*) from user_objects;

  COUNT(*)
----------
         0

PROFILE_TEST_USER@someDB> select count(*) from all_objects;
select count(*) from all_objects
*
ERROR at line 1:
ORA-02393: exceeded call limit on CPU usage

一般来说,这种方法应该是最后的手段。花时间调整查询和数据库通常会更好。

答案 1 :(得分:0)

查看资源消费者组。您可以将CPU时间等内容限制为特定用户组的会话/查询。

这将是一个数据库解决方案,而不是一个应用程序 - 所以无论他们如何登录数据库,它都适用于该用户。