CREATE STATISTICS (Transact-SQL)
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL Analytics-eindpunt in Microsoft Fabric
Warehouse 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
enQUOTED_IDENTIFIER
database-instellingen zijnON
.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 SAMPLE
ondersteund. 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 SAMPLE
ondersteund. 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 OFF
het 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_UPDATE
voor 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 ON
de 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
, PARQUET
of 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 metSTATS_STREAM
,ROWCOUNT
enPAGECOUNT
opties. - De
MAXDOP
optie wordt beperkt door de workloadgroep Resource GovernorMAX_DOP
instelling, indien gebruikt. -
CREATE
enDROP 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 ContactPromotion1
gemaakt. 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;