我在表A上的一列x中插入了一组900左右的查询。
然后我使用一个基本的for循环来循环并使用Execute Immediate x,问题是我想识别需要很长时间执行的查询让我们说10分钟才能优化它们。 是否有任何方法可以获得执行时间,如果某个查询占用超过10分钟我停止它并将其ID记录在另一个表中并继续循环。
begin
for query in (select x from A)
loop
-- Some method to put a listner on the execution time
execute immediate query.x;
end loop
end;
感谢的
答案 0 :(得分:1)
最简单的" Heath Robinson"您可以写入日志表的术语"查询X开始"和"查询x结束"使用时间戳来衡量已过去时间。当时有一段时间你可以使用 tkprof ,但是现在大多数公司的安全策略暴政都要求开发人员无法访问服务器跟踪文件,以便选项不用了。 Tkprof(使用alter session set sql_trace = true)会告诉你解析时间,cpu时间,已用时间,获取的行等等。
您还可以为查询切换监控,以便在通过Grid COntrol / Enterprise Manager查看时,您可以查看实时信息。有关详细信息,请参阅此链接:
http://www.oracle.com/technetwork/database/manageability/sqlmonitor-084401.html
你问题的第二部分很棘手。我不确定,或者我怀疑,您可以在查询上设置超时。也许资源管理套件有一些东西,但我不确定。假设你怎么没有杀死正在运行的查询?你无法告诉Oracle" Kill查询x",但你可以告诉它"杀死会话x",但这会杀死你的整个......会话。纯粹根据技术挑战思考,而不是优雅或实用,你可以将每个查询作为一个工作来实现并安排它运行,然后循环监控它的运行,如果它超过你的时间限制,就杀了工作会议或终止工作。再说一遍,我并不是说你应该怎么做,但这是我尝试的一种方式,我需要做到这一点,我希望它能够沿途通过一些弯曲的球。这将是一个有趣的挑战..如果我有时间和倾向,我可能会这样做。
答案 1 :(得分:0)
我对这种方法有一种不好的感觉:找出一个"坏"查询只是因为它的执行时间听起来古怪而且可能导致进一步的错误。执行时间取决于许多因素,而这些因素反过来可能与查询本身没有直接关系(例如,数据集很小/很大,缓存配置),而且执行时间短(例如不到10分钟)并不一定意味着你的查询很好。我宁愿测试我的查询对他们的执行计划,当然,一个好的测试数据集可用。
无论如何,Oracle应该能够为您提供配置一些到期时间的可能性:在这种情况下,您必须包围您的"立即执行"用
BEGIN
...
EXCEPTION WHEN ... THEN ...;
END;
使用 EXCEPTION WHEN THEN 语句来阻止超时。如果出现超时,您可以将该异常存储在某个地方,以便追踪您的错误"查询。