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 najdete v tématu Statistiky v datových skladech Fabric.

Transact-SQL konvence syntaxe

Syntax

Syntaxe pro SQL Server a 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 ]

Syntaxe pro Azure Synapse Analytics a paralelní datový sklad

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

Syntaxe pro 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

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

index_or_statistics_name nebo statistics_name | index_name nebo statistics_name

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í CREATE STATISTICS příkazu, statistiky s jedním sloupcem vytvořené v případě, kdy AUTO_CREATE_STATISTICS jsou zapnuté, a statistiky vytvořené pro indexy.

Další informace o AUTO_CREATE_STATISTICSnástroji ALTER DATABASE SET Naleznete v tématu Možnosti ALTER DATABASE SET. 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 s možností SAMPLE použít.

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. Pro PERCENT, číslo může být od 0 do 100 a pro ROWS, číslo může 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.

SAMPLE je užitečná ve zvláštní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é zadávat 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. Od VERZE SQL Server 2017 (14.x) se chování bez ohledu na úroveň kompatibility databáze 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 LATCH čekání. Zbývající část plánu dotazu při aktualizaci statistik zachová paralelní provádění, pokud je kvalifikovaná.

SAMPLE nelze s možností FULLSCAN použít. SAMPLE Pokud ani FULLSCAN nezadáte, optimalizátor dotazů použije vzorkovaná data a ve výchozím nastavení vypočítá velikost vzorku.

Doporučujeme zadat 0 PERCENT nebo 0 ROWS. Pokud 0 PERCENT je objekt 0 ROWS statistiky nebo je zadán, aktualizuje se, 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 větší velikost vzorku nebo dokonce úplnou kontrolu. I když odhady můžou být přesnější s úplnou kontrolou 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í RESAMPLE může vést ke kontrole celé tabulky. Například statistika pro indexy používá úplnou tabulku vyhledávání vzorkovací frekvence. Pokud nezadáte žádnou 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 RESAMPLE se 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

Pokud ONstatistika zachová nastavené procento vzorkování pro následné aktualizace, které explicitně nezadávají procento vzorkování. Pokud OFFse procento vzorkování statistik obnoví na výchozí vzorkování v následných aktualizacích, které explicitně nezadávají procento vzorkování. Výchozí hodnota je OFF.

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

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

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í. Podobně platí, že pokud jsou statistiky u objektu aktualizovány bez řádků, vrátí se k použití výchozího procenta vzorkování, i když PERSIST_SAMPLE_PERCENT byla dříve nakonfigurována.

Poznámka

Při opětovném sestavení indexu, na kterém byly dříve aktualizovány PERSIST_SAMPLE_PERCENTstatistiky, se při opětovném sestavení indexu obnoví trvalé procento vzorku zpět do výchozího stavu. 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> | <range> } [ , ... n ] ) ]

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

Vynutí statistiky na úrovni listu, které pokrývají oddíly zadané v ON PARTITIONS klauzuli, aby se přepočítávaly, a pak je sloučí, aby se sestavily globální statistiky. WITH RESAMPLE je povinný, protože statistiky oddílů vytvořené s různými vzorkovacími mírami 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í, UPDATE STATISTICS příkaz aktualizuje všechny statistiky v tabulce nebo indexovaném zobrazení.

NORECOMPUTE

Zakažte možnost AUTO_UPDATE_STATISTICSautomatické aktualizace statistiky 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 AUTO_UPDATE_STATISTICS chování možnosti, spusťte UPDATE STATISTICS znovu bez NORECOMPUTE možnosti nebo spuštění 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 této AUTO_STATISTICS_UPDATE možnosti naleznete v tématu ALTER DATABASE SET Options.

INCREMENTAL = { ON | VYPNUTO }

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

Pokud ONse statistiky znovu vytvoří podle statistik oddílů. Když OFFse strom statistiky vyřadí a SQL Server znovu vypočítá statistiku. Výchozí hodnota je OFF.

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

max degree of parallelism Přepíše možnost konfigurace po dobu trvání operace statistiky. Další informace najdete v tématu Konfigurace maximálního stupně paralelismu Možnosti konfigurace serveru. Slouží MAXDOP k omezení počtu 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žívaných v paralelní operaci statistiky 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ší verze

V současné době platí, že 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 může dojít k chybám – automaticky vytvořené statistiky vždy používají 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.

  • Aktualizace statistik vytvořených automaticky v indexu columnstore se nepodporuje. Při pokusu o tuto chybu dojde k chybě 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. Další informace najdete v tématu Statistiky indexu.

    Podporuje se aktualizace statistik jednotlivých sloupců nebo sad sloupců indexu columnstore.

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

EXECUTE sp_updatestats;

Automatická správa indexů a statistik

Pomocí řešení, jako je Adaptivní index Defrag, můžete automaticky spravovat defragmentaci indexu a aktualizace statistik pro jednu nebo více databází. Tento postup automaticky zvolí, zda se má index znovu sestavit nebo znovu uspořádat 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;