2016-06-12 34 views
2

在進行查詢之前,嘗試瞭解查詢運行多長時間是否合理?在運行之前驗證查詢將運行多久?

例子:

用戶被允許這樣做歷史查詢對數據,阻止用戶在創建運行長時間運行的查詢,可以爲此將花費多長時間做什麼驗證?

+2

我懷疑這是可能的,然後再運行查詢。如果您不想運行長查詢,請創建一個配置文件,將CPU_PER_CALL設置爲給定時間(例如2分鐘),然後將此配置文件分配給麻煩的用戶。如果總時間超過給定限制,Oracle將終止查詢。有關詳細信息,請參閱以下鏈接:https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6010.htm – krokodilko

+2

AFAIK沒有簡單的方法可以提前知道。當遇到同樣的問題時,我們使用資源計劃來限制某些用戶訪問數據庫資源:https://docs.oracle.com/cd/E11882_01/server.112/e25494/dbrm.htm – vercelli

+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$;