如果我们有一个问题 SQL 语句与SQL_ID 556prbqmcw8d1",我们可能会执行以下操作。
输出建议
DECLARE l_task VARCHAR2(50); l_report CLOB; BEGIN l_task := SYS.DBMS_SQLDIAG.create_diagnosis_task( sql_id => '556prbqmcw8d1', task_name => 'sql_repair_task', problem_type => DBMS_SQLDIAG.problem_type_execution_error); SYS.DBMS_SQLDIAG.execute_diagnosis_task(task_name => l_task); l_report := SYS.DBMS_SQLDIAG.report_diagnosis_task(task_name => l_task); DBMS_OUTPUT.PUT_LINE ('Report : ' || l_report); END; /
参数使用包中定义的以下常量之一定义。
PROBLEM_TYPE
DBMS_SQLDIAG
PROBLEM_TYPE_PERFORMANCE
- SQL 性能不佳。PROBLEM_TYPE_WRONG_RESULTS
- 查询似乎给出不一致的结果。PROBLEM_TYPE_COMPILATION_ERROR
- 查询无法编译,即使它应该有效。PROBLEM_TYPE_EXECUTION_ERROR
- 查询会编译,但会导致运行时错误,可能是由于执行计划不周,或者遇到 Bug 的执行计划。PROBLEM_TYPE_ALT_PLAN_GEN
- 用户希望顾问寻找替代计划。
检查报表的输出,应用建议。
BEGIN SYS.DBMS_SQLDIAG.accept_sql_patch( task_name => 'sql_repair_task', task_owner => 'SYS', replace => TRUE); END; /
直接给sql添加hint
BEGIN SYS.DBMS_SQLDIAG_INTERNAL.i_create_patch( sql_text => 'SELECT * FROM big_table WHERE id >= 8000', hint_text => 'PARALLEL(big_table,10)', name => 'big_table_sql_patch'); END; /
12.2+
DECLARE l_patch_name VARCHAR2(32767); BEGIN -- SQL Text l_patch_name := SYS.DBMS_SQLDIAG.create_sql_patch( sql_text => 'SELECT * FROM big_table WHERE id >= 8000', hint_text => 'PARALLEL(big_table,10)', name => 'big_table_sql_patch_1'); -- SQL ID l_patch_name := SYS.DBMS_SQLDIAG.create_sql_patch( sql_id => '19v5guvsgcd1v', hint_text => 'PARALLEL(big_table,10)', name => 'big_table_sql_patch_2'); END; /
如果以后要删除 SQL 修补程序,可以使用该过程执行此操作。DROP_SQL_PATCH
BEGIN SYS.DBMS_SQLDIAG.drop_sql_patch(name => 'my_sql_patch'); END; /dba_sql_patch