CREATE STATISTICS (Transact-SQL)
Dotyczy:sql Server
Azure SQL Database
Azure SQL Managed Instance
punkt końcowy usługi Azure Synapse Analytics
SQL Analytics w usłudze Microsoft Fabric
Warehouse w usłudze Microsoft Fabric
Tworzy statystyki optymalizacji zapytań dla co najmniej jednej kolumny tabeli, widoku indeksowanego lub tabeli zewnętrznej. W przypadku większości zapytań optymalizator zapytań generuje już niezbędne statystyki dla planu zapytań wysokiej jakości; w kilku przypadkach należy utworzyć dodatkowe statystyki za pomocą CREATE STATISTICS
funkcji lub zmodyfikować projekt zapytania, aby poprawić wydajność zapytań.
Aby dowiedzieć się więcej, zobacz Statystyki.
Uwaga
Aby uzyskać więcej informacji na temat statystyk w usłudze Microsoft Fabric, zobacz Statystyki magazynowania danych w sieci szkieletowej.
Transact-SQL konwencje składni
Składnia
Składnia dla programu SQL Server, usługi Azure SQL Database i usługi Azure SQL Managed Instance.
-- Create statistics on an external table
CREATE STATISTICS statistics_name
ON { table_or_indexed_view_name } ( column [ , ...n ] )
[ WITH FULLSCAN ] ;
-- Create statistics on a regular table or indexed view
CREATE STATISTICS statistics_name
ON { table_or_indexed_view_name } ( column [ , ...n ] )
[ WHERE <filter_predicate> ]
[ WITH
[ FULLSCAN
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| SAMPLE number { PERCENT | ROWS }
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| <update_stats_stream_option> [ , ...n ]
[ [ , ] NORECOMPUTE ]
[ [ , ] INCREMENTAL = { ON | OFF } ]
[ [ , ] MAXDOP = max_degree_of_parallelism ]
[ [ , ] AUTO_DROP = { ON | OFF } ]
]
];
<filter_predicate> ::=
<conjunct> [ AND <conjunct> ]
<conjunct> ::=
<disjunct> | <comparison>
<disjunct> ::=
column_name IN (constant , ...)
<comparison> ::=
column_name <comparison_op> constant
<comparison_op> ::=
IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<
<update_stats_stream_option> ::=
[ STATS_STREAM = stats_stream ]
[ ROWCOUNT = numeric_constant ]
[ PAGECOUNT = numeric_constant ]
Składnia dla usług Azure Synapse Analytics i Analytics Platform System (PDW).
CREATE STATISTICS statistics_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
( column_name [ , ...n ] )
[ WHERE <filter_predicate> ]
[ WITH {
FULLSCAN
| SAMPLE number PERCENT
}
]
[ ; ]
<filter_predicate> ::=
<conjunct> [ AND <conjunct> ]
<conjunct> ::=
<disjunct> | <comparison>
<disjunct> ::=
column_name IN (constant , ...)
<comparison> ::=
column_name <comparison_op> constant
<comparison_op> ::=
IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<
Składnia dla usługi Microsoft Fabric.
CREATE STATISTICS statistics_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
( column_name )
[ WITH {
FULLSCAN
| SAMPLE number PERCENT
}
]
[ ; ]
Argumenty (w programowaniu)
statistics_name
Nazwa statystyk do utworzenia.
table_or_indexed_view_name
Nazwa tabeli, widoku indeksowanego lub tabeli zewnętrznej, na której ma zostać utworzona statystyka. Aby utworzyć statystyki dla innej bazy danych, określ kwalifikowaną nazwę tabeli.
kolumna [ ,... n ]
Co najmniej jedna kolumna, która ma zostać uwzględniona w statystykach. Kolumny powinny być w kolejności priorytetu od lewej do prawej. Tylko pierwsza kolumna jest używana do tworzenia histogramu. Wszystkie kolumny są używane do statystyk korelacji międzykolumnach nazywanych gęstościami.
Można określić dowolną kolumnę, którą można określić jako kolumnę klucza indeksu z następującymi wyjątkami:
Nie można określić kolumn xml, pełnotekstowych i FILESTREAM.
Obliczone kolumny można określić tylko wtedy, gdy
ARITHABORT
ustawienia iQUOTED_IDENTIFIER
bazy danych toON
.Kolumny typu zdefiniowanego przez użytkownika środowiska CLR można określić, jeśli typ obsługuje kolejność binarną. Kolumny obliczane zdefiniowane jako wywołania metody kolumny typu zdefiniowanej przez użytkownika można określić, jeśli metody są oznaczone deterministyczną.
GDZIE <filter_predicate>
Określa wyrażenie służące do wybierania podzestawu wierszy do uwzględnienia podczas tworzenia obiektu statystyk. Statystyki tworzone za pomocą predykatu filtru są nazywane przefiltrowaną statystyką. Predykat filtru używa prostej logiki porównania i nie może odwoływać się do kolumny obliczeniowej, kolumny UDT, kolumny typu danych przestrzennych ani kolumny typu danych hierarchyID . Porównania używające NULL
literałów nie są dozwolone w przypadku operatorów porównania. Zamiast tego użyj operatorów IS NULL
i IS NOT NULL
.
Oto kilka przykładów predykatów filtrów dla tabeli Production.BillOfMaterials
:
WHERE StartDate > '20000101' AND EndDate <= '20000630'
WHERE ComponentID IN (533, 324, 753)
WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL
Aby uzyskać więcej informacji na temat predykatów filtrów, zobacz Tworzenie filtrowanych indeksów.
FULLSCAN
Dotyczy: SQL Server 2016 (13.x) SP 1 CU 4, SQL Server 2017 (14.x) CU 1 i nowsze wersje
Obliczanie statystyk przez skanowanie wszystkich wierszy.
FULLSCAN
i SAMPLE 100 PERCENT
mają te same wyniki.
FULLSCAN
nie można używać z opcją SAMPLE
.
Po pominięciu program SQL Server używa próbkowania do utworzenia statystyk i określa rozmiar próbki wymagany do utworzenia planu zapytań wysokiej jakości.
W magazynie w usłudze Microsoft Fabric obsługiwane są tylko jednokolumny FULLSCAN
i jednokolumny statystyki oparte na jednej kolumnie SAMPLE
. Jeśli nie zostanie uwzględniona żadna opcja, SAMPLE
zostaną utworzone statystyki.
LICZBA PRÓBEK { PERCENT | WIERSZE }
Określa przybliżoną wartość procentową lub liczbę wierszy w tabeli lub widoku indeksowanym, który ma być używany przez optymalizator zapytań podczas tworzenia statystyk. W przypadku PERCENT
parametru liczba może wynosić od 0 do 100, a dla ROWS
parametru 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.
SAMPLE
jest przydatna w specjalnych przypadkach, w których plan zapytania oparty na domyślnym próbkowaniu nie jest optymalny. W większości sytuacji nie jest konieczne określenie SAMPLE
, ponieważ optymalizator zapytań już 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.
SAMPLE
Nie można używać z opcją FULLSCAN.
FULLSCAN
Jeśli SAMPLE
optymalizator zapytań domyślnie używa próbkowanych danych i oblicza rozmiar próbki.
Zalecamy określenie parametru 0 PERCENT
lub 0 ROWS
. Gdy 0 PERCENT
zostanie określony obiekt statystyki lub 0 ROWS
zostanie określony, zostanie utworzony, ale nie zawiera danych statystycznych.
W magazynie w usłudze Microsoft Fabric obsługiwane są tylko jednokolumny FULLSCAN
i jednokolumny statystyki oparte na jednej kolumnie SAMPLE
. Jeśli nie zostanie uwzględniona żadna opcja, FULLSCAN
zostaną utworzone statystyki.
PERSIST_SAMPLE_PERCENT = { ON | WYŁ. }
Gdy ON
statystyki zachowują procent próbkowania tworzenia dla kolejnych aktualizacji, które nie określają jawnie wartości procentowej próbkowania. Gdy OFF
wartość procentowa próbkowania statystyk zostanie zresetowana do domyślnego próbkowania w kolejnych aktualizacjach, które nie określają jawnie wartości procentowej próbkowania. Wartość domyślna to OFF
.
Uwaga
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. Podobnie jeśli statystyki są aktualizowane dla obiektu bez wierszy, przywraca domyślny procent próbkowania, nawet jeśli PERSIST_SAMPLE_PERCENT
został wcześniej skonfigurowany.
STATS_STREAM = stats_stream
Zidentyfikowane tylko do celów informacyjnych. Nie jest obsługiwane. Zgodność w przyszłości nie jest gwarantowana.
NORECOMPUTE
Wyłącz opcję automatycznej aktualizacji statystyk , AUTO_STATISTICS_UPDATE
dla statistics_name. Jeśli ta opcja zostanie określona, optymalizator zapytań ukończy wszelkie aktualizacje statystyk w toku dla statistics_name i wyłączy przyszłe aktualizacje.
Aby ponownie włączyć aktualizacje statystyk, usuń statystyki z funkcją DROP STATISTICS , a następnie uruchom CREATE STATISTICS
bez NORECOMPUTE
opcji .
Ostrzeżenie
Jeśli wyłączysz automatyczne aktualizowanie statystyk, może to uniemożliwić optymalizatorowi zapytań wybranie optymalnych planów wykonywania zapytań obejmujących tabelę. Tej opcji należy używać oszczędnie i tylko przez kwalifikowanego administratora bazy danych.
Aby uzyskać więcej informacji na temat AUTO_STATISTICS_UPDATE
opcji, zobacz ALTER DATABASE SET options (OPCJE ALTER DATABASE SET). Aby uzyskać więcej informacji na temat wyłączania i ponownego włączania aktualizacji statystyk, zobacz Statystyki.
INCREMENTAL = { ON | WYŁ. }
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje
Po ON
utworzeniu statystyk na partycję są tworzone statystyki. Gdy OFF
statystyki są łączone dla wszystkich partycji. 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 2016 (13.x) SP 2, SQL Server 2017 (14.x) CU 3 i nowsze wersje
Zastępuje opcję konfiguracji maksymalnego stopnia równoległości podczas operacji statystyki. Aby uzyskać więcej informacji, zobacz Konfigurowanie maksymalnego stopnia równoległości (opcja konfiguracji serwera). Użyj MAXDOP
polecenia , 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 operacji indeksowania równoległego do określonej liczby. -
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. Nie jest obsługiwane. Zgodność w przyszłości nie jest gwarantowana.
AUTO_DROP = { ON | WYŁ. }
Dotyczy: SQL Server 2022 (16.x) i nowsze wersje oraz Azure SQL Database, Azure SQL Managed Instance
Przed programem SQL Server 2022 (16.x), jeśli statystyki są tworzone ręcznie przez użytkownika lub narzędzie innej firmy w bazie danych użytkownika, 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), AUTO_DROP
opcja jest domyślnie włączona dla wszystkich nowych i migrowanych baz danych. Właściwość AUTO_DROP
umożliwia tworzenie obiektów statystyk w trybie, tak aby kolejna zmiana schematu nie została zablokowana przez obiekt statystyk, ale zamiast tego statystyki są usuwane w razie potrzeby. W ten sposób ręcznie utworzono statystyki z włączonym AUTO_DROP
zachowaniem jak statystyki tworzone automatycznie.
Uwaga
Próba ustawienia lub odstawienia właściwości Auto_Drop w statystykach utworzonych automatycznie może spowodować błędy. Automatycznie tworzone 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. Podczas przywracania bazy danych do programu SQL Server 2022 (16.x) z poprzedniej wersji zaleca się wykonanie sp_updatestats
jej w bazie danych, ustawienie odpowiednich metadanych dla funkcji statystyk AUTO_DROP
.
Aby uzyskać więcej informacji, zobacz AUTO_DROP opcja.
Uprawnienia
Wymaga jednego z następujących uprawnień:
ALTER TABLE
- Użytkownik jest właścicielem tabeli
- Członkostwo w stałej roli bazy danych db_ddladmin
Uwagi
Program SQL Server może użyć tempdb
polecenia do sortowania przykładowych wierszy przed utworzeniem statystyk.
Statystyki tabel zewnętrznych
Podczas tworzenia statystyk tabeli zewnętrznej program SQL Server importuje tabelę zewnętrzną do tymczasowej tabeli programu SQL Server, a następnie tworzy statystyki. W przypadku statystyk przykładów importowane są tylko próbkowane wiersze. Jeśli masz dużą tabelę zewnętrzną, szybciej jest używać domyślnego próbkowania zamiast opcji pełnego skanowania.
Gdy tabela zewnętrzna używa DELIMITEDTEXT
, CSV
, PARQUET
lub DELTA
jako typów danych, tabele zewnętrzne obsługują tylko statystyki dla jednej kolumny na CREATE STATISTICS
polecenia.
Statystyka z filtrowanym warunkiem
Przefiltrowane statystyki mogą zwiększyć wydajność zapytań dla zapytań wybranych z dobrze zdefiniowanych podzestawów danych. Przefiltrowane statystyki używają predykatu filtru w klauzuli WHERE, aby wybrać podzbiór danych uwzględnionych w statystykach.
Kiedy należy używać funkcji CREATE STATISTICS
Aby uzyskać więcej informacji na temat tego, kiedy używać CREATE STATISTICS
programu , zobacz Statystyki.
Odwołania do zależności dla przefiltrowanych statystyk
Widok katalogu sys.sql_expression_dependencies śledzi każdą kolumnę w filtrowanych predykatach statystyk jako zależność odwołującą się. Przed utworzeniem przefiltrowanych statystyk należy wziąć pod uwagę operacje wykonywane w kolumnach tabeli. Nie można usunąć, zmienić nazwy ani zmienić definicji kolumny tabeli zdefiniowanej w przefiltrowanej predykacie statystyk.
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.
- Można wyświetlić maksymalnie 64 kolumny na obiekt statystyk.
- Opcja nie jest zgodna
MAXDOP
z opcjamiSTATS_STREAM
,ROWCOUNT
iPAGECOUNT
. - Opcja
MAXDOP
jest ograniczona przez ustawienie grupy obciążeń Zarządca zasobówMAX_DOP
, jeśli jest używane. -
CREATE
iDROP STATISTICS
w tabelach zewnętrznych nie są obsługiwane w usłudze Azure SQL Database.
Przykłady
Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2022
lub AdventureWorksDW2022
, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.
Odp. Używanie FUNKCJI CREATE STATISTICS z UŻYCIEM LICZBY PRÓBEK PROCENT
Poniższy przykład tworzy ContactMail1
statystyki przy użyciu losowej próbki 5 procent BusinessEntityID
kolumn Person
i EmailPromotion
tabeli bazy danych AdventureWorks2022.
CREATE STATISTICS ContactMail1
ON Person.Person (BusinessEntityID, EmailPromotion)
WITH SAMPLE 5 PERCENT;
B. Używanie FUNKCJI CREATE STATISTICS z FUNKCJą FULLSCAN i NORECOMPUTE
Poniższy przykład tworzy NamePurchase
statystyki dla wszystkich wierszy w BusinessEntityID
kolumnach Person
i tabeli i EmailPromotion
wyłącza automatyczne ponowne obliczanie statystyk.
CREATE STATISTICS NamePurchase
ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
WITH FULLSCAN, NORECOMPUTE;
C. Tworzenie przefiltrowanych statystyk przy użyciu funkcji CREATE STATISTICS
Poniższy przykład tworzy przefiltrowane statystyki ContactPromotion1
. Aparat bazy danych próbkuje 50 procent danych, a następnie wybiera wiersze o EmailPromotion
wartości równej 2.
CREATE STATISTICS ContactPromotion1
ON Person.Person (BusinessEntityID, LastName, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO
D. Tworzenie statystyk dotyczących tabeli zewnętrznej
Jedyną decyzją, którą należy podjąć podczas tworzenia statystyk dla tabeli zewnętrznej, oprócz udostępniania listy kolumn, jest to, czy utworzyć statystyki przez próbkowanie wierszy, czy przez skanowanie wszystkich wierszy.
CREATE
i DROP STATISTICS
w tabelach zewnętrznych nie są obsługiwane w usłudze Azure SQL Database.
Ponieważ program SQL Server importuje dane z tabeli zewnętrznej do tabeli tymczasowej w celu utworzenia statystyk, opcja pełnego skanowania trwa znacznie dłużej. W przypadku dużej tabeli domyślna metoda próbkowania jest zwykle wystarczająca.
--Create statistics on an external table and use default sampling.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress);
--Create statistics on an external table and scan all the rows
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress) WITH FULLSCAN;
E. Używanie funkcji CREATE STATISTICS z funkcją FULLSCAN i PERSIST_SAMPLE_PERCENT
Poniższy przykład tworzy NamePurchase
statystyki dla wszystkich wierszy w BusinessEntityID
tabeli Person
i i EmailPromotion
i i ustawia 100 procent procent procent próbkowania dla wszystkich kolejnych aktualizacji, które nie określają jawnie wartości procentowej próbkowania.
CREATE STATISTICS NamePurchase
ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
WITH FULLSCAN, PERSIST_SAMPLE_PERCENT = ON;
Przykłady użycia bazy danych AdventureWorksDW
F. Tworzenie statystyk dotyczących dwóch kolumn
Poniższy przykład tworzy CustomerStats1
statystyki na CustomerKey
podstawie kolumn DimCustomer
i EmailAddress
tabeli . Statystyki są tworzone na podstawie statystycznie znaczącego próbkowania wierszy w Customer
tabeli.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress);
G. Tworzenie statystyk przy użyciu pełnego skanowania
Poniższy przykład tworzy CustomerStatsFullScan
statystyki na podstawie skanowania wszystkich wierszy w DimCustomer
tabeli.
CREATE STATISTICS CustomerStatsFullScan
ON DimCustomer (CustomerKey, EmailAddress) WITH FULLSCAN;
H. Tworzenie statystyk przez określenie przykładowej wartości procentowej
Poniższy przykład tworzy CustomerStatsSampleScan
statystyki na podstawie skanowania 50 procent wierszy w DimCustomer
tabeli.
CREATE STATISTICS CustomerStatsSampleScan
ON DimCustomer (CustomerKey, EmailAddress) WITH SAMPLE 50 PERCENT;
I. 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.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress) WITH AUTO_DROP = ON
Aby ocenić ustawienie automatycznego upuszczania dla istniejących statystyk, użyj auto_drop
kolumny w pliku sys.stats:
SELECT object_id, [name], auto_drop
FROM sys.stats;