Automatic Database Diagnostic Monitor (ADDM) in Oracle Database 10g

Dit artikel beschrijft verschillende methodes om rapporten te produceren van de Automatic Database Diagnostic Monitor (ADDM) in Oracle 10g.

 

  • Overzicht
  • Enterprise Manager
  • addmrpt.sql Script
  • DBMS_ADVISOR
  • Quick Tune
  • Views Overzicht

Overzicht

De Automatic Database Diagnostic Monitor (ADDM) analiseert data in de Automatic Workload Repository (AWR) om potentiele bottlenecks te achterhalen. Voor iedere opgespoorde issue zal hij het root probleem opsporen en een aanbeveling doen om het probleem op te lossen. Een ADDM analyse opdracht wordt uitgevoerd en de resultaten en aanbevelingen worden opgeslagen in de database iedere keer als de AWR een snapshot neemt, aangenomen wordt wel dat de STATISTICS_LEVEL parameter op TYPICAL of ALL is gezet.
De ADDM analyse omvat:

  • CPU load o Memory gebruik
  • I/O gebruik
  • Resource intensieve SQL
  • Resource intensieve PL/SQL en Java
  • RAC zaken
  • Application zaken
  • Database configuratie zaken
  • Gemeenschappelijke zaken
  • Object contentie

 

Er zijn verschillende manieren om rapporten te produceren van de ADDM analyses, welke later uitgelegd zullen worden, maar ze hebben allemaal hetzelfde formaat. De resultaten(problemen) worden weergegeven in volgorde van potentiele impact op de database performance, samen met aanbevelingen om het probleem op te lossen en de symptomen die hebben gelijd tot de ontdekking van het probleem. Een voorbeeld van een test instance:

 
FINDING 1: 59% impact (944 seconds)--the buffer cache was undersized causing significant additional read I/O.
RECOMMENDATION 1: DB Configuration, 59% benefit (944 seconds)
ACTION: Increase SGA target size by increasing the value of parameter "sga_target" by 28 M.
SYMPTOMS THAT LED TO THE FINDING: Wait class "User I/O" was consuming significant database time. (83% impact [1336 seconds])

De aanbevelingen kunnen betaan uit:

  • Hardware veranderingen
  • Database configuratie veranderingen 
  • Schema veranderingen
  • Application veranderingen
  • Gebruik maken van ander adviseurs

De analyse van I/O performance wordt beïnvloed door de DBIO_EXPECTED parameter welke gezet zou moeten worden naar een gemiddelde tijd (in microseconde) die nodig is om 1 enkel databaseblok te lezen van disk. Typische waarden variëren van 5000 tot 20000 microseconden.
De parameter kan gezet worden met:

 
EXECUTE DBMS_ADVISOR.set_default_task_parameter('ADDM', 'DBIO_EXPECTED', 8000);

Enterprise manager

De Enterprise manager is de meest voor de hand liggende plek om de ADDM rapporten te bekijken. De "Performance Analysis" sectieon op de "Home" pagina geeft een lijst van de top 5 bevindingen van de laatste ADDM analyze taak. Specifieke rapporten kunnen geproduceerd worden door op de "Advisor Central" link te klikken, en dan de "ADDM" link. De pagina die je nu ziet geeft je de mogelijkheid om een begin en eind snapshot te selecteren, een ADDM taak te creeren en het resultaat te bekijken door op een aantal links te klikken.

addmrpt.sql Script

Het addmrpt.sql script kan gebruikt worden om een rapportage vanuit SQL*Plus te generen. Het script is op de volgende plek te vinden:

-- UNIX@/u01/app/oracle/product/10.1.0/db_1/rdbms/admin/addmrpt.sql
-- Windows@d:\oracle\product\10.1.0\db_1\rdbms\admin\addmrpt.sql

Deze laat je alle beschikbare snapshots zien en prompt je om een start en eind snapshot op te geven samen de naam die je aan het rapport wilt geven.

DBMS_ADVISOR

De DBMS_ADVISOR package kan gebruikt worden om een advisory taak de creeren en te runnen, inclusief SQL Access Advisor taken. Het volgende voorbeeld hoe het is gebruikt om een typisch SQL Access Advisor script te maken, te runnen en de uitkomst te 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

-- Maak 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);

-- Maak een workload.

SELECT COUNT(*)
INTO l_num_found
FROM user_advisor_sqlw_sum
WHERE workload_name = l_wkld_name;
IF l_num_found = 0 THEN
DBMS_ADVISOR.create_sqlwkld(workload_name => l_wkld_name);
END IF;

-- Link de workload aan de 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 THEN
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 de 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 van het SET LONG commando zal aangepast moeten 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 adviezen kan je laten zien door gebruik te maken van de vorige query met de juiste naam gespecificeerd.

Gerelateerde Views

De volgende views kunnen gebruikt worden om de ADDM resultaten te laten zien zonder gebruik te maken van de Enterprise Manager of de GET_TASK_REPORT functie:

  • DBA_ADVISOR_TASKS - Basis informatie over bestaande taken.
  • DBA_ADVISOR_LOG - Status informatie over bestaande taken. 
  • DBA_ADVISOR_FINDINGS - Mogelijke problemen voor een bestaande taak. 
  • DBA_ADVISOR_RECOMMENDATIONS - Aanbevelingen voor de problemen die door een bestaande taak zijn gevonden.

 

 

Advertentie

>

Poll

Voorkeur
 

Wie is er aanwezig

We hebben 71 gasten online