Udostępnij za pośrednictwem


UPDATE STATISTICS (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)punkt końcowy analizy SQL w usłudze Microsoft FabricWarehouse w usłudze Microsoft FabricSQL Database w usłudze Microsoft Fabric

Aktualizuje optymalizację zapytań statystyk w tabeli lub widoku indeksowanym. Domyślnie optymalizator zapytań aktualizuje już statystyki w razie potrzeby w celu ulepszenia planu zapytania; w niektórych przypadkach można poprawić wydajność zapytań przy użyciu UPDATE STATISTICS lub procedury składowanej sp_updatestats w celu częstszego aktualizowania statystyk niż aktualizacje domyślne.

Aktualizowanie statystyk zapewnia kompilowanie zapytań przy użyciu up-to-date statistics. Aktualizowanie statystyk za pośrednictwem dowolnego procesu może spowodować automatyczne ponowne skompilowanie planów zapytań. Zalecamy zbyt częste aktualizowanie statystyk, ponieważ występuje kompromis między ulepszaniem planów zapytań a czasem ponownego kompilowania zapytań. Konkretne kompromisy zależą od aplikacji. UPDATE STATISTICS może użyć tempdb, aby posortować próbkę wierszy do tworzenia statystyk.

Nuta

Aby uzyskać więcej informacji na temat statystyk w usłudze Microsoft Fabric, zobacz Statistics in Microsoft Fabric.

Transact-SQL konwencje składni

Składnia

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

Nuta

Ta składnia nie jest obsługiwana przez bezserwerową pulę SQL w usłudze Azure Synapse Analytics.

Argumenty

table_or_indexed_view_name

To nazwa tabeli lub widoku indeksowanego, który zawiera obiekt statystyk.

index_or_statistics_name lub statistics_name | index_name lub statistics_name

Jest nazwą indeksu do zaktualizowania statystyk lub nazwy statystyk do zaktualizowania. Jeśli nie określono index_or_statistics_name lub statistics_name, optymalizator zapytań aktualizuje wszystkie statystyki dla tabeli lub widoku indeksowanego. Obejmuje to statystyki utworzone przy użyciu instrukcji CREATE STATISTICS, statystyki jednokolumna utworzone podczas AUTO_CREATE_STATISTICS i statystyki utworzone dla indeksów.

Aby uzyskać więcej informacji na temat AUTO_CREATE_STATISTICS, zobacz ALTER DATABASE SET Options. Aby wyświetlić wszystkie indeksy dla tabeli lub widoku, możesz użyć sp_helpindex.

FULLSCAN

Oblicz statystyki, przeskanując wszystkie wiersze w tabeli lub w widoku indeksowanym. FUNKCJA FULLSCAN i PRÓBKA 100% mają te same wyniki. Nie można użyć opcji FULLSCAN z opcją SAMPLE.

PRZYKŁADowa liczba { PERCENT | WIERSZE }

Określa przybliżoną wartość procentową lub liczbę wierszy w tabeli lub widoku indeksowanego, który ma być używany przez optymalizator zapytań podczas aktualizowania statystyk. W przypadku wartości PERCENT liczba może wynosić od 0 do 100 i w przypadku wierszy, liczba może wynosić od 0 do całkowitej liczby wierszy. Rzeczywista wartość procentowa lub liczba wierszy, które próbki optymalizatora zapytań mogą nie być zgodne z określoną wartością procentową lub liczbą. Na przykład optymalizator zapytań skanuje wszystkie wiersze na stronie danych.

PRZYKŁAD jest przydatny w specjalnych przypadkach, w których plan zapytania na podstawie domyślnego próbkowania nie jest optymalny. W większości sytuacji nie jest konieczne określenie przykładu, ponieważ optymalizator zapytań używa próbkowania i domyślnie określa statystycznie znaczący rozmiar próbki, zgodnie z wymaganiami tworzenia planów zapytań wysokiej jakości.

Nuta

W programie SQL Server 2016 (13.x) podczas korzystania z poziomu zgodności bazy danych 130 próbkowanie danych do tworzenia statystyk odbywa się równolegle w celu zwiększenia wydajności zbierania statystyk. Optymalizator zapytań będzie używać równoległych statystyk próbki za każdym razem, gdy rozmiar tabeli przekroczy określony próg. Począwszy od programu SQL Server 2017 (14.x), niezależnie od poziomu zgodności bazy danych, zachowanie zostało zmienione z powrotem na użycie skanowania szeregowego, aby uniknąć potencjalnych problemów z wydajnością z nadmiernymi oczekiwaniami na opóźnienie. Pozostała część planu zapytania podczas aktualizowania statystyk będzie obsługiwać wykonywanie równoległe, jeśli jest kwalifikowane.

Przykład nie może być używany z opcją FULLSCAN. Jeśli nie określono parametru SAMPLE ani FULLSCAN, optymalizator zapytań domyślnie używa próbkowanych danych i oblicza rozmiar próbki.

Zalecamy określenie wartości 0 PROCENT lub 0 WIERSZY. Po określeniu wartości 0 PROCENT lub WIERSZY obiekt statystyk jest aktualizowany, ale nie zawiera danych statystycznych.

W przypadku większości obciążeń pełne skanowanie nie jest wymagane, a domyślne próbkowanie jest odpowiednie. Jednak niektóre obciążenia, które są wrażliwe na bardzo różne dystrybucje danych, mogą wymagać zwiększonego rozmiaru próbki, a nawet pełnego skanowania. Chociaż szacunki mogą stać się dokładniejsze przy pełnym skanowaniu niż skanowanie próbkowane, złożone plany mogą nie przynieść znacznej korzyści.

Aby uzyskać więcej informacji, zobacz Components and concepts of statistics.

PONOWNE PRÓBKOWANIE

Zaktualizuj każdą statystykę przy użyciu najnowszej częstotliwości próbkowania.

Użycie funkcji RESAMPLE może spowodować skanowanie w pełnej tabeli. Na przykład statystyki indeksów używają pełnego skanowania tabeli pod kątem częstotliwości próbkowania. Jeśli nie określono żadnych opcji przykładowych (SAMPLE, FULLSCAN, RESAMPLE), optymalizator zapytań domyślnie próbkuje dane i oblicza rozmiar próbki.

W magazynie w usłudze Microsoft Fabric nie jest obsługiwana funkcja RESAMPLE.

PERSIST_SAMPLE_PERCENT = { ON | WYŁ. }

Dotyczy: sql Server 2016 (13.x) z dodatkiem Service Pack 1 CU4, SQL Server 2017 (14.x) z dodatkiem Service Pack 1 lub SQL Server 2019 (15.x) i nowszymi wersjami, Azure SQL Database, Azure SQL Managed Instance

W przypadku statystyki zachowają wartość procentową próbkowania dla kolejnych aktualizacji, które nie określają jawnie wartości procentowej próbkowania. W przypadku offprocent próbkowania statystyk zostanie zresetowany do domyślnego próbkowania w kolejnych aktualizacjach, które nie określają jawnie wartości procentowej próbkowania. Wartość domyślna to OFF.

SHOW_STATISTICS DBCC i sys.dm_db_stats_properties uwidocznić utrwalone wartości procentu próby dla wybranej statystyki.

Jeśli AUTO_UPDATE_STATISTICS jest wykonywana, używa utrwalonej wartości procentowej próbkowania, jeśli jest dostępna, lub użyj domyślnej wartości procentowej próbkowania, jeśli nie. Zachowanie RESAMPLE nie ma wpływu na tę opcję.

Jeśli tabela zostanie obcięta, wszystkie statystyki utworzone na obciętej stercie lub B-tree (HoBT) zostaną przywrócone do korzystania z domyślnej wartości procentowej próbkowania.

Nuta

W programie SQL Server podczas ponownego kompilowania indeksu, który wcześniej miał statystyki zaktualizowane przy użyciu PERSIST_SAMPLE_PERCENT, trwały procent próbki jest resetowany z powrotem do wartości domyślnej. Począwszy od programu SQL Server 2016 (13.x) SP2 CU17, SQL Server 2017 (14.x) CU26 i PROGRAMU SQL Server 2019 (15.x) CU10, trwały procent próbki jest zachowywany nawet podczas odbudowywania indeksu.

NA PARTYCJACH ( { <partition_number> | <zakres> } [, ... n] ) ]

Dotyczy: SQL Server 2014 (12.x) i nowsze

Wymusza ponowne skompilowanie statystyk na poziomie liścia obejmujących partycje określone w klauzuli ON PARTITIONS, a następnie scalane w celu utworzenia globalnych statystyk. Funkcja RESAMPLE jest wymagana, ponieważ nie można scalić statystyk partycji z różnymi współczynnikami próbek.

WSZYSTKIE | KOLUMNY | INDEKS

Zaktualizuj wszystkie istniejące statystyki, statystyki utworzone na co najmniej jednej kolumnie lub statystyki utworzone dla indeksów. Jeśli żadna z opcji nie zostanie określona, instrukcja UPDATE STATISTICS aktualizuje wszystkie statystyki w tabeli lub widoku indeksowanym.

NORECOMPUTE

Wyłącz opcję automatycznej aktualizacji statystyk AUTO_UPDATE_STATISTICS dla określonych statystyk. Jeśli ta opcja zostanie określona, optymalizator zapytań ukończy tę aktualizację statystyk i wyłączy przyszłe aktualizacje.

Aby ponownie włączyć zachowanie opcji AUTO_UPDATE_STATISTICS, uruchom ponownie funkcję UPDATE STATISTICS bez opcji NORECOMPUTE lub uruchom sp_autostats.

Ostrzeżenie

Użycie tej opcji umożliwia tworzenie nieoptymalnych planów zapytań. Zalecamy używanie tej opcji oszczędnie, a następnie tylko przez kwalifikowanego administratora systemu.

Aby uzyskać więcej informacji na temat opcji AUTO_STATISTICS_UPDATE, zobacz ALTER DATABASE SET Options.

INCREMENTAL = { ON | WYŁ. }

Dotyczy: SQL Server 2014 (12.x) i nowsze

W przypadku statystyki są ponownie tworzone zgodnie ze statystykami partycji. Gdy off, drzewo statystyk jest porzucane, a program SQL Server ponownie oblicza statystyki. Wartość domyślna to OFF.

Jeśli statystyki poszczególnych partycji nie są obsługiwane, zostanie wygenerowany błąd. Statystyki przyrostowe nie są obsługiwane w przypadku następujących typów statystyk:

  • Statystyki utworzone za pomocą indeksów, które nie są dostosowane do partycji z tabelą podstawową.
  • Statystyki utworzone w przypadku pomocniczych baz danych z możliwością odczytu zawsze włączone.
  • Statystyki utworzone w bazach danych tylko do odczytu.
  • Statystyki utworzone na podstawie filtrowanych indeksów.
  • Statystyki utworzone w widokach.
  • Statystyki utworzone w tabelach wewnętrznych.
  • Statystyki utworzone za pomocą indeksów przestrzennych lub indeksów XML.

MAXDOP = max_degree_of_parallelism

Dotyczy: SQL Server (począwszy od programu SQL Server 2016 (13.x) SP2 i programu SQL Server 2017 (14.x) CU3).

Zastępuje maksymalny stopień równoległości opcji konfiguracji na czas trwania operacji statystyki. Aby uzyskać więcej informacji, zobacz Configure the max degree of parallelism Server Configuration Option. Użyj opcji MAXDOP, aby ograniczyć liczbę procesorów używanych w równoległym wykonywaniu planu. Maksymalna wartość to 64 procesory.

max_degree_of_parallelism może to być:

1
Pomija generowanie planu równoległego.

>1 ogranicza maksymalną liczbę procesorów używanych w równoległej operacji statystyki do określonej liczby lub mniejszej na podstawie bieżącego obciążenia systemu.

0 (ustawienie domyślne)
Używa rzeczywistej liczby procesorów lub mniej na podstawie bieżącego obciążenia systemu.

update_stats_stream_option

Zidentyfikowane tylko do celów informacyjnych. Nieobsługiwane. Zgodność w przyszłości nie jest gwarantowana.

AUTO_DROP = { ON | WYŁ. }

Dotyczy: SQL Server 2022 (16.x) i nowszych.

Obecnie, jeśli statystyki są tworzone przez narzędzie innej firmy w bazie danych klienta, te obiekty statystyczne mogą blokować lub zakłócać zmiany schematu, których klient może chcieć.

(Począwszy od programu SQL Server 2022 (16.x))| Ta funkcja umożliwia tworzenie obiektów statystyk w trybie tak, aby zmiana schematu nie blokowana przez statystyki, ale zamiast tego statystyki zostaną usunięte. W ten sposób statystyki automatycznego upuszczania zachowują się jak automatycznie utworzone statystyki.

Nuta

Próba ustawienia lub odłączania właściwości Auto_Drop dla automatycznie utworzonych statystyk może wywołać błędy — automatycznie utworzone statystyki zawsze używają automatycznego upuszczania. Niektóre kopie zapasowe, po przywróceniu, mogą mieć tę właściwość niepoprawnie ustawioną do czasu następnego zaktualizowania obiektu statystyk (ręcznie lub automatycznie). Jednak automatycznie utworzone statystyki zawsze zachowują się jak statystyki automatycznego porzucania.

Uwagi

Kiedy zaktualizować STATYSTYKI

Aby uzyskać więcej informacji o tym, kiedy należy używać UPDATE STATISTICS, zobacz Kiedy zaktualizować statystyki.

Ograniczenia

  • Aktualizowanie statystyk nie jest obsługiwane w tabelach zewnętrznych. Aby zaktualizować statystyki dotyczące tabeli zewnętrznej, upuść i ponownie utwórz statystyki.
  • Opcja MAXDOP nie jest zgodna z opcjami STATS_STREAM, ROWCOUNT i PAGECOUNT.
  • Opcja MAXDOP jest ograniczona przez ustawienie grupy obciążeń Zarządca zasobów MAX_DOP, jeśli jest używane.

Aktualizowanie wszystkich statystyk przy użyciu sp_updatestats

Aby uzyskać informacje o sposobie aktualizowania statystyk dla wszystkich tabel zdefiniowanych przez użytkownika i wewnętrznych w bazie danych, zobacz procedurę składowaną sp_updatestats. Na przykład następujące polecenie wywołuje sp_updatestats, aby zaktualizować wszystkie statystyki bazy danych.

EXEC sp_updatestats;  

Automatyczne zarządzanie indeksami i statystykami

Korzystaj z rozwiązań, takich jak defragmentacja indeksu adaptacyjnego, aby automatycznie zarządzać defragmentacją indeksu i aktualizacjami statystyk dla co najmniej jednej bazy danych. Ta procedura automatycznie wybiera, czy ponownie skompilować lub zreorganizować indeks zgodnie z poziomem fragmentacji, między innymi parametrami, oraz zaktualizować statystyki z progiem liniowym.

Określanie ostatniej aktualizacji statystyk

Aby określić, kiedy statystyki zostały ostatnio zaktualizowane, użyj funkcji STATS_DATE.

PDW / Azure Synapse Analytics

Następująca składnia nie jest obsługiwana przez system platformy analizy (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;  

Uprawnienia

Wymaga ALTER uprawnienia do tabeli lub widoku.

Przykłady

A. Aktualizowanie wszystkich statystyk w tabeli

Poniższy przykład aktualizuje wszystkie statystyki dotyczące tabeli SalesOrderDetail.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail;  
GO  

B. Aktualizowanie statystyk indeksu

Poniższy przykład aktualizuje statystyki indeksu AK_SalesOrderDetail_rowguid tabeli SalesOrderDetail.

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

C. Aktualizowanie statystyk przy użyciu próbkowania 50 procent

Poniższy przykład tworzy i aktualizuje statystyki dla kolumn Name i ProductNumber w tabeli 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. Aktualizowanie statystyk przy użyciu FUNKCJI FULLSCAN i NORECOMPUTE

Poniższy przykład aktualizuje statystyki Products w tabeli Product, wymusza pełne skanowanie wszystkich wierszy w tabeli Product i wyłącza automatyczne statystyki dla statystyk Products.

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

Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)

E. Aktualizowanie statystyk dotyczących tabeli

Poniższy przykład aktualizuje statystyki CustomerStats1 dotyczące tabeli Customer.

UPDATE STATISTICS Customer (CustomerStats1);  

F. Aktualizowanie statystyk przy użyciu pełnego skanowania

Poniższy przykład aktualizuje statystyki CustomerStats1 na podstawie skanowania wszystkich wierszy w tabeli Customer.

UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;  

G. Aktualizowanie wszystkich statystyk w tabeli

Poniższy przykład aktualizuje wszystkie statystyki dotyczące tabeli Customer.

UPDATE STATISTICS Customer;

H. Używanie funkcji CREATE STATISTICS z AUTO_DROP

Aby użyć statystyk automatycznego upuszczania, wystarczy dodać następujący kod do klauzuli "WITH" statystyki tworzenia lub aktualizowania.

UPDATE STATISTICS Customer (CustomerStats1) WITH AUTO_DROP = ON