SQL Access Advisor in Oracle Database 10g
SQL Access Advisor in Oracle Database 10g - De SQL Access Advisor doet suggesties over indexen en materialized views die wellicht de performance omhoog brengt. Dit artikel beschrijft hoe de SQL Access Advisor in Oracle 10g te gebruiken.

* Enterprise Manager
* DBMS_ADVISOR
* Quick Tune
* Relateerde Views

Enterprise Manager
De SQL Access Advisor is voor de Enterprise Manager toegankelijk. Specifieke reports kunnen gemaakt worden door op de "Advisor Central" link, te klikken en dan op de "SQL Access Advisor" link. De getoonde pagina stelt je in staat een workload te creëren en een SQL Access Advisor task. Als de taak klaar is kan je informatie over de bevindingen en de aanbevelingen lezen.

DBMS_ADVISOR
De DBMS_ADVISOR package kan gebruikt worden om welk advisory task dan ook te executen, waaronder SQL Access Advisor tasks. Het volgende voorbeeld laat zien hoe het gebruikt wordt om een typisch SQL Access Advisor script te creëren, executen en laten zien voor de huidige workload:

DECLARE
l_taskname VARCHAR2(30) := 'test_sql_access_task';
l_task_desc VARCHAR2(128) := 'Test SQL Access Task';
l_wkld_name VARCHAR2(30) := 'test_work_load';
l_saved_rows NUMBER := 0;
l_failed_rows NUMBER := 0;
l_num_found NUMBER;
BEGIN
-- Creëer een SQL Access Advisor task.
DBMS_ADVISOR.create_task (
advisor_name => DBMS_ADVISOR.sqlaccess_advisor,
task_name => l_taskname,
task_desc => l_task_desc);

-- Reset de task.
DBMS_ADVISOR.reset_task(task_name => l_taskname);

-- Creëer een workload.
SELECT COUNT(*)
INTO l_num_found
FROM user_advisor_sqlw_sum
WHERE workload_name = l_wkld_name;

IF l_num_found = 0 deN
DBMS_ADVISOR.create_sqlwkld(workload_name => l_wkld_name);
END IF;

-- Link de workload aan task.
SELECT count(*)
INTO l_num_found
FROM user_advisor_sqla_wk_map
WHERE task_name = l_taskname
AND workload_name = l_wkld_name;

IF l_num_found = 0 deN
DBMS_ADVISOR.add_sqlwkld_ref(
task_name => l_taskname,
workload_name => l_wkld_name);
END IF;

-- Zet de workload parameters.
DBMS_ADVISOR.set_sqlwkld_parameter(l_wkld_name, 'ACTION_LIST', DBMS_ADVISOR.ADVISOR_UNUSED);
DBMS_ADVISOR.set_sqlwkld_parameter(l_wkld_name, 'MODULE_LIST', DBMS_ADVISOR.ADVISOR_UNUSED);
DBMS_ADVISOR.set_sqlwkld_parameter(l_wkld_name, 'SQL_LIMIT', DBMS_ADVISOR.ADVISOR_UNLIMITED);
DBMS_ADVISOR.set_sqlwkld_parameter(l_wkld_name, 'ORDER_LIST', 'PRIORITY,OPTIMIZER_COST');
DBMS_ADVISOR.set_sqlwkld_parameter(l_wkld_name, 'USERNAME_LIST', DBMS_ADVISOR.ADVISOR_UNUSED);
DBMS_ADVISOR.set_sqlwkld_parameter(l_wkld_name, 'VALID_TABLE_LIST', DBMS_ADVISOR.ADVISOR_UNUSED);

DBMS_ADVISOR.import_sqlwkld_sqlcache(l_wkld_name, 'REPLACE', 2, l_saved_rows, l_failed_rows);

-- Zet task parameters.
DBMS_ADVISOR.set_task_parameter(l_taskname, '_MARK_IMPLEMENTATION', 'FALSE');
DBMS_ADVISOR.set_task_parameter(l_taskname, 'EXECUTION_TYPE', 'INDEX_ONLY');
DBMS_ADVISOR.set_task_parameter(l_taskname, 'MODE', 'COMPREHENSIVE');
DBMS_ADVISOR.set_task_parameter(l_taskname, 'STORAGE_CHANGE', DBMS_ADVISOR.ADVISOR_UNLIMITED);
DBMS_ADVISOR.set_task_parameter(l_taskname, 'DML_VOLATILITY', 'TRUE');
DBMS_ADVISOR.set_task_parameter(l_taskname, 'ORDER_LIST', 'PRIORITY,OPTIMIZER_COST');
DBMS_ADVISOR.set_task_parameter(l_taskname, 'WORKLOAD_SCOPE', 'PARTIAL');
DBMS_ADVISOR.set_task_parameter(l_taskname, 'DEF_INDEX_TABLESPACE', DBMS_ADVISOR.ADVISOR_UNUSED);
DBMS_ADVISOR.set_task_parameter(l_taskname, 'DEF_INDEX_OWNER', DBMS_ADVISOR.ADVISOR_UNUSED);
DBMS_ADVISOR.set_task_parameter(l_taskname, 'DEF_MVIEW_TABLESPACE', DBMS_ADVISOR.ADVISOR_UNUSED);
DBMS_ADVISOR.set_task_parameter(l_taskname, 'DEF_MVIEW_OWNER', DBMS_ADVISOR.ADVISOR_UNUSED);

-- Execute de task.
DBMS_ADVISOR.execute_task(task_name => l_taskname);
END;
/

-- Laat het resultaat script zien.
SET LONG 100000
SET PAGESIZE 50000
SELECT DBMS_ADVISOR.get_task_script('test_sql_access_task') AS script
FROM dual;
SET PAGESIZE 24

De waarde voor het SET LONG commando moet aangepast worden om het hele script te kunnen laten zien.

Quick Tune
Als je alleen een individueel statement wil tunen, kan je de QUICK_TUNE procedure als volgt gebruiken:

BEGIN
DBMS_ADVISOR.quick_tune(
advisor_name => DBMS_ADVISOR.SQLACCESS_ADVISOR,
task_name => 'emp_quick_tune',
attr1 => 'SELECT e.* FROM emp e WHERE UPPER(e.ename) = ''SMITH''');
END;
/

Alle aanbevelingen kunnen dan middels de bovenstaande query met invulling van de juiste naam gezien laten worden.

Related Views
De volgende views kunnen gebruikt worden om de SQL Access Advisor output te laten zien zonder gebruik te maken van de Enterprise Manager of de get_task_script functie:

* DBA_ADVISOR_TASKS - Basic informatie over bestaande tasks.
* DBA_ADVISOR_LOG - Status informatie over bestaande tasks.
* DBA_ADVISOR_FINDINGS - Bevindingen gevonden voor een bestaande tasks.
* DBA_ADVISOR_RECOMMENDATIONS - Aanbevelingen voor de problemen gevonden door een bestaande task.

Voor meer informatie:

* DBMS_ADVISOR
 

Advertentie

>

Poll

Voorkeur
 

Wie is er aanwezig

We hebben 168 gasten online