Hur du kör Oracle 12câ € s SQL Tuning Advisor

July 12

Oracle 12c erbjuder ett användbart verktyg som heter SQL Tuning Advisor. Du kan använda denna inbyggda verktyg för att ge förslag eller rekommendationer om vissa SQL-satser. Även om det kanske inte alltid ge perfekt råd, precis som allt annat, med den i din verktygslåda för tuning tekniker är fördelaktigt.

  1. Använd PL / SQL och paketet för den inre DBMS_SQL_TUNE att skapa en stäm uppgift. Skriv detta:

    FÖRKLARA
    l_sql VARCHAR2 (500);
    l_sql_tune_task_id VARCHAR2 (100);
    BÖRJA
    l_sql: = "SELECT förnamn, efternamn, department_name '||
    "FROM anst GÅ avdelningar ANVÄNDA (department_id) ||
    'WHERE efternamn =' 'Hopkins' '';
    l_sql_tune_task_id: = DBMS_SQLTUNE.create_tuning_task (
    sql_text => l_sql,
    användarnamn => 'HR',
    räckvidd => DBMS_SQLTUNE.scope_comprehensive,
    time_limit => 60,
    uppgiftsnamn => 'emp_dept_tuning_task',
    description => 'Tuning uppgift för en EMP till AVDELNINGEN ansluta fråga.');
    DBMS_OUTPUT.put_line ('l_sql_tune_task_id:' || l_sql_tune_task_id);
    END;
    /

    Du bör se följande:

    PL / SQL-procedur framgångsrikt.

    I det föregående kommandot, notera TIME_LIMIT 60 Det begränsar handläggningstiden till 60 sekunder. Du kanske inte alltid vill köra något sånt här under långa perioder i databasen, eftersom det medför systemresurser.

  2. Kör tuning rådgivare med din uppgift genom att skriva detta:

    EXEC DBMS_SQLTUNE.execute_tuning_task (uppgiftsnamn => 'emp_dept_tuning_task');

    På grund av begränsningen av 60 sekunder anges i aktivitets skapande, kan detta steg ta upp till 60 sekunder att genomföra. Under denna tid, vann? Ditt snabba € t komma tillbaka.

    När den är klar, ska du se den här:

    PL / SQL-procedur framgångsrikt.

    Om du € ve ställa in en längre tid och blir otålig, kan du öppna en annan SQL fönstret för att se till att uppgiften fortfarande körs genom att skriva

    VÄLJ uppgiftsnamn, status, execution_start
    FRÅN dba_advisor_log WHERE ägare = 'HR';

    Du ser något liknande följande:

    Uppgiftsnamn STATUS EXECUTION_START
    ------------------------------ --------------- ----- ---------------
    emp_dept_tuning_task EXECUTING 19-JUL-2013 15:35:42

  3. När exekveringen är klar, kan du se resultaten genom att köra BMS_SQLTUNE.report_tuning_task proceduren. Skriv följande:

    VÄLJA
    DBMS_SQLTUNE.report_tuning_task ('emp_dept_tuning_task') AS rekommendationer
    FRÅN dubbla;

    För tydlighetens rymden, weâ € ve klippt vissa avsnitt från utgången som följer, men du ser ut ungefär så här:

    REKOMMENDATIONER
    -------------------------------------------------- -------------------------------
    ALLMÄN INFORMATION AVSNITT
    -------------------------------------------------- -------------------------------
    Tuning Uppgift Namn: emp_dept_tuning_task
    Tuning Uppgift Ägare: HR
    Arbetsbelastning Typ: Singel SQL Statement
    Omfattning: HELTÄCKANDE
    TIDSFRIST (sekunder): 60
    Slutförande Status: AVBRUTEN
    Började på: 2013/07/19 15:21:39
    Avslutade på: 2013/07/19 15:22:43
    -------------------------------------------------- -------------------------------
    Fel: ORA-13639: Den pågående operationen avbröts eftersom det tog för lång tid.
    -------------------------------------------------- -------------------------------
    -------------------------------------------------- -------------------------------
    Schema Namn: HR
    SQL-ID: 47uvvzcuu5mdg
    SQL Text: SELECT förnamn, efternamn, department_name FROM anst GÅ
    avdelningar ANVÄNDA (department_id) WHERE efternamn = 'Hopkins'
    REKOMMENDATIONER
    -------------------------------------------------- -------------------------------
    -------------------------------------------------- -------------------------------
    RESULTAT AVSNITT (1 fynd)
    -------------------------------------------------- -------------------------------
    1- Index Finding (se förklara planer avsnitt nedan)
    --------------------------------------------------
    Utförandet planen av detta uttalande kan förbättras genom att skapa en eller flera
    index.
    Rekommendation (uppskattad nytta: 99,98%)
    ------------------------------------------
    - Tänk att köra Access Advisor för att förbättra den fysiska schemat designen
    eller skapar den rekommenderade index.
    skapa index HR.IDX $$ _ 03170001 om HR.EMP ("EFTERNAMN");
    Bakgrund
    ---------
    Skapa de rekommenderade index avsevärt förbättrar utförandet planen
    av detta uttalande. Dock kan det vara bättre att köra "Åtkomst Advisor"
    med hjälp av en representativ SQL arbetsbelastning i motsats till ett enda uttalande. Detta
    gör det möjligt att få omfattande index rekommendationer som tar hänsyn
    REKOMMENDATIONER
    -------------------------------------------------- ------------------------------
    kontoindex underhåll overhead och extra utrymme förbrukning.
    ... Utgång klippt ...

    Den senare delen av rapporten visar de före och efter exekveringsplaner. I det här fallet, youâ € ve sett förut när du var generera planer exekverings. Gå vidare och lägga indexet, regenerera exekveringsplan, och se om du € ve gjort en förbättring.

    Innan du lägger indexet, notera att rekommendationerna ger SQL för att lägga index:

    Rekommendation (uppskattad nytta: 99,98%)
    ------------------------------------------
    - Tänk att köra Access Advisor för att förbättra den fysiska schemat designen
    eller skapar den rekommenderade index.
    skapa index HR.IDX $$ _ 03170001 om HR.EMP ("EFTERNAMN");

    Observera också att Oracle ger en varning:

    REKOMMENDATIONER
    -------------------------------------------------- ------------------------------
    kontoindex underhåll overhead och extra utrymme förbrukning.

  4. Lägg till index med ditt eget namn genom att skriva detta:

    CREATE INDEX emp_last_name_idx PÅ emp (efternamn);

    Du bör se någonting som liknar följande:

    Index skapat.

  5. Ta en titt på exekveringsplan. Skriv följande:

    förklara plan för
    SELECT förnamn, efternamn, department_name
    FROM anst gå avdelningar använder (department_id)
    WHERE efternamn = 'Hopkins';
    Förklaras.
    Förfluten: 00: 00: 00,09

    Och skriv sedan

    @? \ RDBMS \ admin \ utlxpls

    Du bör se utdata så här:

PLAN_TABLE_OUTPUT
-------------------------------------------------- -------------------------------
Plan hashvärde: 1505300146
-------------------------------------------------- -------------------------------
| Id | Användning | Namn | Rader | Bytes | Kostnad (% CPU) | Tid |
-------------------------------------------------- -------------------------------
| 0 | VÄLJ UTTALANDE | | 1 | 34 | 5 (0) | 00:00:01 |
| 1 | kapslade slingor | | | | | |
| 2 | kapslade slingor | | 1 | 34 | 5 (0) | 00:00:01 |
| 3 | TABELL TILLGÅNG INDEX ROWID doserad | Sweden | 1 | 18 | 4 (0) | 00:00:01 |
| * 4 | INDEX RANGE SCAN | EMP_LAST_NAME_IDX | 1 | | 3 (0) | 00:00:01 |
| * 5 | INDEX UNIK SCAN | DEPT_ID_PK | 1 | | 0 (0) | 00:00:01 |
| 6 | TABELL tillgång med INDEX ROWID | AVDELNINGAR | 1 | 16 | 1 (0) | 00:00:01 |
-------------------------------------------------- -------------------------------
Predikat information (identifieras av drift id):
-------------------------------------------------- -
4 - Tillgång ("EMP" "EFTERNAMN" = 'Hopkins'.)
5 - Tillgång ("EMP" "department_id" = "AVDELNINGAR" "department_id"..)

Nu när du € ve lagt index, ett par saker är uppenbara:

  • Kostnaden för planen sjönk 40336-5.
  • Det finns nu sex steg.
  • Den fullt bord scan är borta. Istället ser du använda din nya indexet.

Ofta en av de tuffa delarna om inställning av en databas är att ha en gedigen förståelse av ansökan och data. Frågan är kanske inte alltid är självklara. Ibland engagerande andra applikations och dataexperter hjälper.

Förklara för dem dina resultat och vad du föreslår. De kanske kan hjälpa dig att komma till en slutsats. Även om uppgifterna är en del av en paketerad tredjepartsprogram, ibland öppna en biljett med säljaren är rätt väg att gå.