Иногда бывает очень лениво разбираться, где косячит запрос. В данном случае сначала можно проверить возможности автомата. Как это делается:
1)
для начала грантуем пакет супермагу или тому пользователю, кем хотите тестировать проблемный запрос
Код:
GRANT ADVISOR TO SUPERMAG;
GRANT SELECT_CATALOG_ROLE TO SUPERMAG;
GRANT EXECUTE ON DBMS_SQLTUNE TO SUPERMAG;
2) очень простая последовательность
Код:
DECLARE
task_name VARCHAR2(30);
sqltext CLOB;
BEGIN
sqltext := 'проблемный запрос';
task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
sql_text => sqltext,
user_name => 'SUPERMAG',
scope => 'COMPREHENSIVE',
time_limit => 60,
task_name => 'sql_tuning_task',
description => 'some test');
END;
/
select task_name from dba_advisor_log where task_name not like 'ADDM%';
exec dbms_sqltune.execute_tuning_task (task_name => 'sql_tuning_task');
select status from dba_advisor_log where task_name='sql_tuning_task';
set linesize 1000
set long 10000
set longchunksize 10000
select dbms_sqltune.report_tuning_task('sql_tuning_task') from dual;
execute dbms_sqltune.accept_sql_profile(task_name => 'sql_tuning_task', task_owner => 'SYS', replace => TRUE);
exec dbms_sqltune.drop_tuning_task('sql_tuning_task');
SET SERVEROUTPUT ON
set linesize 1000
set long 10000
set longchunksize 10000
declare
stmt_task VARCHAR2(40);
begin
stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => '83r7gk2gtn5hj');
DBMS_OUTPUT.put_line('task_id: ' || stmt_task );
dbms_sqltune.execute_tuning_task (task_name => stmt_task);
DBMS_OUTPUT.put_line('report: ' || dbms_sqltune.report_tuning_task(stmt_task) );
end;
/
если честно, сей агрегат больше похож на астролога. Иногда выдает абсолютное "пальцем в небо", но в любом случае стОит присмотреться к тому, что оно выдает.