Dela via


UPPDATERA STATISTIK (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft FabricSQL-databas i Microsoft Fabric

Uppdaterar frågeoptimering statistik i en tabell eller indexerad vy. Som standard uppdaterar frågeoptimeraren redan statistik efter behov för att förbättra frågeplanen. I vissa fall kan du förbättra frågeprestanda med hjälp av UPDATE STATISTICS eller den lagrade proceduren sp_updatestats för att uppdatera statistik oftare än standarduppdateringarna.

Genom att uppdatera statistik ser du till att frågor kompileras med up-to-date-statistik. Uppdatering av statistik via valfri process kan leda till att frågeplaner kompilerar om automatiskt. Vi rekommenderar att du inte uppdaterar statistiken för ofta eftersom det finns en prestandaavvägning mellan att förbättra frågeplaner och den tid det tar att kompilera om frågor. De specifika kompromisserna beror på ditt program. UPDATE STATISTICS kan använda tempdb för att sortera radexemplet för att skapa statistik.

Not

Mer information om statistik i Microsoft Fabric finns i Statistik i informationslager för infrastrukturresurser.

Transact-SQL syntaxkonventioner

Syntax

Syntax för SQL Server och Azure SQL Database.

UPDATE STATISTICS table_or_indexed_view_name
    [
        {
            { index_or_statistics__name }
          | ( { index_or_statistics_name } [ , ...n ] )
                }
    ]
    [ WITH
        [
            FULLSCAN
              [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
            | SAMPLE number { PERCENT | ROWS }
              [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
            | RESAMPLE
              [ ON PARTITIONS ( { <partition_number> | <range> } [ , ...n ] ) ]
            | <update_stats_stream_option> [ , ...n ]
        ]
        [ [ , ] [ ALL | COLUMNS | INDEX ]
        [ [ , ] NORECOMPUTE ]
        [ [ , ] INCREMENTAL = { ON | OFF } ]
        [ [ , ] MAXDOP = max_degree_of_parallelism ]
        [ [ , ] AUTO_DROP = { ON | OFF } ]
    ] ;

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

Syntax för Azure Synapse Analytics och Parallel Data Warehouse.

UPDATE STATISTICS [ schema_name . ] table_name
    [ ( { statistics_name | index_name } ) ]
    [ WITH
       {
              FULLSCAN
            | SAMPLE number PERCENT
            | RESAMPLE
        }
    ]
[;]

Syntax för Microsoft Fabric.

UPDATE STATISTICS [ schema_name . ] table_name
    [ ( { statistics_name } ) ]
    [ WITH
       {
              FULLSCAN
            | SAMPLE number PERCENT
        }
    ]
[;]

Not

Den här syntaxen stöds inte av en serverlös SQL-pool i Azure Synapse Analytics.

Argument

table_or_indexed_view_name

Namnet på den tabell eller indexerade vy som innehåller statistikobjektet.

index_or_statistics_name eller statistics_name | index_name eller statistics_name

Namnet på indexet för uppdatering av statistik eller namnet på den statistik som ska uppdateras. Om index_or_statistics_name eller statistics_name inte har angetts uppdaterar frågeoptimeraren all statistik för tabellen eller den indexerade vyn. Detta inkluderar statistik som skapats med hjälp av -instruktionen CREATE STATISTICS , statistik med en kolumn som skapas när AUTO_CREATE_STATISTICS den är på och statistik som skapats för index.

Mer information om AUTO_CREATE_STATISTICSfinns i ÄNDRA ALTERNATIV FÖR DATABASUPPSÄTTNING. Om du vill visa alla index för en tabell eller vy kan du använda sp_helpindex.

FULLSCAN

Beräkna statistik genom att skanna alla rader i tabellen eller indexerad vy. FULLSCAN och SAMPLE 100 PERCENT har samma resultat. FULLSCAN kan inte användas med alternativet SAMPLE .

EXEMPEL på tal { PROCENT | RADER }

Anger den ungefärliga procentandelen eller antalet rader i tabellen eller den indexerade vyn som frågeoptimeraren ska använda när statistik uppdateras. 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 använder sampling och avgör den statistiskt signifikanta urvalsstorleken som standard, efter behov för att skapa frågeplaner av hög kvalitet.

Not

I SQL Server 2016 (13.x) när du använder databaskompatibilitetsnivå 130 görs sampling av data för att skapa statistik parallellt för att förbättra prestanda för statistikinsamling. Frågeoptimeraren använder parallell exempelstatistik när en tabellstorlek överskrider ett visst tröskelvärde. Från och med SQL Server 2017 (14.x), oavsett databaskompatibilitetsnivå, ändrades beteendet tillbaka till att använda en seriell genomsökning för att undvika potentiella prestandaproblem med orimliga LATCH väntetider. Resten av frågeplanen vid uppdatering av statistik upprätthåller parallell körning om den är kvalificerad.

SAMPLE kan inte användas med alternativet FULLSCAN . När varken SAMPLE eller FULLSCAN har angetts 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 har angetts uppdateras statistikobjektet men innehåller inte statistikdata.

För de flesta arbetsbelastningar krävs ingen fullständig genomsökning och standardsampling är tillräcklig. Vissa arbetsbelastningar som är känsliga för mycket varierande datadistributioner kan dock kräva en ökad urvalsstorlek, eller till och med en fullständig genomsökning. Uppskattningar kan bli mer exakta med en fullständig genomsökning än en genomsökning i urvalet, men komplexa planer kanske inte har någon väsentlig fördel.

Mer information finns i Komponenter och begrepp för statistik.

RESAMPLE

Uppdatera varje statistik med hjälp av den senaste exempelfrekvensen.

Användning RESAMPLE kan resultera i en fullständig tabellgenomsökning. Statistik för index använder till exempel en fullständig tabellsökning för sin exempelfrekvens. När inget av exempelalternativen (SAMPLE, FULLSCAN, RESAMPLE) anges tar frågeoptimeraren exempel på data och beräknar exempelstorleken som standard.

I Warehouse i Microsoft Fabric RESAMPLE stöds inte.

PERSIST_SAMPLE_PERCENT = { ON | AV }

gäller för: SQL Server 2016 (13.x) Service Pack 1 CU4, SQL Server 2017 (14.x) Service Pack 1 eller SQL Server 2019 (15.x) och senare versioner, Azure SQL Database, Azure SQL Managed Instance

När ONbehåller statistiken den angivna samplingsprocenten 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.

DBCC-SHOW_STATISTICS och sys.dm_db_stats_properties exponera det bevarade procentvärdet för urvalet för den valda statistiken.

Om AUTO_UPDATE_STATISTICS körs använder den den bevarade samplingsprocenten om den är tillgänglig, eller använder standardsamplingsprocent om inte. RESAMPLE beteende påverkas inte av det här alternativet.

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.

Not

När du återskapar ett index som tidigare hade uppdaterats med PERSIST_SAMPLE_PERCENTi SQL Server återställs den bevarade exempelprocenten tillbaka till standardvärdet. Från och med SQL Server 2016 (13.x) SP2 CU17, SQL Server 2017 (14.x) CU26 och SQL Server 2019 (15.x) CU10 behålls den bevarade exempelprocenten även när ett index återskapas.

PÅ PARTITIONER ( { <partition_number> | <range> } [ , ... n ] ) ]

gäller för: SQL Server 2014 (12.x) och senare versioner

Tvingar lövnivåstatistiken som täcker de partitioner som anges i ON PARTITIONS satsen att omberäknas och sammanfogas sedan för att skapa den globala statistiken. WITH RESAMPLE krävs eftersom partitionsstatistik som skapats med olika exempelfrekvenser inte kan sammanfogas.

ALLA | KOLUMNER | INDEX

Uppdatera all befintlig statistik, statistik som skapats på en eller flera kolumner eller statistik som skapats för index. Om inget av alternativen anges uppdaterar instruktionen UPDATE STATISTICS all statistik i tabellen eller i den indexerade vyn.

NORECOMPUTE

Inaktivera alternativet för automatisk statistikuppdatering, AUTO_UPDATE_STATISTICS, för den angivna statistiken. Om det här alternativet anges slutför frågeoptimeraren den här statistikuppdateringen och inaktiverar framtida uppdateringar.

Om du vill återaktivera AUTO_UPDATE_STATISTICS alternativbeteendet kör du UPDATE STATISTICS igen utan alternativet NORECOMPUTE eller kör sp_autostats.

Varning

Med det här alternativet kan du skapa suboptimala frågeplaner. Vi rekommenderar att du använder det här alternativet sparsamt och sedan endast av en kvalificerad systemadministratör.

Mer information om alternativet finns i AUTO_STATISTICS_UPDATEÄNDRA ALTERNATIV FÖR DATABASUPPSÄTTNING.

INCREMENTAL = { ON | AV }

gäller för: SQL Server 2014 (12.x) och senare versioner

När ONåterskapas statistiken enligt partitionsstatistik. När OFFtas statistikträdet bort och SQL Server beräknar statistiken igen. 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 (från och med SQL Server 2016 (13.x) SP2 och SQL Server 2017 (14.x) CU3).

Åsidosätter max degree of parallelism konfigurationsalternativet under statistikåtgärdens varaktighet. Mer information finns i Konfigurera den maximala graden 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 statistikåtgärd till det angivna antalet eller färre baserat på den aktuella systemarbetsbelastningen.

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

Om statistik för närvarande skapas av ett verktyg från tredje part i en kunddatabas kan dessa statistikobjekt blockera eller störa schemaändringar som kunden kan önska.

(Från och med SQL Server 2022 (16.x))| Med den här funktionen kan du skapa statistikobjekt i ett läge så att en schemaändring inte blockeras av statistiken, utan i stället tas statistiken bort. På så sätt fungerar statistik för automatisk borttagning som statistik som skapas automatiskt.

Not

Om du försöker ange eller ta bort egenskapen Auto_Drop för statistik som skapats automatiskt kan det uppstå fel – automatiskt skapad statistik 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). Statistik som skapas automatiskt fungerar dock alltid som statistik för automatisk borttagning.

Anmärkningar

När DU SKA UPPDATERA STATISTIK

Mer information om när du ska använda UPDATE STATISTICSfinns i När du ska uppdatera statistik.

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.
  • Det går inte att uppdatera den statistik som skapas automatiskt för varje kolumnlagringsindex. Om du försöker med det här resulterar det i fel 35337: UPDATE STATISTICS failed because statistics cannot be updated on a columnstore index. UPDATE STATISTICS is valid only when used with the STATS_STREAM option.
  • Alternativet MAXDOP är inte kompatibelt med alternativen STATS_STREAM, ROWCOUNT och PAGECOUNT.
  • Alternativet MAXDOP begränsas av arbetsbelastningsgruppen Resource Governor MAX_DOP om det används.

Uppdatera all statistik med sp_updatestats

Information om hur du uppdaterar statistik för alla användardefinierade och interna tabeller i databasen finns i den lagrade proceduren sp_updatestats. Följande kommando anropar till exempel sp_updatestats för att uppdatera all statistik för databasen.

EXECUTE sp_updatestats;

Automatisk index- och statistikhantering

Använd lösningar som Adaptive Index Defrag för att automatiskt hantera indexdefragmentering och statistikuppdateringar för en eller flera databaser. Den här proceduren väljer automatiskt om du vill återskapa eller omorganisera ett index enligt dess fragmenteringsnivå, bland andra parametrar, och uppdatera statistik med ett linjärt tröskelvärde.

Fastställa den senaste statistikuppdateringen

Använd funktionen STATS_DATE för att avgöra när statistiken senast uppdaterades.

PDW/Azure Synapse Analytics

Följande syntax stöds inte av Analytics Platform System (PDW)/Azure Synapse Analytics:

UPDATE STATISTICS t1 (a, b);
UPDATE STATISTICS t1 (a) WITH SAMPLE 10 ROWS;
UPDATE STATISTICS t1 (a) WITH NORECOMPUTE;
UPDATE STATISTICS t1 (a) WITH INCREMENTAL = ON;
UPDATE STATISTICS t1 (a) WITH STATS_STREAM = 0x01;

Behörigheter

Kräver ALTER behörighet i tabellen eller vyn.

Exempel

A. Uppdatera all statistik i en tabell

I följande exempel uppdateras all statistik i tabellen SalesOrderDetail.

USE AdventureWorks2022;
GO

UPDATE STATISTICS Sales.SalesOrderDetail;
GO

B. Uppdatera statistiken för ett index

I följande exempel uppdateras statistiken för AK_SalesOrderDetail_rowguid index för tabellen SalesOrderDetail.

USE AdventureWorks2022;
GO

UPDATE STATISTICS Sales.SalesOrderDetail (AK_SalesOrderDetail_rowguid);
GO

C. Uppdatera statistik med 50 procent sampling

I följande exempel skapas och uppdateras sedan statistiken för kolumnerna Name och ProductNumber i tabellen Product.

USE AdventureWorks2022;
GO

CREATE STATISTICS Products
    ON Production.Product([Name], ProductNumber)
    WITH SAMPLE 50 PERCENT;

-- Time passes. The UPDATE STATISTICS statement is then executed.
UPDATE STATISTICS Production.Product (Products)
    WITH SAMPLE 50 PERCENT;

D. Uppdatera statistik med hjälp av FULLSCAN och NORECOMPUTE

I följande exempel uppdateras Products-statistiken i tabellen Product, tvingar fram en fullständig genomsökning av alla rader i tabellen Product och inaktiverar automatisk statistik för Products statistik.

USE AdventureWorks2022;
GO

UPDATE STATISTICS Production.Product (Products)
    WITH FULLSCAN, NORECOMPUTE;
GO

Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)

E. Uppdatera statistik i en tabell

I följande exempel uppdateras CustomerStats1 statistik i tabellen Customer.

UPDATE STATISTICS Customer (CustomerStats1);

F. Uppdatera statistik med hjälp av en fullständig genomsökning

I följande exempel uppdateras CustomerStats1 statistik baserat på genomsökning av alla rader i tabellen Customer.

UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;

G. Uppdatera all statistik i en tabell

I följande exempel uppdateras all statistik i tabellen Customer.

UPDATE STATISTICS Customer;

H. 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.

UPDATE STATISTICS Customer (CustomerStats1) WITH AUTO_DROP = ON;