Sdílet prostřednictvím


AKTUALIZOVAT STATISTIKY (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)koncový bod SQL Analytics ve službě Microsoft FabricWarehouse v Microsoft Fabricdatabáze SQL v Microsoft Fabric

Aktualizuje statistiky optimalizace dotazů v tabulce nebo indexovém zobrazení. Optimalizátor dotazů už ve výchozím nastavení aktualizuje statistiky podle potřeby, aby zlepšil plán dotazu; v některých případech můžete zlepšit výkon dotazů pomocí UPDATE STATISTICS nebo uložené procedury sp_updatestats k aktualizaci statistik častěji než výchozí aktualizace.

Aktualizace statistik zajišťuje, že se dotazy kompilují pomocí up-tostatistiky -date. Aktualizace statistik prostřednictvím jakéhokoli procesu může způsobit automatické překompilování plánů dotazů. Nedoporučujeme aktualizovat statistiky příliš často, protože mezi vylepšováním plánů dotazů a časem potřebným k opětovnému kompilaci dotazů existuje kompromis mezi výkonem. Konkrétní kompromisy závisí na vaší aplikaci. UPDATE STATISTICS můžete použít tempdb k seřazení vzorku řádků pro vytváření statistik.

Poznámka

Další informace o statistikách v Microsoft Fabric naleznete v tématu Statistika v Microsoft Fabric.

Transact-SQL konvence syntaxe

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   
        }  
    ]  
[;]  

Poznámka

Tato syntaxe není podporována bezserverovým fondem SQL ve službě Azure Synapse Analytics.

Argumenty

table_or_indexed_view_name

Je název tabulky nebo indexovaného zobrazení, které obsahuje objekt statistiky.

index_or_statistics_name nebo statistics_name | index_name nebo statistics_name

Je název indexu pro aktualizaci statistiky nebo název statistiky, která se má aktualizovat. Pokud není zadaný index_or_statistics_name nebo statistics_name, optimalizátor dotazů aktualizuje všechny statistiky pro tabulku nebo indexované zobrazení. To zahrnuje statistiky vytvořené pomocí příkazu CREATE STATISTICS, statistiky s jedním sloupcem vytvořené při AUTO_CREATE_STATISTICS jsou zapnuté a statistiky vytvořené pro indexy.

Další informace o AUTO_CREATE_STATISTICS naleznete v tématu ALTER DATABASE SET Options. Pokud chcete zobrazit všechny indexy pro tabulku nebo zobrazení, můžete použít sp_helpindex.

FULLSCAN

Výpočet statistiky prohledáváním všech řádků v tabulce nebo indexovaného zobrazení FULLSCAN a SAMPLE 100 PERCENT mají stejné výsledky. FULLSCAN nelze použít s možností SAMPLE.

VZOREK číslo { PERCENT | ŘÁDKY }

Určuje přibližné procento nebo počet řádků v tabulce nebo indexované zobrazení pro optimalizátor dotazů, které se mají použít při aktualizaci statistik. V případě procent může číslo být od 0 do 100 a u řádků může číslo být od 0 do celkového počtu řádků. Skutečné procento nebo počet řádků, které vzorky optimalizátoru dotazů nemusí odpovídat zadanému procentu nebo číslu. Optimalizátor dotazů například prohledá všechny řádky na datové stránce.

UKÁZKA je užitečná ve speciálních případech, kdy plán dotazu na základě výchozího vzorkování není optimální. Ve většině situací není nutné zadat SAMPLE, protože optimalizátor dotazů používá vzorkování a ve výchozím nastavení určuje statisticky významnou velikost vzorku, jak je potřeba k vytvoření vysoce kvalitních plánů dotazů.

Poznámka

V SQL Serveru 2016 (13.x) při použití úrovně kompatibility databáze 130 se vzorkování dat k sestavení statistik provádí paralelně, aby se zlepšil výkon shromažďování statistik. Optimalizátor dotazů použije paralelní ukázkové statistiky, kdykoli velikost tabulky překročí určitou prahovou hodnotu. Počínaje SQL Serverem 2017 (14.x) bez ohledu na úroveň kompatibility databáze se chování změnilo zpět na použití sériové kontroly, aby se zabránilo potenciálním problémům s výkonem při nadměrném čekání LATCH. Zbývající část plánu dotazu při aktualizaci statistik zachová paralelní provádění, pokud je kvalifikovaná.

UKÁZKu nelze použít s možností FULLSCAN. Pokud není zadán parametr SAMPLE ani FULLSCAN, použije optimalizátor dotazů vzorkovaná data a ve výchozím nastavení vypočítá velikost vzorku.

Doporučujeme zadat 0 PROCENT nebo 0 ŘÁDKŮ. Při zadání 0 PROCENT nebo ŘÁDKŮ se objekt statistiky aktualizuje, ale neobsahuje data statistiky.

U většiny úloh se nevyžaduje úplná kontrola a výchozí vzorkování je adekvátní. Některé úlohy, které jsou citlivé na široce proměnlivé distribuce dat, ale můžou vyžadovat zvýšenou velikost vzorku nebo dokonce úplnou kontrolu. I když se odhady můžou stát přesnějším při úplné kontrole než vzorek kontroly, složité plány nemusí výrazně těžit.

Další informace naleznete v tématu Součásti a koncepty statistiky.

PŘEVZORKOVAT

Aktualizujte každou statistiku pomocí nejnovější vzorkovací frekvence.

Použití funkce RESAMPLE může vést ke kontrole celé tabulky. Například statistika pro indexy používá úplnou tabulku vyhledávání vzorkovací frekvence. Pokud není zadána žádná z možností ukázky (SAMPLE, FULLSCAN, RESAMPLE), optimalizátor dotazů ve výchozím nastavení vzorkuje data a vypočítá velikost vzorku.

Ve službě Warehouse v Microsoft Fabric se resAMPLE nepodporuje.

PERSIST_SAMPLE_PERCENT = { ON | VYPNUTO }

platí pro: SQL Server 2016 (13.x) Service Pack 1 CU4, SQL Server 2017 (14.x) Service Pack 1 nebo SQL Server 2019 (15.x) a novější verze, Azure SQL Database, Azure SQL Managed Instance

Když ZAPNUTO, statistika zachová nastavené procento vzorkování pro následné aktualizace, které explicitně nezadávají procento vzorkování. Když VYPNUTO, procento vzorkování statistik se resetuje na výchozí vzorkování v následných aktualizacích, které explicitně nezadávají procento vzorkování. Výchozí hodnota je VYPNUTO.

dbCC SHOW_STATISTICS a sys.dm_db_stats_properties zveřejnit trvalou procentuální hodnotu vzorku pro vybranou statistiku.

Pokud se AUTO_UPDATE_STATISTICS spustí, použije trvalé procento vzorkování, pokud je k dispozici, nebo pokud ne, použijte výchozí procento vzorkování. Tato možnost nemá vliv na chování FUNKCE RESAMPLE.

Pokud je tabulka zkrácená, všechny statistiky založené na zkrácené haldě nebo B-tree (HoBT) se vrátí k použití výchozího procenta vzorkování.

Poznámka

Při opětovném sestavení indexu, u kterého byly dříve aktualizovány statistiky pomocí PERSIST_SAMPLE_PERCENT, se trvalé procento vzorku obnoví zpět na výchozí hodnotu. Počínaje SQL Serverem 2016 (13.x) SP2 CU17, SQL Serverem 2017 (14.x) CU26 a SQL Serverem 2019 (15.x) CU10 se trvalé procento vzorku uchovává i při opětovném sestavení indexu.

ON PARTITIONS ( { <partition_number> | <rozsah> } [; ... n] ) ]

platí pro: SQL Server 2014 (12.x) a novější

Vynutí, aby statistiky na úrovni listu pokrývající oddíly zadané v klauzuli ON PARTITIONS byly přepočítané a pak sloučeny pro sestavení globální statistiky. FUNKCE RESAMPLE se vyžaduje, protože statistiky oddílů vytvořené s různými vzorkovacími rychlostmi se nedají sloučit.

ALL | SLOUPCE | INDEX

Aktualizujte všechny existující statistiky, statistiky vytvořené pro jeden nebo více sloupců nebo statistiky vytvořené pro indexy. Pokud není zadána žádná z možností, příkaz UPDATE STATISTICS aktualizuje všechny statistiky v tabulce nebo indexovaném zobrazení.

NORECOMPUTE

Zakažte možnost automatické aktualizace statistiky AUTO_UPDATE_STATISTICS pro zadanou statistiku. Pokud je tato možnost zadaná, optimalizátor dotazů dokončí tuto aktualizaci statistiky a zakáže budoucí aktualizace.

Chcete-li znovu povolit chování AUTO_UPDATE_STATISTICS možnosti, spusťte funkci UPDATE STATISTICS znovu bez možnosti NORECOMPUTE nebo spusťte sp_autostats.

Varování

Pomocí této možnosti můžete vytvořit neoptimální plány dotazů. Tuto možnost doporučujeme používat střídmě a pak jenom kvalifikovaný správce systému.

Další informace o možnosti AUTO_STATISTICS_UPDATE naleznete v tématu ALTER DATABASE SET Options.

INCREMENTAL = { ON | VYPNUTO }

platí pro: SQL Server 2014 (12.x) a novější

Při ZAPNUTOse statistiky znovu vytvoří podle statistik oddílů. Když VYPNUTO, strom statistiky se zahodí a SQL Server znovu vypočítá statistiku. Výchozí hodnota je VYPNUTO.

Pokud statistiky jednotlivých oddílů nejsou podporované, vygeneruje se chyba. Přírůstkové statistiky nejsou podporované pro následující typy statistik:

  • Statistiky vytvořené s indexy, které nejsou v souladu se základní tabulkou
  • Statistiky vytvořené v sekundárních databázích s možností čtení AlwaysOn
  • Statistiky vytvořené pro databáze jen pro čtení
  • Statistiky vytvořené pro filtrované indexy
  • Statistiky vytvořené v zobrazeních
  • Statistiky vytvořené v interních tabulkách
  • Statistiky vytvořené pomocí prostorových indexů nebo indexů XML

MAXDOP = max_degree_of_parallelism

platí pro: SQL Server (počínaje SQL Serverem 2016 (13.x) SP2 a SQL Serverem 2017 (14.x) CU3).

Po dobu trvání statistické operace přepíše maximální stupeň paralelismu možnost konfigurace. Další informace najdete v tématu Konfigurace maximálního stupně paralelismu Možnosti konfigurace serveru. Pomocí funkce MAXDOP omezte počet procesorů používaných při paralelním provádění plánu. Maximum je 64 procesorů.

max_degree_of_parallelism může být:

1
Potlačí generování paralelního plánu.

>1 omezuje maximální počet procesorů použitých v paralelní statistické operaci na zadané číslo nebo méně na základě aktuální systémové úlohy.

0 (výchozí)
Používá skutečný počet procesorů nebo méně na základě aktuální systémové úlohy.

update_stats_stream_option

Určeno pouze pro informační účely. Nepodporuje se. Budoucí kompatibilita není zaručena.

AUTO_DROP = { ON | VYPNUTO }

platí pro: SQL Server 2022 (16.x) a novější.

V současné době, pokud jsou statistiky vytvořené nástrojem třetí strany v databázi zákazníka, mohou tyto objekty statistiky blokovat nebo narušit změny schématu, které zákazník může chtít.

(Počínaje SQL Serverem 2022 (16.x)| Tato funkce umožňuje vytváření objektů statistik v režimu tak, aby změna schématu statistiky neblokovala, ale místo toho se statistiky zahodí. Tímto způsobem se statistiky automatického odstraňování chovají jako automaticky vytvořené statistiky.

Poznámka

Při pokusu o nastavení nebo zrušení vlastnosti Auto_Drop u automaticky vytvořených statistik se můžou objevit chyby – automatické vytváření statistik vždy používá automatické odstraňování. Některé zálohy při obnovení můžou mít tuto vlastnost nastavenou nesprávně, dokud se příště neaktualizuje objekt statistiky (ručně nebo automaticky). Automatické vytvořené statistiky se ale vždy chovají jako statistiky automatického poklesu.

Poznámky

Kdy AKTUALIZOVAT STATISTIKY

Další informace o tom, kdy použít UPDATE STATISTICS, naleznete v tématu Kdy aktualizovat statistiky.

Omezení

  • Aktualizace statistik není u externích tabulek podporovaná. Pokud chcete aktualizovat statistiky v externí tabulce, odstraňte a znovu vytvořte statistiku.
  • Možnost MAXDOP není kompatibilní s možnostmi STATS_STREAM, ROWCOUNT a PAGECOUNT.
  • Možnost MAXDOP je omezena skupinou úloh Správce prostředků MAX_DOP nastavení, pokud se používá.

Aktualizace všech statistik pomocí sp_updatestats

Informace o tom, jak aktualizovat statistiky pro všechny uživatelem definované a interní tabulky v databázi, naleznete v uložené procedury sp_updatestats. Například následující příkaz volá sp_updatestats aktualizovat všechny statistiky databáze.

EXEC sp_updatestats;  

Automatická správa indexů a statistik

Využijte řešení, jako je Adaptivní index defrag, k automatické správě defragmentace indexů a aktualizací statistik pro jednu nebo více databází. Tento postup automaticky zvolí, zda se má index znovu sestavit nebo změnit uspořádání podle úrovně fragmentace, mimo jiné parametry, a aktualizovat statistiky lineární prahovou hodnotou.

Určení poslední aktualizace statistiky

Pokud chcete zjistit, kdy byly statistiky naposledy aktualizovány, použijte funkci STATS_DATE.

PDW / Azure Synapse Analytics

Analytics Platform System (PDW) / Azure Synapse Analytics nepodporuje následující syntaxi:

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;  

Dovolení

Vyžaduje oprávnění ALTER v tabulce nebo zobrazení.

Příklady

A. Aktualizace všech statistik v tabulce

Následující příklad aktualizuje všechny statistiky v tabulce SalesOrderDetail.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail;  
GO  

B. Aktualizace statistik indexu

Následující příklad aktualizuje statistiky pro AK_SalesOrderDetail_rowguid index tabulky SalesOrderDetail.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail AK_SalesOrderDetail_rowguid;  
GO  

C. Aktualizace statistik pomocí 50% vzorkování

Následující příklad vytvoří a potom aktualizuje statistiky pro sloupce Name a ProductNumber v tabulce 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. Aktualizace statistik pomocí FUNKCE FULLSCAN a NORECOMPUTE

Následující příklad aktualizuje Products statistiky v tabulce Product, vynutí úplnou kontrolu všech řádků v tabulce Product a vypne automatické statistiky pro Products statistiky.

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

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

E. Aktualizace statistiky v tabulce

Následující příklad aktualizuje statistiky CustomerStats1 tabulky Customer.

UPDATE STATISTICS Customer (CustomerStats1);  

F. Aktualizace statistik pomocí úplné kontroly

Následující příklad aktualizuje CustomerStats1 statistiky na základě kontroly všech řádků v tabulce Customer.

UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;  

G. Aktualizace všech statistik v tabulce

Následující příklad aktualizuje všechny statistiky v tabulce Customer.

UPDATE STATISTICS Customer;

H. Použití funkce CREATE STATISTICS s AUTO_DROP

Pokud chcete použít statistiku automatického odstraňování, stačí do klauzule WITH statistiky vytvořit nebo aktualizovat následující.

UPDATE STATISTICS Customer (CustomerStats1) WITH AUTO_DROP = ON