Oracle Sql advisors - ghdrako/doc_snipets GitHub Wiki
SQL Tunning Advisor
SQL Tuning Advisor can be run on individual SQL statements or SQL tuning sets. SQL Tuning Advisor requires a separate license as part of the Oracle Database Tuning Pack.
The USER_ADVISOR_TASKS
and V$ADVISOR_PROGRESS
data dictionary views can be queried to monitor the progress of a SQL Tuning Advisor task.
Creating and Executing a SQL Tuning Advisor Task in SQL*Plus
DECLARE
sqlstmt CLOB;
taskname VARCHAR2(30);
BEGIN
sqlstmt := 'select r.region,s.totalsales from sales s, regions r where
s.region_no = r.region_no group by r.region_no';
taskname := DBMS_SQLTUNE.CREATE_TUNING_TASK (
sql_text => sqlstmt,
bind_list => sql_binds(anydata.ConvertNumber(100)),
user_name => 'tfm',
scope => 'COMPREHENSIVE',
time_limit => 60,
task_name => 'totalsales_sql_sta_task',
description => 'Individual Query - SQL Tuning Advisor Task');
END;
/
BEGIN DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name=>'totalsales_sql_sta_task');
END;
/
SET LONGCHUNKSIZE 1500
SET LINESIZE 250
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'totalsales_sql_sta_task' ) FROM DUAL;
SQL Access Advisor
Analyze SQL workloads and provide performance improvement by suggesting recommendations for materialized views, partitioning, and indexes.
SQL Access Advisor can be run on the following SQL workloads:
- Current and recent SQL activity
- SQL tuning set
- Hypothetical workload
SQL Access Advisor also provides recommendations for dropping unused indexes. In addition to covering full, refreshable materialized views, SQL Access Advisor can be leveraged to make materialized views fast-refreshable for an optimal implementation. SQL Access Advisor is part of the SQL Tuning Pack licensed option.
The USER_ADVISOR_SQLA_WK_STMTS and USER_ADVISOR_ACTIONS data dictionary views can be queried to view the recommendations generated by the SQL Access Advisor.
DECLARE
taskname varchar2(30) := 'SQL_ACCESS_9940';
task_desc varchar2(256) := 'SQL Access Advisor';
task_or_template varchar2(30) := 'SQLACCESS_EMTASK';
task_id number := 0;
num_found number;
sts_name varchar2(256) := 'STS_CUSTOM_9940';
sts_owner varchar2(30) := 'SYS';
BEGIN
-- Create the SQL Access Advisor Task
dbms_advisor.create_task(DBMS_ADVISOR.SQLACCESS_ADVISOR,
task_id,taskname,task_desc,task_or_template);
-- Reset the SQL Access Advisor Task
dbms_advisor.reset_task(taskname);
-- Delete Previous STS Workload Task Link
select count(*) into num_found from user_advisor_sqla_wk_map where task_name = taskname and workload_name = sts_name;
IF num_found > 0 THEN
dbms_advisor.delete_sts_ref(taskname, sts_owner, sts_name);
END IF;
-- Link STS Workload to Task
dbms_advisor.add_sts_ref(taskname,sts_owner, sts_name);
-- Set the STS Workload Parameters
dbms_advisor.set_task_parameter(taskname,'VALID_ACTION_LIST',
DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,'VALID_MODULE_LIST', DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,'SQL_LIMIT',
DBMS_ADVISOR.ADVISOR_UNLIMITED);
dbms_advisor.set_task_parameter(taskname,'VALID_USERNAME_LIST',
DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,'VALID_TABLE_LIST',
DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,'INVALID_TABLE_LIST',
DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,'INVALID_ACTION_LIST',
DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,
'INVALID_USERNAME_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,'INVALID_MODULE_LIST',
DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,
'VALID_SQLSTRING_LIST',DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,
'INVALID_SQLSTRING_LIST','"@!"');
/* Set Task Parameters */
dbms_advisor.set_task_parameter(taskname,'ANALYSIS_SCOPE',
'ALL');
dbms_advisor.set_task_parameter(taskname,'RANKING_MEASURE',
'PRIORITY,OPTIMIZER_COST');
dbms_advisor.set_task_parameter(taskname,
'DEF_PARTITION_TABLESPACE',DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,'TIME_LIMIT',10000);
dbms_advisor.set_task_parameter(taskname,'MODE',
'COMPREHENSIVE');
dbms_advisor.set_task_parameter(taskname,'STORAGE_CHANGE',DBMS_ADVISOR.ADVISOR_UNLIMITED);
dbms_advisor.set_task_parameter(taskname,'DML_VOLATILITY',
'TRUE');
dbms_advisor.set_task_parameter(taskname,'WORKLOAD_SCOPE',
'PARTIAL');
dbms_advisor.set_task_parameter(taskname,
'DEF_INDEX_TABLESPACE',DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,'DEF_INDEX_OWNER',
DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,
'DEF_MVIEW_TABLESPACE', DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,
'DEF_MVIEW_OWNER',DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,
'DEF_MVLOG_TABLESPACE',DBMS_ADVISOR.ADVISOR_UNUSED);
dbms_advisor.set_task_parameter(taskname,'CREATION_COST',
'TRUE');
dbms_advisor.set_task_parameter(taskname,'JOURNALING','4');
dbms_advisor.set_task_parameter(taskname,
'DAYS_TO_EXPIRE','30');
-- Execute the SQL Access Advisor Task
dbms_advisor.execute_task(taskname);
END;
SQL Repair Advisor
SQL Repair Advisor is leveraged for repairing SQL statements at the database server tier that end up in critical failure. SQL Repair Advisor performs a comprehensive analysis on the failed SQL statement and may provide a SQL patch recommendation that fixes the failure issue by instructing the Query Optimizer to select a different execution plan that avoids failure.