在进行查询之前,尝试了解查询运行的时间是否有意义。
示例:
允许用户对数据进行历史查询,阻止用户创建长时间运行的查询,可以进行多长时间的验证?
答案 0 :(得分:1)
可以使用EXPLAIN PLAN
估算查询运行时间。
创建一个函数以在给定查询上运行EXPLAIN PLAN
,找到时间估计值并返回该数字。
示例函数
create or replace function estimate_run_time_in_seconds(p_sql clob) return number is
v_statement_id number := round(dbms_random.value*100000000);
v_time_in_seconds number;
begin
execute immediate 'explain plan set statement_id = '''||v_statement_id||''' for '||p_sql;
select max(time)
into v_time_in_seconds
from plan_table
where statement_id = to_char(v_statement_id);
return v_time_in_seconds;
end;
/
示例结果
begin
dbms_output.put_line(estimate_run_time_in_seconds('select * from dual'));
dbms_output.put_line(estimate_run_time_in_seconds(
'select * from dba_objects cross join dba_users'));
end;
/
Results:
1
34
在实践中,这些估计将会有所改变。但如果你只是在寻找一个数量级的估计值,这可能就足够了。
有很多次优化器出现可怕的错误,我建议不要因为估计而完全阻止任何查询。相反,也许只是向用户提供警告。例如:" Oracle估计此查询将在X秒内运行!您确定要运行此查询吗?"
要提高估算准确度,您可能需要查看收集或手动调整系统统计信息。查看下表中的结果。您可能希望(非常小心!)更改某些值以使时间估计与实际时间保持一致。
select * from sys.aux_stats$;