Udostępnij za pośrednictwem


CREATE STATISTICS (Transact-SQL)

Dotyczy:sql ServerAzure SQL DatabaseAzure SQL Managed Instancepunkt końcowy usługi Azure Synapse AnalyticsSQL Analytics w usłudze Microsoft FabricWarehouse 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 i QUOTED_IDENTIFIER bazy danych to ON.

  • 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 PERCENTparametru liczba może wynosić od 0 do 100, a dla ROWSparametru 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 ONstatystyki zachowują procent próbkowania tworzenia dla kolejnych aktualizacji, które nie określają jawnie wartości procentowej próbkowania. Gdy OFFwartość 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_UPDATEdla 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 ONutworzeniu statystyk na partycję są tworzone statystyki. Gdy OFFstatystyki 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, PARQUETlub 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 STATISTICSprogramu , 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 opcjami STATS_STREAM, ROWCOUNTi PAGECOUNT .
  • Opcja MAXDOP jest ograniczona przez ustawienie grupy obciążeń Zarządca zasobów MAX_DOP, jeśli jest używane.
  • CREATE i DROP 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;