以类似的方式来的Oracle SQL - 查询时间限制
select * from mytable where rownum <= 1000;
将如何给我的第1000行的查询结果的,是有办法
select * from mytable where runtime <= 1000;
这将返回运行查询的第一个1000 <时间单元中获得的结果?
以类似的方式来的Oracle SQL - 查询时间限制
select * from mytable where rownum <= 1000;
将如何给我的第1000行的查询结果的,是有办法
select * from mytable where runtime <= 1000;
这将返回运行查询的第一个1000 <时间单元中获得的结果?
Oracle does not support this,至少不像你的例子那样容易理解。
One blog我发现能够限制用户在他们所做的某个资源组中的执行时间。他们为所述用户创建了一个特殊组,然后他们为该用户定义了他们称为LIMIT_EXEC_TIME
的资源计划。他们的代码参考如下:
set serverout on size 5555
--
-- first remove an existing active plan
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN ='';
--
-- delete any existing plan or group
-- we have to create a pending area first
exec dbms_resource_manager.clear_pending_area();
exec dbms_resource_manager.create_pending_area();
exec dbms_resource_manager.DELETE_PLAN ('LIMIT_EXEC_TIME');
exec dbms_resource_manager.DELETE_CONSUMER_GROUP ('GROUP_WITH_LIMITED_EXEC_TIME');
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA;
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
begin
dbms_resource_manager.create_pending_area();
--
-- we need a consumer group that maps to the desired oracle user:
dbms_resource_manager.create_consumer_group(
CONSUMER_GROUP=>'GROUP_WITH_LIMITED_EXEC_TIME',
COMMENT=>'This is the consumer group that has limited execution time per statement'
);
dbms_resource_manager.set_consumer_group_mapping(
attribute => DBMS_RESOURCE_MANAGER.ORACLE_USER,
value => 'PYTHIAN',
consumer_group =>'GROUP_WITH_LIMITED_EXEC_TIME'
);
-- and we need a resource plan:
dbms_resource_manager.create_plan(
PLAN=> 'LIMIT_EXEC_TIME',
COMMENT=>'Kill statement after exceeding total execution time'
);
-- now let's create a plan directive for that special user group
-- the plan will cancel the current SQL if it runs for more than 120 sec
dbms_resource_manager.create_plan_directive(
PLAN=> 'LIMIT_EXEC_TIME',
GROUP_OR_SUBPLAN=>'GROUP_WITH_LIMITED_EXEC_TIME',
COMMENT=>'Kill statement after exceeding total execution time',
SWITCH_GROUP=>'CANCEL_SQL',
SWITCH_TIME=>15,
SWITCH_ESTIMATE=>false
);
dbms_resource_manager.create_plan_directive(
PLAN=> 'LIMIT_EXEC_TIME',
GROUP_OR_SUBPLAN=>'OTHER_GROUPS',
COMMENT=>'leave others alone',
CPU_P1=>100
);
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA;
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
end;
/
exec dbms_resource_manager_privs.grant_switch_consumer_group('PYTHIAN','GROUP_WITH_LIMITED_EXEC_TIME',false);
exec dbms_resource_manager.set_initial_consumer_group('PYTHIAN','GROUP_WITH_LIMITED_EXEC_TIME');
select * from DBA_RSRC_CONSUMER_GROUPS;
select * from DBA_RSRC_GROUP_MAPPINGS;
select * from DBA_RSRC_PLANS;
select * from DBA_RSRC_PLAN_DIRECTIVES;
-- to enable it:
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN ='LIMIT_EXEC_TIME';
SELECT se.sid sess_id, co.name consumer_group,
se.state, se.consumed_cpu_time cpu_time, se.cpu_wait_time, se.queued_time
FROM v$rsrc_session_info se, v$rsrc_consumer_group co
WHERE se.current_consumer_group_id = co.id;
select username,resource_CONSUMER_GROUP,count(*) from v$session group by username,resource_CONSUMER_GROUP;
部分结果
查询可以返回部分结果,但查询也将抛出异常“ORA-00040:活动时间超出限制 - 呼叫中止”,但必须被客户忽略。
create or replace function sleep_cpu return number authid current_user is
v_loop number := 0;
begin
for i in 1 .. 10000000 loop
v_loop := v_loop + 1;
end loop;
return v_loop;
end;
/
SQL * Plus能够证明能够阅读部分结果客户端:
SQL> set timing on
SQL> select sleep_cpu()
2 from dual
3 connect by level <= 100;
SLEEP_CPU()
-----------
10000000
10000000
10000000
10000000
10000000
10000000
10000000
10000000
10000000
10000000
10000000
10000000
10000000
10000000
10000000
ERROR:
ORA-00040: active time limit exceeded - call aborted
15 rows selected.
Elapsed: 00:00:08.52
SQL>
注意经过的时间
这可以用做了很多CPU工作的功能来模拟在这个例子中是8秒。我将超时设置为5秒,这表明很难获得良好的精度。
CPU时间,不经过时间的
资源管理器只计算CPU时间,不经过时间。尽管文档说明了这一点。 Pythian文章中的一条评论表明,这种行为可以通过ALTER SYSTEM SET EVENT = '10720 trace name context forever, level 16384' scope=spfile;
(以及重新启动)进行更改,但这对我无效。因为它不使用CPU 100秒
create or replace function sleep_no_cpu return number authid current_user is
begin
execute immediate 'begin dbms_lock.sleep(1); end;';
return 1;
end;
/
这个SELECT将整个百秒运行:
例如,创建此功能。
select sleep_cpu()
from dual
connect by level <= 100;
我也看到了这个页面,并且认为它看起来像比它值得的更努力的方式,哈哈。我也不太确定这是否会返回部分结果,你知道吗? – Apollys
@Abollys博客的措辞使我觉得它不会返回任何东西。他们并没有说明这个方面的工作原理。 –
@Apollys文章中提到的“限制查询时间”是值得的。 –
我想不出一种方法,我认为这没什么意义。什么是用例? – BobC
你是什么意思“什么是用例?”?!?!?用例是我想在给定的时间内检索我的查询的一些结果......你可能会问为什么'rownum <= n'的用例,你可以运行整个查询并忽略除第一个'n'行之外的结果! – Apollys
前N种查询通常具有有效的业务案例。例如,按销售量给我排名前1000的销售人员。我无法想象一个有效的业务案例,其结果是基于查询需要多长时间。在很多情况下,结果集被确定为“整体”。 – BobC