Dela via


SKAPA STATISTIK (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL-analysslutpunkt i Microsoft FabricWarehouse 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 och QUOTED_IDENTIFIER är ON.

  • 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 SAMPLEstatistik. 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 PERCENTkan talet vara mellan 0 och 100 och för ROWSkan 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 SAMPLEstatistik. När inget alternativ ingår FULLSCAN skapas statistik.

PERSIST_SAMPLE_PERCENT = { ON | AV }

När ONbehå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_UPDATEALTER 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 OFFkombineras 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, PARQUETeller 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 STATISTICSfinns 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 med STATS_STREAM, ROWCOUNToch PAGECOUNT alternativ.
  • Alternativet MAXDOP begränsas av arbetsbelastningsgruppen Resource Governor MAX_DOP om det används.
  • CREATE och DROP 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 BusinessEntityIDPerson 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;