SKAPA STATISTIK (Transact-SQL)
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL-analysslutpunkt i Microsoft Fabric
Warehouse i Microsoft Fabric
Skapar frågeoptimeringsstatistik för en eller flera kolumner i en tabell, en indexerad vy eller en extern tabell. För de flesta frågor genererar frågeoptimeraren redan nödvändig statistik för en frågeplan av hög kvalitet. I några fall måste du skapa extra statistik med CREATE STATISTICS
eller ändra frågedesignen för att förbättra frågeprestandan.
Mer information finns i Statistik.
Anmärkning
Mer information om statistik i Microsoft Fabric finns i Statistik i informationslager för infrastrukturresurser.
Transact-SQL syntaxkonventioner
Syntax
Syntax för SQL Server, Azure SQL Database och 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 ]
Syntax för Azure Synapse Analytics and 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 | = | <> | != | > | >= | !> | < | <= | !<
Syntax för 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
}
]
[ ; ]
Argumentpunkter
statistics_name
Namnet på den statistik som ska skapas.
table_or_indexed_view_name
Namnet på tabellen, den indexerade vyn eller den externa tabell som statistiken ska skapas på. Om du vill skapa statistik för en annan databas anger du ett kvalificerat tabellnamn.
kolumn [ ,... n ]
En eller flera kolumner som ska ingå i statistiken. Kolumnerna ska vara i prioritetsordning från vänster till höger. Endast den första kolumnen används för att skapa histogrammet. Alla kolumner används för korrelationsstatistik mellan kolumner som kallas tätheter.
Du kan ange valfri kolumn som kan anges som en indexnyckelkolumn med följande undantag:
xml-, fulltext- och FILESTREAM-kolumner kan inte anges.
Beräknade kolumner kan endast anges om
ARITHABORT
databasinställningarna ochQUOTED_IDENTIFIER
ärON
.CLR-kolumner av användardefinierad typ kan anges om typen stöder binär ordning. Beräknade kolumner som definieras som metodanrop för en användardefinierad typkolumn kan anges om metoderna är markerade som deterministiska.
VAR <filter_predicate>
Anger ett uttryck för att välja en delmängd rader som ska inkluderas när du skapar statistikobjektet. Statistik som skapas med ett filterpredikat kallas filtrerad statistik. Filterpredikatet använder enkel jämförelselogik och kan inte referera till en beräknad kolumn, en UDT-kolumn, en kolumn av rumslig datatyp eller en hierarki-ID-datatypkolumn . Jämförelser med NULL
literaler tillåts inte med jämförelseoperatorerna. Använd operatorerna IS NULL
och IS NOT NULL
i stället.
Här följer några exempel på filterpredikat för tabellen Production.BillOfMaterials
:
WHERE StartDate > '20000101' AND EndDate <= '20000630'
WHERE ComponentID IN (533, 324, 753)
WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL
Mer information om filterpredikat finns i Skapa filtrerade index.
FULLSCAN
Gäller för: SQL Server 2016 (13.x) SP 1 CU 4, SQL Server 2017 (14.x) CU 1 och senare versioner
Beräkna statistik genom att skanna alla rader.
FULLSCAN
och SAMPLE 100 PERCENT
har samma resultat.
FULLSCAN
kan inte användas med alternativet SAMPLE
.
När det utelämnas använder SQL Server sampling för att skapa statistiken och avgör den exempelstorlek som krävs för att skapa en frågeplan av hög kvalitet.
I Warehouse i Microsoft Fabric stöds endast enkolumns FULLSCAN
- och enkolumnsbaserad SAMPLE
statistik. När inget alternativ ingår SAMPLE
skapas statistik.
EXEMPELnummer { PROCENT | RADER }
Anger den ungefärliga procentandelen, eller antalet rader, i tabellen eller den indexerade vyn som frågeoptimeraren ska använda när den skapar statistik. För PERCENT
kan talet vara mellan 0 och 100 och för ROWS
kan talet vara från 0 till det totala antalet rader. Den faktiska procentandelen eller antalet rader som frågeoptimerarexemplen kanske inte matchar procentandelen eller det angivna talet. Frågeoptimeraren söker till exempel igenom alla rader på en datasida.
SAMPLE
är användbart för särskilda fall där frågeplanen, baserat på standardsampling, inte är optimal. I de flesta fall är det inte nödvändigt att ange SAMPLE
eftersom frågeoptimeraren redan använder sampling och avgör den statistiskt signifikanta urvalsstorleken som standard, efter behov för att skapa högkvalitativa frågeplaner.
SAMPLE
kan inte användas med alternativet FULLSCAN. När SAMPLE
eller FULLSCAN
inte anges använder frågeoptimeraren exempeldata och beräknar exempelstorleken som standard.
Vi rekommenderar att du inte anger 0 PERCENT
eller 0 ROWS
. När 0 PERCENT
eller 0 ROWS
anges skapas statistikobjektet, men innehåller inte statistikdata.
I Warehouse i Microsoft Fabric stöds endast enkolumns FULLSCAN
- och enkolumnsbaserad SAMPLE
statistik. När inget alternativ ingår FULLSCAN
skapas statistik.
PERSIST_SAMPLE_PERCENT = { ON | AV }
När ON
behåller statistiken samplingsprocenten för skapande för efterföljande uppdateringar som inte uttryckligen anger en samplingsprocent. När OFF
återställs statistiksamplingsprocenten till standardsampling i efterföljande uppdateringar som inte uttryckligen anger en samplingsprocent. Standardvärdet är OFF
.
Anmärkning
Om tabellen trunkeras återgår all statistik som bygger på den trunkerade heapen eller B-trädet (HoBT) till att använda standardsamplingsprocenten. På samma sätt, om statistik uppdateras för ett objekt utan rader, återgår den till att använda standardsamplingsprocenten även om PERSIST_SAMPLE_PERCENT
den tidigare har konfigurerats.
STATS_STREAM = stats_stream
Identifieras endast i informationssyfte. Stöds inte. Framtida kompatibilitet garanteras inte.
NORECOMPUTE
Inaktivera alternativet för automatisk statistikuppdatering, AUTO_STATISTICS_UPDATE
, för statistics_name. Om det här alternativet anges slutför frågeoptimeraren alla pågående statistikuppdateringar för statistics_name och inaktiverar framtida uppdateringar.
Om du vill återaktivera statistikuppdateringar tar du bort statistiken med DROP STATISTICS och kör CREATE STATISTICS
sedan utan alternativet NORECOMPUTE
.
Varning
Om du inaktiverar automatisk uppdatering av statistik kan det hindra Frågeoptimeraren från att välja optimala körningsplaner för frågor som omfattar tabellen. Du bör använda det här alternativet sparsamt och endast av en kvalificerad databasadministratör.
Mer information om alternativet finns i AUTO_STATISTICS_UPDATE
ALTER DATABASE SET-alternativ. Mer information om hur du inaktiverar och återaktivera statistikuppdateringar finns i Statistik.
INCREMENTAL = { ON | AV }
gäller för: SQL Server 2014 (12.x) och senare versioner
När ON
är den statistik som skapas per partitionsstatistik. När OFF
kombineras statistik för alla partitioner. Standardvärdet är OFF
.
Om statistik per partition inte stöds genereras ett fel. Inkrementell statistik stöds inte för följande statistiktyper:
- Statistik som skapats med index som inte är partitionsjusterade med bastabellen.
- Statistik som skapats på skrivbara sekundära databaser med AlwaysOn.
- Statistik som skapats på skrivskyddade databaser.
- Statistik som skapats för filtrerade index.
- Statistik som skapats för vyer.
- Statistik som skapats i interna tabeller.
- Statistik som skapats med rumsliga index eller XML-index.
MAXDOP = max_degree_of_parallelism
Gäller för: SQL Server 2016 (13.x) SP 2, SQL Server 2017 (14.x) CU 3 och senare versioner
Åsidosätter konfigurationsalternativet för maximal grad av parallellitet under statistikåtgärden. Mer information finns i Konfigurera maximal grad av parallellitet (serverkonfigurationsalternativ). Använd MAXDOP
för att begränsa antalet processorer som används i en parallell plankörning. Maximalt är 64 processorer.
max_degree_of_parallelism kan vara:
-
1
: Undertrycker parallell plangenerering. -
>1
: Begränsar det maximala antalet processorer som används i en parallell indexåtgärd till det angivna antalet. -
0
(standard): Använder det faktiska antalet processorer eller färre baserat på den aktuella systemarbetsbelastningen.
update_stats_stream_option
Identifieras endast i informationssyfte. Stöds inte. Framtida kompatibilitet garanteras inte.
AUTO_DROP = { ON | AV }
Gäller för: SQL Server 2022 (16.x) och senare versioner, och Azure SQL Database, Azure SQL Managed Instance
Före SQL Server 2022 (16.x), om statistik skapas manuellt av en användare eller ett verktyg från tredje part i en användardatabas, kan dessa statistikobjekt blockera eller störa schemaändringar som kunden kan önska.
Från och med SQL Server 2022 (16.x) AUTO_DROP
är alternativet aktiverat som standard på alla nya och migrerade databaser. Med AUTO_DROP
egenskapen kan du skapa statistikobjekt i ett läge så att en efterföljande schemaändring inte blockeras av statistikobjektet, utan i stället tas statistiken bort efter behov. På så sätt fungerar manuellt skapad statistik med AUTO_DROP
aktiverad som automatiskt skapad statistik.
Anmärkning
Om du försöker ange eller ta bort egenskapen Auto_Drop för statistik som skapats automatiskt kan det uppstå fel. Statistik som skapas automatiskt använder alltid automatisk borttagning. Vissa säkerhetskopior, när de återställs, kan ha den här egenskapen felaktigt inställd till nästa gång statistikobjektet uppdateras (manuellt eller automatiskt). Men statistik som skapas automatiskt fungerar alltid som statistik för automatisk borttagning. När du återställer en databas till SQL Server 2022 (16.x) från en tidigare version rekommenderar vi att du kör sp_updatestats
på databasen och anger rätt metadata för statistikfunktionen AUTO_DROP
.
Mer information finns i alternativet AUTO_DROP.
Behörigheter
Kräver någon av dessa behörigheter:
ALTER TABLE
- Användaren är tabellägare
- Medlemskap i den db_ddladmin fasta databasrollen
Anmärkningar
SQL Server kan använda tempdb
för att sortera de samplade raderna innan du skapar statistik.
Statistik för externa tabeller
När du skapar extern tabellstatistik importerar SQL Server den externa tabellen till en tillfällig SQL Server-tabell och skapar sedan statistiken. För exempelstatistik importeras endast de samplade raderna. Om du har en stor extern tabell går det snabbare att använda standardsampling i stället för alternativet fullständig genomsökning.
När den externa tabellen använder DELIMITEDTEXT
, CSV
, PARQUET
eller DELTA
som datatyper stöder externa tabeller endast statistik för en kolumn per CREATE STATISTICS
kommando.
Statistik med ett filtrerat villkor
Filtrerad statistik kan förbättra frågeprestanda för frågor som väljer från väldefinierade delmängder av data. Filtrerad statistik använder ett filterpredikat i WHERE-satsen för att välja den delmängd av data som ingår i statistiken.
När du ska använda CREATE STATISTICS
Mer information om när du ska använda CREATE STATISTICS
finns i Statistik.
Referensberoenden för filtrerad statistik
Katalogvyn sys.sql_expression_dependencies spårar varje kolumn i det filtrerade statistikpredikatet som ett referensberoende. Överväg de åtgärder som du utför i tabellkolumner innan du skapar filtrerad statistik. Du kan inte släppa, byta namn på eller ändra definitionen för en tabellkolumn som definieras i ett filtrerat statistikpredikat.
Begränsningar
- Uppdatering av statistik stöds inte i externa tabeller. Om du vill uppdatera statistiken i en extern tabell släpper du och återskapar statistiken.
- Du kan visa upp till 64 kolumner per statistikobjekt.
- Alternativet
MAXDOP
är inte kompatibelt medSTATS_STREAM
,ROWCOUNT
ochPAGECOUNT
alternativ. - Alternativet
MAXDOP
begränsas av arbetsbelastningsgruppen Resource GovernorMAX_DOP
om det används. -
CREATE
ochDROP STATISTICS
på externa tabeller stöds inte i Azure SQL Database.
Exempel
Kodexemplen i den här artikeln använder AdventureWorks2022
- eller AdventureWorksDW2022
-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.
A. Använd SKAPA STATISTIK MED EXEMPELnummerPROCENT
I följande exempel skapas ContactMail1
statistiken med hjälp av ett slumpmässigt urval på 5 procent av kolumnerna BusinessEntityID
och EmailPromotion
i tabellen i Person
databasen AdventureWorks2022.
CREATE STATISTICS ContactMail1
ON Person.Person (BusinessEntityID, EmailPromotion)
WITH SAMPLE 5 PERCENT;
B. Använda CREATE STATISTICS med FULLSCAN och NORECOMPUTE
I följande exempel skapas NamePurchase
statistiken för alla rader i BusinessEntityID
tabellens kolumner Person
och och EmailPromotion
inaktiverar automatisk omberäkning av statistik.
CREATE STATISTICS NamePurchase
ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
WITH FULLSCAN, NORECOMPUTE;
C. Använda CREATE STATISTICS för att skapa filtrerad statistik
I följande exempel skapas den filtrerade statistiken ContactPromotion1
. Databasmotorn tar exempel på 50 procent av data och väljer sedan raderna med lika med EmailPromotion
2.
CREATE STATISTICS ContactPromotion1
ON Person.Person (BusinessEntityID, LastName, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO
D. Skapa statistik i en extern tabell
Det enda beslut du behöver fatta när du skapar statistik i en extern tabell, förutom att ange listan med kolumner, är om du vill skapa statistiken genom att ta sampling av raderna eller genom att skanna alla rader.
CREATE
och DROP STATISTICS
på externa tabeller stöds inte i Azure SQL Database.
Eftersom SQL Server importerar data från den externa tabellen till en tillfällig tabell för att skapa statistik, tar det hela genomsökningsalternativet mycket längre tid. För en stor tabell räcker standardsamplingsmetoden vanligtvis.
--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. Använda CREATE STATISTICS med FULLSCAN och PERSIST_SAMPLE_PERCENT
I följande exempel skapas NamePurchase
statistiken för alla rader i kolumnerna BusinessEntityID
Person
och EmailPromotion
i tabellen och en samplingsprocent på 100 procent anges för alla efterföljande uppdateringar som inte uttryckligen anger en samplingsprocent.
CREATE STATISTICS NamePurchase
ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
WITH FULLSCAN, PERSIST_SAMPLE_PERCENT = ON;
Exempel med AdventureWorksDW-databas
F. Skapa statistik för två kolumner
I följande exempel skapas CustomerStats1
statistiken baserat på kolumnerna CustomerKey
och EmailAddress
i DimCustomer
tabellen. Statistiken skapas baserat på ett statistiskt signifikant urval av raderna Customer
i tabellen.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress);
G. Skapa statistik med hjälp av en fullständig genomsökning
I följande exempel skapas CustomerStatsFullScan
statistiken baserat på genomsökning av alla rader i DimCustomer
tabellen.
CREATE STATISTICS CustomerStatsFullScan
ON DimCustomer (CustomerKey, EmailAddress) WITH FULLSCAN;
H. Skapa statistik genom att ange exempelprocenten
I följande exempel skapas CustomerStatsSampleScan
statistiken baserat på genomsökning av 50 procent av raderna DimCustomer
i tabellen.
CREATE STATISTICS CustomerStatsSampleScan
ON DimCustomer (CustomerKey, EmailAddress) WITH SAMPLE 50 PERCENT;
Jag. Använda CREATE STATISTICS med AUTO_DROP
Om du vill använda statistik för automatisk borttagning lägger du bara till följande i "WITH"-satsen för att skapa eller uppdatera statistik.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress) WITH AUTO_DROP = ON
Om du vill utvärdera inställningen för automatisk borttagning av befintlig statistik använder du auto_drop
kolumnen i sys.stats:
SELECT object_id, [name], auto_drop
FROM sys.stats;