Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel leert u hoe u een statistiekenscript genereert met behulp van databasemetagegevens voor het maken van een database met alleen statistieken in SQL Server.
Originele productversie: SQL Server
Oorspronkelijk KB-nummer: 914288
Inleiding
De DBCC CLONEDATABASE is de voorkeursmethode voor het genereren van een alleen-schema-kloon van een database om prestatieproblemen te onderzoeken. Gebruik de procedure in dit artikel alleen als u deze niet kunt gebruiken DBCC CLONEDATABASE.
De queryoptimalisatiefunctie in Microsoft SQL Server gebruikt de volgende typen informatie om een optimaal queryplan te bepalen:
- databasemetagegevens
- hardwareomgeving
- status van databasesessie
Normaal gesproken moet u al deze soorten informatie simuleren om het gedrag van de queryoptimalisatie op een testsysteem te reproduceren.
Microsoft Customer Support Services kan u vragen om een script van de databasemetagegevens te genereren om een probleem met de optimalisatie van query's te onderzoeken. In dit artikel worden de stappen beschreven voor het genereren van het statistiekenscript en wordt ook beschreven hoe de queryoptimalisatie de informatie gebruikt.
Notitie
De sleutels die in deze gegevens zijn opgeslagen, bevatten mogelijk PII-gegevens. Als uw tabel bijvoorbeeld een kolom telefoonnummer met een statistiek bevat, wordt de hoge-sleutelwaarde van elke stap weergegeven in het gegenereerde statistiekenscript.
De hele database scripten
Wanneer u een kloondatabase met alleen statistieken genereert, kan het eenvoudiger en betrouwbaarder zijn om de hele database te scripten in plaats van afzonderlijke objecten te scripten. Wanneer u de hele database scriptt, krijgt u de volgende voordelen:
- U voorkomt problemen met ontbrekende afhankelijke objecten die nodig zijn om het probleem te reproduceren.
- U hebt minder stappen nodig om de benodigde objecten te selecteren.
Houd er rekening mee dat als u een script voor een database genereert en de metagegevens voor de database duizenden objecten bevatten, het scriptproces aanzienlijke CPU-resources verbruikt. Het is raadzaam om het script tijdens daluren te genereren, of u kunt de tweede optie Afzonderlijke objecten script gebruiken om het script voor afzonderlijke objecten te genereren.
Voer de volgende stappen uit om een script uit te voeren voor elke database waarnaar wordt verwezen door uw query:
Openen de SQL Server Management Studio.
Vouw in het Objectverkenner Databases uit en zoek de database die u wilt uitvoeren.
Klik met de rechtermuisknop op de database, wijs Taken aan en selecteer Scripts genereren.
Controleer in de wizard Script of de juiste database is geselecteerd. Klik om de volledige scriptdatabase en alle databaseobjecten te selecteren en selecteer vervolgens Volgende.
Selecteer in het dialoogvenster Scriptopties kiezen de knop Geavanceerd om de volgende instellingen van de standaardwaarde te wijzigen in de waarde die wordt vermeld in de volgende tabel.
Scriptoptie Te selecteren waarde Ansi-opvulling Waar Doorgaan met scripting bij fout Waar Script genereren voor afhankelijke objecten Waar Namen van systeembeperkingen opnemen Waar Scriptsortering Waar Scriptaanmelding Waar Machtigingen op scriptobjectniveau Waar Scriptstatistieken Scriptstatistieken en histogrammen Scriptindexen Waar Scripttriggers Waar Notitie
Houd er rekening mee dat de optie Scriptaanmelding en de optie Machtigingen op scriptobjectniveau mogelijk niet vereist zijn, tenzij het schema objecten bevat die eigendom zijn van andere aanmeldingen dan dbo.
Selecteer OK om de wijzigingen op te slaan en sluit de pagina Geavanceerde scriptopties .
Selecteer Opslaan in bestand en selecteer de optie Enkel bestand .
Controleer uw selecties en selecteer Volgende.
Selecteer Voltooien.
Afzonderlijke objecten scripten
U kunt alleen scripts uitvoeren voor de afzonderlijke objecten waarnaar wordt verwezen door een bepaalde query in plaats van de volledige database te scripten. Tenzij echter alle databaseobjecten zijn gemaakt met behulp van de WITH SCHEMABINDING component, zijn de afhankelijkheidsgegevens in de sys.depends systeemtabel mogelijk niet altijd nauwkeurig. Deze onnauwkeurigheid kan een van de volgende problemen veroorzaken:
Het scriptproces scriptt geen afhankelijk object.
Het scriptproces kan objecten in de onjuiste volgorde scripten. Als u het script wilt uitvoeren, moet u het gegenereerde script handmatig bewerken.
Daarom is het niet raadzaam om afzonderlijke objecten te scripten, tenzij de database veel objecten heeft en scripting anders te lang duurt. Als u afzonderlijke scriptobjecten moet gebruiken, voert u de volgende stappen uit:
Vouw in SQL Server Management Studio databases uit en zoek de database die u wilt uitvoeren.
Klik met de rechtermuisknop op de database, wijs Scriptdatabase aan als, wijs CREATE To aan en selecteer Vervolgens Bestand.
Voer een bestandsnaam in en selecteer Opslaan.
De kerndatabasecontainer wordt gescript. Deze container bevat bestanden, bestandsgroepen, de database en eigenschappen.
Klik met de rechtermuisknop op de database, wijs Taken aan en selecteer Scripts genereren.
Zorg ervoor dat de juiste database is geselecteerd en selecteer vervolgens Volgende.
Kies in het dialoogvenster Objecttypen kiezen de optie Specifieke databaseobjecten selecteren en selecteer alle databaseobjecttypen waarnaar de problematische query verwijst.
Als de query bijvoorbeeld alleen naar tabellen verwijst, selecteert u Tabellen. Als de query verwijst naar een weergave, selecteert u Weergaven en tabellen. Als voor de problematische query een door de gebruiker gedefinieerde functie wordt gebruikt, selecteert u Functions.
Wanneer u alle objecttypen hebt geselecteerd waarnaar wordt verwezen door de query, selecteert u Volgende.
Selecteer in het dialoogvenster Scriptopties instellen de knop Geavanceerd en wijzig de volgende instellingen van de standaardwaarde in de waarde die wordt vermeld in de volgende tabel op de pagina Geavanceerde scriptopties .
Scriptoptie Te selecteren waarde Ansi-opvulling Waar Doorgaan met scripting bij fout Waar Namen van systeembeperkingen opnemen Waar Script genereren voor afhankelijke objecten Waar Scriptsortering Waar Scriptaanmelding Waar Machtigingen op scriptobjectniveau Waar Scriptstatistieken Scriptstatistieken en histogrammen Script USE DATABASE Waar Scriptindexen Waar Scripttriggers Waar Notitie
Houd er rekening mee dat de opties voor scriptaanmeldings - en scriptmachtigingen op objectniveau mogelijk niet vereist zijn, tenzij het schema objecten bevat die eigendom zijn van andere aanmeldingen dan dbo.
Selecteer OK om de pagina Geavanceerde scriptopties op te slaan en te sluiten.
Er wordt een dialoogvenster weergegeven voor elk databaseobjecttype dat u in stap 7 hebt geselecteerd.
Selecteer in elk dialoogvenster de specifieke tabellen, weergaven, functies of andere databaseobjecten en selecteer vervolgens Volgende.
Selecteer de optie Script naar bestand en geef vervolgens dezelfde bestandsnaam op die u in stap 3 hebt ingevoerd.
Selecteer Voltooien om het script te starten.
Wanneer het uitvoeren van scripts is voltooid, verzendt u het scriptbestand naar de Microsoft Ondersteuning Engineer. De Microsoft Ondersteuning Engineer kan ook de volgende informatie aanvragen:
Hardwareconfiguratie, inclusief het aantal processors en hoeveel fysiek geheugen er bestaat.
SET-opties die actief waren tijdens het uitvoeren van de query.
Houd er rekening mee dat u deze informatie mogelijk al hebt opgegeven door een SQLDiag-rapport of een SQL Profiler-tracering te verzenden. Mogelijk hebt u ook een andere methode gebruikt om deze informatie op te geven.
Hoe de informatie wordt gebruikt
In de volgende tabellen wordt uitgelegd hoe de optimalisatiefunctie voor query's deze informatie gebruikt om een queryplan te selecteren.
Metagegevens
| Optie | Uitleg |
|---|---|
| Beperkingen | De queryoptimalisatie gebruikt vaak beperkingen om tegenstrijdigheden tussen de query en het onderliggende schema te detecteren. Als de query bijvoorbeeld de WHERE col = 5 component bevat en er een CHECK (col < 5) beperking bestaat in de onderliggende tabel, weet de queryoptimalisatie dat er geen rijen overeenkomen. De queryoptimalisatie maakt vergelijkbare soorten aftrekmogelijkheden over null-baarheid. De component is bijvoorbeeld WHERE col IS NULL waar of onwaar, afhankelijk van de null-waarde van de kolom en of de kolom afkomstig is uit de buitenste tabel van een outer join. De aanwezigheid van beperkingen voor REFERERENDE SLEUTELS is handig om kardinaliteit en de juiste joinvolgorde te bepalen. De queryoptimalisatie kan beperkingsinformatie gebruiken om joins te elimineren of predicaten te vereenvoudigen. Deze wijzigingen kunnen de vereiste voor toegang tot de basistabellen verwijderen. |
| statistieken | De informatie over statistieken bevat dichtheid en een histogram waarin de verdeling van de voorloopkolom van de index en de statistiekensleutel wordt weergegeven. Afhankelijk van de aard van het predicaat kan de queryoptimalisatie gebruikmaken van dichtheid, het histogram of beide om de kardinaliteit van een predicaat te schatten. Bijgewerkte statistieken zijn vereist voor nauwkeurige kardinaliteitschattingen. De kardinaliteitschattingen worden gebruikt als invoer bij het schatten van de kosten van een operator. Daarom moet u goede kardinaliteitschattingen hebben om optimale queryplannen te verkrijgen. |
| Tabelgrootte (aantal rijen en pagina's) | De queryoptimalisatie gebruikt de histogrammen en de dichtheid om de kans te berekenen dat een bepaald predicaat waar of onwaar is. De uiteindelijke kardinaliteitschatting wordt berekend door de waarschijnlijkheid te vermenigvuldigen met het aantal rijen dat de onderliggende operator retourneert. Het aantal pagina's in de tabel of de index is een factor bij het schatten van de IO-kosten. De tabelgrootte wordt gebruikt om de kosten van een scan te berekenen en het is handig wanneer u een schatting maakt van het aantal pagina's dat wordt geopend tijdens het zoeken naar een index. |
| Databaseopties | Verschillende databaseopties kunnen van invloed zijn op optimalisatie. De AUTO_CREATE_STATISTICS en AUTO_UPDATE_STATISTICS opties zijn van invloed op het feit of de queryoptimalisatie nieuwe statistieken maakt of statistieken bijwerkt die verouderd zijn. Het parameterisatieniveau is van invloed op de manier waarop de invoerquery wordt geparameteriseerd voordat de invoerquery wordt overgedragen aan de queryoptimalisatie. Parameterisatie kan van invloed zijn op de schatting van kardinaliteit en kan ook voorkomen dat overeenkomen met geïndexeerde weergaven en andere typen optimalisaties. De DATE_CORRELATION_OPTIMIZATION instelling zorgt ervoor dat de optimizer zoekt naar correlaties tussen kolommen. Deze instelling is van invloed op kardinaliteit en kostenraming. |
Omgeving
| Optie | Uitleg |
|---|---|
| Opties voor sessieSET | De ANSI_NULLS instelling is van invloed op het feit of de NULL = NULL expressie als waar wordt geëvalueerd. De schatting van kardinaliteit voor outer joins kan veranderen, afhankelijk van de huidige instelling. Daarnaast kunnen dubbelzinnige expressies ook veranderen. De expressie evalueert bijvoorbeeld col = NULL anders op basis van de instelling. De col IS NULL expressie evalueert echter altijd op dezelfde manier. |
| Hardwareresources | De kosten voor sorteer- en hashoperators zijn afhankelijk van de relatieve hoeveelheid geheugen die beschikbaar is voor SQL Server. Als de grootte van de gegevens bijvoorbeeld groter is dan de cache, weet de queryoptimalisatie dat de gegevens altijd naar schijf moeten worden gepoold. Als de grootte van de gegevens echter veel kleiner is dan de cache, wordt de bewerking waarschijnlijk uitgevoerd in het geheugen. SQL Server beschouwt ook verschillende optimalisaties als de server meer dan één processor heeft en als parallellisme niet is uitgeschakeld met behulp van een MAXDOP hint of de maximale mate van parallelle configuratieoptie. |