Så här genererar du ett statistikskript för att skapa en databas med endast statistik i SQL Server

I den här artikeln får du lära dig hur du genererar ett statistikskript med hjälp av databasmetadata för att skapa en databas med endast statistik i SQL Server.

Ursprunglig produktversion: SQL Server 2014, SQL Server 2012, SQL Server 2008

Ursprungligt KB-nummer: 914288

Inledning

DBCC CLONEDATABASE är den bästa metoden för att generera en schemabaserad klon av en databas för att undersöka prestandaproblem. Använd bara proceduren i den här artikeln när du inte kan använda DBCC CLONEDATABASE.

Frågeoptimeraren i Microsoft SQL Server använder följande typer av information för att fastställa en optimal frågeplan:

  • databasmetadata
  • maskinvarumiljö
  • databassessionstillstånd

Vanligtvis måste du simulera samma typer av information för att återskapa frågeoptimerarens beteende i ett testsystem.

Microsofts kundtjänst kan be dig att generera ett skript med databasmetadata för att undersöka ett problem med frågeoptimeraren. Den här artikeln beskriver stegen för att generera statistikskriptet och beskriver även hur frågeoptimeraren använder informationen.

Obs!

Nycklarna som sparas i dessa data kan innehålla PII-information. Om tabellen till exempel innehåller en kolumn för telefonnummer med statistik på den, kommer varje stegs höga nyckelvärde att finnas i skriptet för genererad statistik.

Skripta hela databasen

När du genererar en klondatabas med endast statistik kan det vara enklare och mer tillförlitligt att skripta hela databasen i stället för att skripta enskilda objekt. När du skriptar hela databasen får du följande fördelar:

  • Du undviker problem med saknade beroende objekt som krävs för att återskapa problemet.
  • Du behöver färre steg för att välja de nödvändiga objekten.

Observera att om du genererar ett skript för en databas och metadata för databasen innehåller tusentals objekt, förbrukar skriptprocessen betydande CPU-resurser. Vi rekommenderar att du genererar skriptet under låg belastning, eller så kan du använda det andra alternativet Skript för enskilda objekt för att generera skriptet för enskilda objekt.

Följ dessa steg för att skripta varje databas som refereras till av din fråga:

  1. Öppna SQL Server Management Studio.

  2. I Object Explorerexpanderar du Databaser och letar sedan upp den databas som du vill skripta.

  3. Högerklicka på databasen, peka på Uppgifter och välj sedan Generera skript.

  4. Kontrollera att rätt databas har valts i skriptguiden. Klicka här om du vill välja hela databasen skriptet och alla databasobjekt och välj sedan Nästa.

  5. I dialogrutan Välj skriptalternativ väljer du knappen Avancerat för att ändra följande inställningar från standardvärdet till det värde som visas i följande tabell.

    Skriptalternativ Värde att välja
    Ansi-utfyllnad Sant
    Fortsätt skripta vid fel Sant
    Generera skript för beroende objekt Sant
    Inkludera systemvillkorsnamn Sant
    Skriptsortering Sant
    Skriptinloggningar Sant
    Behörigheter på objektnivå för skript Sant
    Skriptstatistik Skriptstatistik och histogram
    Skriptindex Sant
    Skriptutlösare Sant

    Obs!

    Observera att alternativet Skriptinloggningar och alternativet Behörigheter på skriptobjektnivå kanske inte krävs om inte schemat innehåller objekt som ägs av andra inloggningar än dbo.

  6. Välj OK för att spara ändringarna och stäng sidan Avancerade skriptalternativ .

  7. Välj Spara till fil och välj alternativet Enskild fil .

  8. Granska dina val och välj Nästa.

  9. Välj Slutför.

Skript för enskilda objekt

Du kan bara skripta de enskilda objekt som refereras till av en viss fråga i stället för att skripta hela databasen. Men om inte alla databasobjekt har skapats med hjälp av WITH SCHEMABINDING -satsen kanske beroendeinformationen i systemtabellen sys.depends inte alltid är korrekt. Den här felaktigheten kan orsaka något av följande problem:

  • Skriptprocessen skriptar inte ett beroende objekt.

  • Skriptprocessen kan skripta objekt i fel ordning. Om du vill köra skriptet måste du redigera det genererade skriptet manuellt.

Därför rekommenderar vi inte att du skriptar enskilda objekt om inte databasen har många objekt och skript annars skulle ta för lång tid. Om du måste använda enskilda skriptobjekt följer du dessa steg:

  1. I SQL Server Management Studio expanderar du Databaser och letar sedan upp den databas som du vill skripta.

  2. Högerklicka på databasen, peka på Skriptdatabas som, peka sedan på SKAPA till och välj sedan Arkiv.

  3. Ange ett filnamn och välj sedan Spara.

    Kärndatabascontainern kommer att skriptas. Den här containern innehåller filer, filgrupper, databasen och egenskaper.

  4. Högerklicka på databasen, peka på Uppgifter och välj sedan Generera skript.

  5. Kontrollera att rätt databas är markerad och välj sedan Nästa.

  6. I dialogrutan Välj objekttyper väljer du Välj specifika databasobjekt och markerar alla databasobjekttyper som den problematiska frågan refererar till.

    Om frågan till exempel bara refererar till tabeller väljer du Tabeller. Om frågan refererar till en vy väljer du Vyer och tabeller. Om den problematiska frågan använder en användardefinierad funktion väljer du Funktioner.

  7. När du har valt alla objekttyper som refereras till av frågan väljer du Nästa.

  8. I dialogrutan Ange skriptalternativ väljer du knappen Avancerat och ändrar följande inställningar från standardvärdet till det värde som visas i följande tabell på sidan Avancerade skriptalternativ .

    Skriptalternativ Värde att välja
    Ansi-utfyllnad Sant
    Fortsätt skripta vid fel Sant
    Inkludera systemvillkorsnamn Sant
    Generera skript för beroende objekt Sant
    Skriptsortering Sant
    Skriptinloggningar Sant
    Behörigheter på objektnivå för skript Sant
    Skriptstatistik Skriptstatistik och histogram
    ANVÄNDA SKRIPTDATABAS Sant
    Skriptindex Sant
    Skriptutlösare Sant

    Obs!

    Observera att alternativen Skriptinloggningar och Behörigheter på objektnivå för skript kanske inte krävs om inte schemat innehåller objekt som ägs av andra inloggningar än dbo.

  9. Välj OK för att spara och stänga sidan Avancerade skriptalternativ .

    En dialogruta visas för varje databasobjekttyp som du valde i steg 7.

  10. I varje dialogruta väljer du de specifika tabellerna, vyerna, funktionerna eller andra databasobjekt och väljer sedan Nästa.

  11. Välj alternativet Skript till fil och ange sedan samma filnamn som du angav i steg 3.

  12. Välj Slutför för att starta skriptet.

    När skriptet är klart skickar du skriptfilen till Microsoft Support Engineer. Microsoft Support-teknikern kan också begära följande information:

    • Maskinvarukonfiguration, inklusive antalet processorer och hur mycket fysiskt minne som finns.

    • ANGE alternativ som var aktiva när du körde frågan.

    Observera att du kanske redan har angett den här informationen genom att skicka en SQLDiag-rapport eller en SQL Profiler-spårning. Du kan också ha använt en annan metod för att ange den här informationen.

Hur informationen används

Följande tabeller förklarar hur frågeoptimeraren använder den här informationen för att välja en frågeplan.

Metadata

Alternativ Förklaring
Begränsningar Frågeoptimeraren använder ofta begränsningar för att identifiera motsägelser mellan frågan och det underliggande schemat. Om frågan till exempel innehåller WHERE col = 5 -satsen och det finns en CHECK (col < 5) begränsning i den underliggande tabellen vet frågeoptimeraren att inga rader matchar. Frågeoptimeraren gör liknande typer av avdrag om nullbarhet. Satsen är till exempel WHERE col IS NULL känd för att vara sann eller falsk beroende på kolumnens nullbarhet och om kolumnen kommer från den yttre tabellen i en yttre koppling. Förekomsten av begränsningar för SEKUNDÄRNYCKEL är användbar för att fastställa kardinalitet och lämplig kopplingsordning. Frågeoptimeraren kan använda villkorsinformation för att eliminera kopplingar eller förenkla predikat. Dessa ändringar kan ta bort kravet på åtkomst till bastabellerna.
Statistik Statistikinformationen innehåller densitet och ett histogram som visar fördelningen av den inledande kolumnen i index- och statistiknyckeln. Beroende på predikatets natur kan frågeoptimeraren använda densitet, histogrammet eller båda för att uppskatta kardinaliteten för ett predikat. Aktuell statistik krävs för korrekta kardinalitetsuppskattningar. Kardinalitetsuppskattningarna används som indata för att beräkna kostnaden för en operator. Därför måste du ha bra kardinalitetsuppskattningar för att få optimala frågeplaner.
Tabellstorlek (antal rader och sidor) Frågeoptimeraren använder histogram och densitet för att beräkna sannolikheten för att ett visst predikat är sant eller falskt. Den slutliga kardinalitetsuppskattningen beräknas genom att multiplicera sannolikheten med antalet rader som den underordnade operatorn returnerar. Antalet sidor i tabellen eller indexet är en faktor för att beräkna I/O-kostnaden. Tabellstorleken används för att beräkna kostnaden för en genomsökning, och det är användbart när du beräknar antalet sidor som ska nås under en indexsökning.
Databasalternativ Flera databasalternativ kan påverka optimeringen. Alternativen AUTO_CREATE_STATISTICS och AUTO_UPDATE_STATISTICS påverkar om frågeoptimeraren skapar ny statistik eller uppdaterar statistik som är inaktuell. Parameteriseringsnivån påverkar hur indatafrågan parametriseras innan indatafrågan skickas till frågeoptimeraren. Parameterisering kan påverka kardinalitetsuppskattningen och kan även förhindra matchning mot indexerade vyer och andra typer av optimeringar. Inställningen DATE_CORRELATION_OPTIMIZATION gör att optimeringen söker efter korrelationer mellan kolumner. Den här inställningen påverkar kardinalitet och kostnadsuppskattning.

Miljö

Alternativ Förklaring
Alternativ för sessionsuppsättning Inställningen ANSI_NULLS påverkar om uttrycket NULL = NULL utvärderas som sant. Kardinalitetsuppskattning för yttre kopplingar kan ändras beroende på den aktuella inställningen. Dessutom kan tvetydiga uttryck också ändras. Uttrycket utvärderas till exempel col = NULL på olika sätt baserat på inställningen. Uttrycket utvärderas dock col IS NULL alltid på samma sätt.
Maskinvaruresurser Kostnaden för sorterings- och hashoperatorer beror på den relativa mängden minne som är tillgängligt för SQL Server. Om storleken på data till exempel är större än cacheminnet vet frågeoptimeraren att data alltid måste bufferas till disken. Men om storleken på data är mycket mindre än cacheminnet kommer åtgärden troligen att utföras i minnet. SQL Server tar också hänsyn till olika optimeringar om servern har mer än en processor och om parallellitet inte har inaktiverats med hjälp av ett MAXDOP tips eller konfigurationsalternativet för maximal grad av parallellitet.

Se även