Delen via


CREATE STATISTICS (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics-eindpunt in Microsoft FabricWarehouse in Microsoft Fabric

Hiermee maakt u queryoptimalisatiestatistieken voor een of meer kolommen van een tabel, een geïndexeerde weergave of een externe tabel. Voor de meeste query's genereert de queryoptimalisatie al de benodigde statistieken voor een queryplan van hoge kwaliteit; in enkele gevallen moet u extra statistieken maken met CREATE STATISTICS of het queryontwerp wijzigen om de prestaties van query's te verbeteren.

Zie Statistieken voor meer informatie.

Notitie

Zie Statistics in Fabric datawarehousing voor meer informatie over statistieken in Microsoft Fabric.

Transact-SQL syntaxis-conventies

Syntaxis

Syntaxis voor SQL Server, Azure SQL Database en Azure SQL Managed Instance.

-- Create statistics on an external table
CREATE STATISTICS statistics_name
ON { table_or_indexed_view_name } ( column [ , ...n ] )
    [ WITH FULLSCAN ] ;

-- Create statistics on a regular table or indexed view
CREATE STATISTICS statistics_name
ON { table_or_indexed_view_name } ( column [ , ...n ] )
    [ WHERE <filter_predicate> ]
    [ WITH
        [ FULLSCAN
            [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
          | SAMPLE number { PERCENT | ROWS }
            [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
          | <update_stats_stream_option> [ , ...n ]
        [ [ , ] NORECOMPUTE ]
        [ [ , ] INCREMENTAL = { ON | OFF } ]
        [ [ , ] MAXDOP = max_degree_of_parallelism ]
        [ [ , ] AUTO_DROP = { ON | OFF } ]
        ]
    ];

<filter_predicate> ::=
    <conjunct> [ AND <conjunct> ]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant , ...)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<

<update_stats_stream_option> ::=
    [ STATS_STREAM = stats_stream ]
    [ ROWCOUNT = numeric_constant ]
    [ PAGECOUNT = numeric_constant ]

Syntaxis voor Azure Synapse Analytics en Analytics Platform System (PDW).

CREATE STATISTICS statistics_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( column_name  [ , ...n ] )
    [ WHERE <filter_predicate> ]
    [ WITH {
           FULLSCAN
           | SAMPLE number PERCENT
      }
    ]
[ ; ]

<filter_predicate> ::=
    <conjunct> [ AND <conjunct> ]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant , ...)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<

Syntaxis voor Microsoft Fabric.

CREATE STATISTICS statistics_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( column_name )
    [ WITH {
           FULLSCAN
           | SAMPLE number PERCENT
      }
    ]
[ ; ]

Argumenten

statistics_name

De naam van de statistieken die moeten worden gemaakt.

table_or_indexed_view_name

De naam van de tabel, geïndexeerde weergave of externe tabel waarop de statistieken moeten worden gemaakt. Als u statistieken wilt maken voor een andere database, geeft u een gekwalificeerde tabelnaam op.

kolom [ ,... n ]

Een of meer kolommen die moeten worden opgenomen in de statistieken. De kolommen moeten een prioriteitsvolgorde hebben van links naar rechts. Alleen de eerste kolom wordt gebruikt voor het maken van het histogram. Alle kolommen worden gebruikt voor correlatiestatistieken tussen kolommen, ook wel densiteit genoemd.

U kunt elke kolom opgeven die kan worden opgegeven als een indexsleutelkolom met de volgende uitzonderingen:

  • xml-, volledige tekst- en FILESTREAM-kolommen kunnen niet worden opgegeven.

  • Berekende kolommen kunnen alleen worden opgegeven als de ARITHABORT en QUOTED_IDENTIFIER database-instellingen zijn ON.

  • Door de gebruiker gedefinieerde CLR-kolommen kunnen worden opgegeven als het type binaire volgorde ondersteunt. Berekende kolommen die zijn gedefinieerd als methodeaanroepen van een door de gebruiker gedefinieerde kolom kunnen worden opgegeven als de methoden deterministisch zijn gemarkeerd.

WHERE <filter_predicate>

Hiermee geeft u een expressie op voor het selecteren van een subset van rijen die moeten worden opgenomen bij het maken van het statistiekenobject. Statistieken die worden gemaakt met een filterpredicaat, worden gefilterde statistieken genoemd. Het filterpredicaat maakt gebruik van eenvoudige vergelijkingslogica en kan niet verwijzen naar een berekende kolom, een UDT-kolom, een kolom met ruimtelijke gegevenstypen of een kolom met het gegevenstype hierarchyID . Vergelijkingen met NULL letterlijke waarden zijn niet toegestaan met de vergelijkingsoperatoren. Gebruik in plaats daarvan de operators IS NULL en IS NOT NULL.

Hier volgen enkele voorbeelden van filterpredicaten voor de Production.BillOfMaterials tabel:

  • WHERE StartDate > '20000101' AND EndDate <= '20000630'
  • WHERE ComponentID IN (533, 324, 753)
  • WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

Zie Gefilterde indexen maken voor meer informatie over filterpredicaten.

FULLSCAN

Van toepassing op: SQL Server 2016 (13.x) SP 1 CU 4, SQL Server 2017 (14.x) CU 1 en latere versies

Rekenstatistieken door alle rijen te scannen. FULLSCAN en SAMPLE 100 PERCENT dezelfde resultaten hebben. FULLSCAN kan niet worden gebruikt met de SAMPLE optie.

Wanneer u dit weglaat, maakt SQL Server gebruik van steekproeven om de statistieken te maken en bepaalt u de steekproefgrootte die nodig is om een queryplan van hoge kwaliteit te maken.

In Warehouse in Microsoft Fabric worden alleen statistieken met één kolom FULLSCAN en één kolom SAMPLEondersteund. Wanneer er geen optie is opgenomen, SAMPLE worden statistieken gemaakt.

VOORBEELDnummer { PERCENT | RIJEN }

Hiermee geeft u het geschatte percentage, of het aantal rijen, in de tabel of geïndexeerde weergave voor de queryoptimalisatie die moet worden gebruikt bij het maken van statistieken. Voor PERCENT, getal kan van 0 tot en met 100 en voor ROWS, getal kan van 0 tot het totale aantal rijen. Het werkelijke percentage of het aantal rijen van de voorbeelden van de queryoptimalisatie komt mogelijk niet overeen met het opgegeven percentage of getal. De queryoptimalisatie scant bijvoorbeeld alle rijen op een gegevenspagina.

SAMPLE is handig voor speciale gevallen waarin het queryplan, op basis van standaardsampling, niet optimaal is. In de meeste gevallen is het niet nodig om op te geven SAMPLE omdat de queryoptimalisatie al steekproeven gebruikt en de statistisch significante steekproefgrootte standaard bepaalt, zoals vereist voor het maken van queryplannen van hoge kwaliteit.

SAMPLE kan niet worden gebruikt met de optie FULLSCAN. Wanneer SAMPLE of FULLSCAN niet is opgegeven, maakt de queryoptimalisatie gebruik van voorbeeldgegevens en berekent de steekproefgrootte standaard.

We raden u aan om op 0 PERCENT te geven of 0 ROWS. Wanneer 0 PERCENT of 0 ROWS is opgegeven, wordt het statistiekenobject gemaakt, maar bevat geen statistiekengegevens.

In Warehouse in Microsoft Fabric worden alleen statistieken met één kolom FULLSCAN en één kolom SAMPLEondersteund. Wanneer er geen optie is opgenomen, FULLSCAN worden statistieken gemaakt.

PERSIST_SAMPLE_PERCENT = { ON | UIT }

Wanneer ON, behouden de statistieken het steekproefpercentage voor het maken van steekproeven voor volgende updates die niet expliciet een steekproefpercentage opgeven. Wanneer OFFhet percentage statistiekenampling opnieuw wordt ingesteld op standaardsampling in volgende updates die niet expliciet een steekproefpercentage opgeven. De standaardwaarde is OFF.

Notitie

Als de tabel wordt afgekapt, worden alle statistieken die zijn gebouwd op de afgekapte heap of B-boomstructuur (HoBT) teruggezet met behulp van het standaardmonsterpercentage. En als statistieken worden bijgewerkt voor een object zonder rijen, wordt het standaardamplingspercentage weer gebruikt, zelfs als PERSIST_SAMPLE_PERCENT deze eerder is geconfigureerd.

STATS_STREAM = stats_stream

Alleen ter informatie geïdentificeerd. Wordt niet ondersteund. Toekomstige compatibiliteit is niet gegarandeerd.

NORECOMPUTE

Schakel de optie AUTO_STATISTICS_UPDATEvoor het bijwerken van automatische statistieken uit voor statistics_name. Als deze optie is opgegeven, voltooit de optimalisatiefunctie voor query's alle updates voor actieve statistieken voor statistics_name en schakelt u toekomstige updates uit.

Als u updates van statistieken opnieuw wilt inschakelen, verwijdert u de statistieken met DROP STATISTICS en voert CREATE STATISTICS u deze uit zonder de NORECOMPUTE optie.

Waarschuwing

Als u het automatisch bijwerken van statistieken uitschakelt, kan het voorkomen dat queryoptimalisatie optimale uitvoeringsplannen kiest voor query's die betrekking hebben op de tabel. Gebruik deze optie spaarzaam en alleen door een gekwalificeerde databasebeheerder.

Zie OPTIES VOOR ALTER DATABASE SET voor meer informatie over de AUTO_STATISTICS_UPDATE optie. Zie Statistieken voor meer informatie over het uitschakelen en opnieuw inschakelen van updates voor statistieken.

INCREMENTEEL = { AAN | UIT }

Van toepassing op: SQL Server 2014 (12.x) en latere versies

Wanneer ONde gemaakte statistieken per partitiestatistieken zijn. Wanneer OFF, statistieken worden gecombineerd voor alle partities. De standaardwaarde is OFF.

Als statistieken per partitie niet worden ondersteund, wordt er een fout gegenereerd. Incrementele statistieken worden niet ondersteund voor de volgende typen statistieken:

  • Statistieken die zijn gemaakt met indexen die niet zijn gepartitioneerd met de basistabel.
  • Statistieken die zijn gemaakt in leesbare secundaire databases met AlwaysOn.
  • Statistieken die zijn gemaakt voor alleen-lezendatabases.
  • Statistieken die zijn gemaakt voor gefilterde indexen.
  • Statistieken die zijn gemaakt in weergaven.
  • Statistieken die zijn gemaakt op interne tabellen.
  • Statistieken die zijn gemaakt met ruimtelijke indexen of XML-indexen.

MAXDOP = max_degree_of_parallelism

Van toepassing op: SQL Server 2016 (13.x) SP 2, SQL Server 2017 (14.x) CU 3 en latere versies

Overschrijft de maximale mate van parallelle configuratie tijdens de statistiekbewerking. Zie De maximale mate van parallelle uitvoering (serverconfiguratieoptie) configurerenvoor meer informatie. Gebruik MAXDOP dit om het aantal processors dat wordt gebruikt in een parallelle uitvoering van een plan te beperken. Het maximum is 64 processors.

max_degree_of_parallelism kan het volgende zijn:

  • 1: onderdrukt het genereren van parallelle plannen.
  • >1: Beperkt het maximum aantal processors dat in een parallelle indexbewerking wordt gebruikt tot het opgegeven aantal.
  • 0 (standaard): Gebruikt het werkelijke aantal processors of minder op basis van de huidige systeemworkload.

update_stats_stream_option

Alleen ter informatie geïdentificeerd. Wordt niet ondersteund. Toekomstige compatibiliteit is niet gegarandeerd.

AUTO_DROP = { AAN | UIT }

Van toepassing op: SQL Server 2022 (16.x) en latere versies, en Azure SQL Database, Azure SQL Managed Instance

Voordat SQL Server 2022 (16.x) handmatig statistieken worden gemaakt door een hulpprogramma van een gebruiker of derde partij in een gebruikersdatabase, kunnen deze statistiekenobjecten schemawijzigingen blokkeren of verstoren die de klant mogelijk wenst.

Vanaf SQL Server 2022 (16.x) is de AUTO_DROP optie standaard ingeschakeld voor alle nieuwe en gemigreerde databases. Met AUTO_DROP de eigenschap kunnen statistiekenobjecten worden gemaakt in een modus, zodat een volgende schemawijziging niet wordt geblokkeerd door het statistiekobject, maar in plaats daarvan worden de statistieken zo nodig verwijderd. Op deze manier gedragen handmatig gemaakte statistieken met AUTO_DROP ingeschakelde functionaliteit zich als automatisch gemaakte statistieken.

Notitie

Als u de eigenschap Auto_Drop voor automatisch gemaakte statistieken probeert in of uit te stellen, kan dit fouten veroorzaken. Automatisch gemaakte statistieken maken altijd gebruik van automatisch verwijderen. Bij het herstellen van sommige back-ups is deze eigenschap mogelijk onjuist ingesteld tot de volgende keer dat het statistiekenobject wordt bijgewerkt (handmatig of automatisch). Automatisch gemaakte statistieken gedragen zich echter altijd als statistieken voor automatisch neerzetten. Wanneer u een database herstelt naar SQL Server 2022 (16.x) uit een eerdere versie, is het raadzaam om deze uit te voeren sp_updatestats op de database en de juiste metagegevens voor de statistische AUTO_DROP functie in te stellen.

Zie AUTO_DROP optie voor meer informatie.

Machtigingen

Hiervoor is een van deze machtigingen vereist:

  • ALTER TABLE
  • Gebruiker is de eigenaar van de tabel
  • Lidmaatschap van de db_ddladmin vaste databaserol

Opmerkingen

SQL Server kan de tempdb voorbeeldrijen sorteren voordat u statistieken maakt.

Statistieken voor externe tabellen

Wanneer u externe tabelstatistieken maakt, importeert SQL Server de externe tabel in een tijdelijke SQL Server-tabel en maakt u de statistieken. Voor voorbeeldenstatistieken worden alleen de voorbeeldrijen geïmporteerd. Als u een grote externe tabel hebt, kunt u sneller de standaardsampling gebruiken in plaats van de volledige scanoptie.

Wanneer de externe tabel gebruikmaakt van DELIMITEDTEXT, CSV, PARQUETof DELTA als gegevenstypen, ondersteunen externe tabellen alleen statistieken voor één kolom per CREATE STATISTICS opdracht.

Statistieken met een gefilterde voorwaarde

Gefilterde statistieken kunnen de queryprestaties verbeteren voor query's die kiezen uit goed gedefinieerde subsets van gegevens. Gefilterde statistieken gebruiken een filterpredicaat in de WHERE-component om de subset te selecteren van gegevens die zijn opgenomen in de statistieken.

Wanneer gebruikt u CREATE STATISTICS

Zie Statistieken voor meer informatie over wanneer u moet gebruikenCREATE STATISTICS.

Referentieafhankelijkheden voor gefilterde statistieken

In de catalogusweergave sys.sql_expression_afhankelijkheden wordt elke kolom in het gefilterde statistiekenpredicaat bijgehouden als een afhankelijkheid waarnaar wordt verwezen. Houd rekening met de bewerkingen die u op tabelkolommen uitvoert voordat u gefilterde statistieken maakt. U kunt de definitie van een tabelkolom die is gedefinieerd in een gefilterd statistiekenpredicaat niet verwijderen, wijzigen of de naam ervan wijzigen.

Beperkingen

  • Het bijwerken van statistieken wordt niet ondersteund voor externe tabellen. Als u statistieken in een externe tabel wilt bijwerken, kunt u de statistieken verwijderen en opnieuw maken.
  • U kunt maximaal 64 kolommen per statistiekenobject weergeven.
  • De MAXDOP optie is niet compatibel met STATS_STREAM, ROWCOUNTen PAGECOUNT opties.
  • De MAXDOP optie wordt beperkt door de workloadgroep Resource Governor MAX_DOP instelling, indien gebruikt.
  • CREATE en DROP STATISTICS op externe tabellen worden niet ondersteund in Azure SQL Database.

Voorbeelden

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase, die u kunt downloaden van de Microsoft SQL Server-voorbeelden en communityprojecten startpagina.

Eén. CREATE STATISTICS gebruiken met SAMPLE number PERCENT

In het volgende voorbeeld worden de ContactMail1 statistieken gemaakt met behulp van een willekeurige steekproef van 5 procent van de BusinessEntityID tabel en EmailPromotion kolommen van de Person database AdventureWorks2022.

CREATE STATISTICS ContactMail1
    ON Person.Person (BusinessEntityID, EmailPromotion)
    WITH SAMPLE 5 PERCENT;

B. CREATE STATISTICS gebruiken met FULLSCAN en NORECOMPUTE

In het volgende voorbeeld worden de NamePurchase statistieken gemaakt voor alle rijen in de BusinessEntityID tabel en EmailPromotion kolommen van de Person tabel en worden automatische hercomputing van statistieken uitgeschakeld.

CREATE STATISTICS NamePurchase
    ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
    WITH FULLSCAN, NORECOMPUTE;

C. CREATE STATISTICS gebruiken om gefilterde statistieken te maken

In het volgende voorbeeld worden de gefilterde statistieken ContactPromotion1gemaakt. De database-engine steekt 50 procent van de gegevens uit en selecteert vervolgens de rijen met EmailPromotion gelijk aan 2.

CREATE STATISTICS ContactPromotion1
    ON Person.Person (BusinessEntityID, LastName, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO

D. Statistieken maken in een externe tabel

De enige beslissing die u moet nemen wanneer u statistieken maakt voor een externe tabel, naast het opgeven van de lijst met kolommen, is of u de statistieken wilt maken door de rijen te nemen of door alle rijen te scannen. CREATE en DROP STATISTICS op externe tabellen worden niet ondersteund in Azure SQL Database.

Omdat SQL Server gegevens uit de externe tabel importeert in een tijdelijke tabel om statistieken te maken, duurt de volledige scanoptie veel langer. Voor een grote tabel is de standaardsamplingsmethode meestal voldoende.

--Create statistics on an external table and use default sampling.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress);

--Create statistics on an external table and scan all the rows
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress) WITH FULLSCAN;

E. CREATE STATISTICS gebruiken met FULLSCAN en PERSIST_SAMPLE_PERCENT

In het volgende voorbeeld worden de NamePurchase statistieken voor alle rijen in de BusinessEntityID tabel en EmailPromotion kolommen gemaakt en wordt een steekproefpercentage van Person 100 procent ingesteld voor alle volgende updates die niet expliciet een steekproefpercentage opgeven.

CREATE STATISTICS NamePurchase
    ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
    WITH FULLSCAN, PERSIST_SAMPLE_PERCENT = ON;

Voorbeelden met behulp van AdventureWorksDW-database

F. Statistieken maken voor twee kolommen

In het volgende voorbeeld worden de CustomerStats1 statistieken gemaakt op basis van de CustomerKey en EmailAddress kolommen van de DimCustomer tabel. De statistieken worden gemaakt op basis van een statistisch significante steekproef van de rijen in de Customer tabel.

CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress);

G. Statistieken maken met behulp van een volledige scan

In het volgende voorbeeld worden de CustomerStatsFullScan statistieken gemaakt op basis van het scannen van alle rijen in de DimCustomer tabel.

CREATE STATISTICS CustomerStatsFullScan
ON DimCustomer (CustomerKey, EmailAddress) WITH FULLSCAN;

H. Statistieken maken door het steekproefpercentage op te geven

In het volgende voorbeeld worden de CustomerStatsSampleScan statistieken gemaakt op basis van het scannen van 50 procent van de rijen in de DimCustomer tabel.

CREATE STATISTICS CustomerStatsSampleScan
ON DimCustomer (CustomerKey, EmailAddress) WITH SAMPLE 50 PERCENT;

I. CREATE STATISTICS gebruiken met AUTO_DROP

Als u statistieken voor automatisch verwijderen wilt gebruiken, voegt u het volgende toe aan de component 'WITH' van statistieken maken of bijwerken.

CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress) WITH AUTO_DROP = ON

Als u de instelling voor automatisch neerzetten voor bestaande statistieken wilt evalueren, gebruikt u de auto_drop kolom in sys.stats:

SELECT object_id, [name], auto_drop
FROM sys.stats;