sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag logga och hitta de dyraste frågorna?

  1. Använd SQL Server Profiler (på verktygsmenyn i SSMS) för att skapa ett spår som loggar dessa händelser:

     RPC:Completed
     SP:Completed
     SP:StmtCompleted
     SQL:BatchCompleted
     SQL:StmtCompleted
    
  2. Du kan börja med den vanliga spårmallen och beskära den. Du angav inte om detta var för en specifik databas eller hela servern, om det är för specifika Db:er, inkludera kolumnen DatabaseID och ställ in ett filter till din DB (SELECT DB_ID('dbname') ). Se till att den logiska läsdatakolumnen ingår för varje händelse. Ställ in spåret för att logga till en fil. Om du lämnar det här spåret för att köra obevakat i bakgrunden är det en bra idé att ställa in en maximal spårningsfilstorlek, säg 500MB eller 1GB om du har gott om utrymme (det beror helt på hur mycket aktivitet det är på servern, så du måste suga den och se).

  3. Starta spåret kort och pausa det sedan. Gå till Arkiv->Exportera->Scriptspårningsdefinition och välj din DB-version och spara till en fil. Du har nu ett sql-skript som skapar ett spår som har mycket mindre overhead än att köra genom profileringsgränssnittet. När du kör det här skriptet kommer det att mata ut spårnings-ID:t (vanligtvis @ID=2 ); notera detta.

  4. När du har en spårningsfil (.trc) (antingen slutfördes spårningen på grund av att den maximala filstorleken nåddes eller så stoppade du spårningen med

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

Du kan ladda spåret i profiler, eller använda ClearTrace (mycket praktiskt) eller ladda det i en tabell så här:

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

Sedan kan du köra en fråga för att aggregera data som den här:

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 identifierat de kostsamma frågorna kan du skapa och undersöka de faktiska genomförandeplanerna.



  1. MySQL skiftlägeskänslig fråga

  2. PostgreSQL:förbättrar pg_dump, pg_restore prestanda

  3. Behöver jag verkligen använda SET XACT_ABORT ON?

  4. Kontrollera om en postgresql-tabell finns under python (och förmodligen Psycopg2)