在运行之前验证查询将运行多长时间?

时间:2016-06-12 07:28:56

标签: oracle oracle11g

在进行查询之前,尝试了解查询运行的时间是否有意义。

示例:

允许用户对数据进行历史查询,阻止用户创建长时间运行的查询,可以进行多长时间的验证?

1 个答案:

答案 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$;