sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan jeg logge og finde de dyreste forespørgsler?

  1. Brug SQL Server Profiler (på værktøjsmenuen i SSMS) til at oprette et spor, der logger disse hændelser:

     RPC:Completed
     SP:Completed
     SP:StmtCompleted
     SQL:BatchCompleted
     SQL:StmtCompleted
    
  2. Du kan starte med standardsporskabelonen og beskære den. Du har ikke angivet, om dette var for en specifik database eller hele serveren, hvis det er til specifikke Db'er, inkluder kolonnen DatabaseID og indstil et filter til din DB (SELECT DB_ID('dbname') ). Sørg for, at den logiske læsedatakolonne er inkluderet for hver hændelse. Indstil sporingen for at logge på en fil. Hvis du efterlader dette spor for at køre uden opsyn i baggrunden, er det en god ide at indstille en maksimal sporingsfilstørrelse, f.eks. 500MB eller 1GB, hvis du har masser af plads (det kommer helt an på, hvor meget aktivitet der er på serveren, så du bliver nødt til at sutte den og se).

  3. Start kortvarigt sporingen, og sæt den derefter på pause. Gå til Filer->Eksporter->Scriptsporingsdefinition og vælg din DB-version, og gem til en fil. Du har nu et sql-script, der opretter et spor, der har meget mindre overhead end at køre gennem profileringsgrænsefladen. Når du kører dette script, vil det udlæse sporings-id'et (normalt @ID=2 ); noter dette ned.

  4. Når du har en sporingsfil (.trc) (enten er sporingen fuldført på grund af at nå den maksimale filstørrelse, eller du stoppede den kørende sporing vha.

    EXEC sp_trace_setstatus @ID, 0
    EXEC sp_trace_setstatus @ID, 2

Du kan indlæse sporingen i profiler, eller bruge ClearTrace (meget praktisk) eller indlæse den i en tabel som sådan:

SELECT * INTO TraceTable
FROM ::fn_trace_gettable('C:\location of your trace output.trc', default)

Derefter kan du køre en forespørgsel for at samle dataene som denne:

SELECT COUNT(*) AS TotalExecutions, 
    EventClass, CAST(TextData as nvarchar(2000))
 ,SUM(Duration) AS DurationTotal
 ,SUM(CPU) AS CPUTotal
 ,SUM(Reads) AS ReadsTotal
 ,SUM(Writes) AS WritesTotal
FROM TraceTable
GROUP BY EventClass, CAST(TextData as nvarchar(2000))
ORDER BY ReadsTotal DESC

Når du har identificeret de dyre forespørgsler, kan du generere og undersøge de faktiske udførelsesplaner.



  1. Oracle:hvordan man INDSÆTTER, hvis en række ikke eksisterer

  2. Mysql fejl 1452 - Kan ikke tilføje eller opdatere en underordnet række:en fremmednøgle begrænsning mislykkes

  3. DBCA Opret database dårlig REMOTE_LISTENER

  4. Efterfølgende nul