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. Om du uppdaterar statistik via en process kan det 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 Statistics in Microsoft Fabric.

Transact-SQL syntaxkonventioner

Syntax

-- Syntax for SQL Server and 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 for Azure Synapse Analytics and Parallel Data Warehouse 
  
UPDATE STATISTICS [ schema_name . ] table_name   
    [ ( { statistics_name | index_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
            | RESAMPLE   
        }  
    ]  
[;]  
-- Syntax for 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

Är namnet på den tabell eller indexerade vy som innehåller statistikobjektet.

index_or_statistics_name eller statistics_name | index_name eller statistics_name

Är namnet på indexet som statistik ska uppdateras på 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 CREATE STATISTICS-instruktionen, statistik med en kolumn som skapas när AUTO_CREATE_STATISTICS är på och statistik som skapats för index.

Mer information om AUTO_CREATE_STATISTICS finns i ALTER DATABASE SET Options. 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 PROCENT har samma resultat. FULLSCAN kan inte användas med alternativet EXEMPEL.

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 PROCENT kan tal vara från 0 till 100 och för RADER 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 specialfall 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 högkvalitativa frågeplaner.

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 alltför långa SPÄRRväntningar. Resten av frågeplanen vid uppdatering av statistik upprätthåller parallell körning om den är kvalificerad.

EXEMPEL 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 PROCENT eller 0 RADER. När 0 PROCENT eller RADER 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.

Om du använder RESAMPLE kan det resultera i en fullständig genomsö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) har angetts tar frågeoptimeraren exempel på data och beräknar exempelstorleken som standard.

I Warehouse i Microsoft Fabric stöds inte RESAMPLE.

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

Not

I SQL Server återställs den bevarade exempelprocenten till standard när du återskapar ett index som tidigare hade statistik uppdaterad med PERSIST_SAMPLE_PERCENT. 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> | <intervall> } [, ... n] ) ]

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

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 global statistik. MED 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 UPDATE STATISTICS-instruktionen all statistik i tabellen eller 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 aktivera alternativet AUTO_UPDATE_STATISTICS igen kör du UPPDATERA STATISTIK 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 AUTO_STATISTICS_UPDATE finns i ALTER DATABASE SET Options.

INCREMENTAL = { ON | AV }

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

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 maximal grad av parallellitet konfigurationsalternativ 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.

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 – 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). 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.
  • 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.

EXEC 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