Udostępnij za pośrednictwem


Tworzenie i aktualizowanie statystyk tabeli w dedykowanej puli SQL

Ten artykuł zawiera zalecenia i przykłady dotyczące tworzenia i aktualizowania statystyk optymalizacji zapytań dotyczących tabel w dedykowanej puli SQL.

Dlaczego warto używać statystyk

Bardziej dedykowana pula SQL wie o danych, tym szybciej może wykonywać zapytania względem danych. Po załadowaniu danych do dedykowanej puli SQL zbieranie statystyk dotyczących danych jest jedną z najważniejszych rzeczy, które można wykonać w celu zoptymalizowania zapytań.

Dedykowany optymalizator zapytań puli SQL jest optymalizatorem opartym na kosztach. Porównuje koszt różnych planów zapytań, a następnie wybiera plan z najniższym kosztem. W większości przypadków wybiera plan, który jest wykonywany najszybciej.

Na przykład optymalizator wybiera określony plan, jeśli szacuje, że data, w której filtruje zapytanie, zwraca jeden wiersz. Jeśli optymalizator szacuje, że wybrana data zwróci milion wierszy, wybierze inny plan.

Automatyczne tworzenie statystyk

Gdy opcja bazy danych AUTO_CREATE_STATISTICS jest włączona, dedykowana pula SQL analizuje przychodzące zapytania użytkowników pod kątem brakujących statystyk.

Jeśli brakuje statystyk, optymalizator zapytań tworzy statystyki dotyczące poszczególnych kolumn w warunku predykatu zapytania lub sprzężenia w celu zwiększenia oszacowań kardynalności dla planu zapytania.

Uwaga

Automatyczne tworzenie statystyk jest obecnie domyślnie włączone.

Możesz sprawdzić, czy dedykowana pula SQL została AUTO_CREATE_STATISTICS skonfigurowana, uruchamiając następujące polecenie języka T-SQL:

SELECT name, is_auto_create_stats_on
FROM sys.databases

Jeśli dedykowana pula SQL nie została AUTO_CREATE_STATISTICS skonfigurowana, zalecamy włączenie tej właściwości, uruchamiając następujące polecenie. Zastąp <your-datawarehouse-name> ciąg nazwą dedykowanej puli SQL.

ALTER DATABASE <your-datawarehouse-name>
SET AUTO_CREATE_STATISTICS ON

Te instrukcje wyzwalają automatyczne tworzenie statystyk:

  • SELECT
  • INSERT... SELECT
  • CREATE TABLE AS SELECT (CTAS)
  • UPDATE
  • DELETE
  • EXPLAIN w przypadku wykrycia sprzężenia lub obecności predykatu

Uwaga

Automatyczne tworzenie statystyk nie jest wykonywane w tabelach tymczasowych ani zewnętrznych.

Automatyczne tworzenie statystyk jest wykonywane synchronicznie, dzięki czemu wydajność zapytań może być nieco obniżona, jeśli w kolumnach brakuje statystyk. Czas tworzenia statystyk dla pojedynczej kolumny zależy od rozmiaru tabeli.

Aby uniknąć mierzalnego obniżenia wydajności, należy najpierw upewnić się, że statystyki zostały utworzone przez wykonanie obciążenia testu porównawczego przed profilowaniem systemu.

Uwaga

Tworzenie statystyk jest rejestrowane w sys.dm_pdw_exec_requests w innym kontekście użytkownika.

Po utworzeniu automatycznych statystyk mają postać: _WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex>. Możesz wyświetlić statystyki, które zostały już utworzone, uruchamiając polecenie DBCC SHOW_STATISTICS :

DBCC SHOW_STATISTICS (<table_name>, <target>)

Jest table_name to nazwa tabeli zawierającej statystyki do wyświetlenia. Ta tabela nie może być tabelą zewnętrzną. Elementem docelowym jest nazwa docelowego indeksu, statystyk lub kolumny, dla której mają być wyświetlane informacje statystyczne.

Aktualizacja statystyk

Najlepszym rozwiązaniem jest aktualizowanie statystyk dotyczących kolumn dat każdego dnia w miarę dodawania nowych dat. Za każdym razem, gdy nowe wiersze są ładowane do dedykowanej puli SQL, dodawane są nowe daty ładowania lub daty transakcji. Te dodatki zmieniają rozkład danych i sprawiają, że statystyki są nieaktualne.

Statystyki dotyczące kolumny kraju/regionu w tabeli klienta mogą nigdy nie być aktualizowane, ponieważ rozkład wartości nie zmienia się na ogół. Zakładając, że dystrybucja jest stała między klientami, dodanie nowych wierszy do odmiany tabeli nie spowoduje zmiany rozkładu danych.

Jeśli jednak dedykowana pula SQL zawiera tylko jeden kraj/region, a dane z nowego kraju/regionu są pobierane z nowego kraju/regionu, co powoduje przechowywanie danych z wielu krajów/regionów, należy zaktualizować statystyki dotyczące kolumny kraj/region.

Poniżej przedstawiono zalecenia dotyczące aktualizowania statystyk:

Atrybut statystyk Zalecenie
Częstotliwość aktualizacji statystyk Konserwatysta: Codziennie
po załadowaniu lub przekształceniu danych
Próbkowanie Mniej niż 1 miliard wierszy użyj domyślnego próbkowania (20 procent).
W przypadku ponad 1 miliardów wierszy użyj próbkowania o dwóch procentach.

Jednym z pierwszych pytań, które należy zadać podczas rozwiązywania problemów z zapytaniem, jest "Czy statystyki są aktualne?"

Nie można odpowiedzieć na to pytanie według wieku danych. Aktualny obiekt statystyk może być stary, jeśli nie nastąpiła żadna materialna zmiana danych bazowych. Gdy liczba wierszy uległa znacznemu zmianie lub nastąpiła zmiana rozkładu wartości dla kolumny, nadszedł czas na zaktualizowanie statystyk.

Nie ma dynamicznego widoku zarządzania w celu określenia, czy dane w tabeli uległy zmianie od czasu ostatniej aktualizacji statystyk. Poniższe dwa zapytania mogą pomóc w ustaleniu, czy statystyki są nieaktualne.

  • Zapytanie 1. Znajdź różnicę między liczbą wierszy ze statystyk (stats_row_count) i rzeczywistą liczbą wierszy (actual_row_count).

    select 
    objIdsWithStats.[object_id], 
    actualRowCounts.[schema], 
    actualRowCounts.logical_table_name, 
    statsRowCounts.stats_row_count, 
    actualRowCounts.actual_row_count,
    row_count_difference = CASE
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN actualRowCounts.actual_row_count - statsRowCounts.stats_row_count
        ELSE statsRowCounts.stats_row_count - actualRowCounts.actual_row_count
    END,
    percent_deviation_from_actual = CASE
        WHEN actualRowCounts.actual_row_count = 0 THEN statsRowCounts.stats_row_count
        WHEN statsRowCounts.stats_row_count = 0 THEN actualRowCounts.actual_row_count
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (actualRowCounts.actual_row_count - statsRowCounts.stats_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
        ELSE CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (statsRowCounts.stats_row_count - actualRowCounts.actual_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
    END
    from
    (
        select distinct object_id from sys.stats where stats_id > 1
    ) objIdsWithStats
    left join
    (
        select object_id, sum(rows) as stats_row_count from sys.partitions group by object_id
    ) statsRowCounts
    on objIdsWithStats.object_id = statsRowCounts.object_id 
    left join
    (
        SELECT sm.name [schema] ,
            tb.name logical_table_name ,
            tb.object_id object_id ,
            SUM(rg.row_count) actual_row_count
        FROM sys.schemas sm
             INNER JOIN sys.tables tb ON sm.schema_id = tb.schema_id
             INNER JOIN sys.pdw_table_mappings mp ON tb.object_id = mp.object_id
             INNER JOIN sys.pdw_nodes_tables nt ON nt.name = mp.physical_name
             INNER JOIN sys.dm_pdw_nodes_db_partition_stats rg     ON rg.object_id = nt.object_id
                AND rg.pdw_node_id = nt.pdw_node_id
                AND rg.distribution_id = nt.distribution_id
        WHERE rg.index_id = 1
        GROUP BY sm.name, tb.name, tb.object_id
    ) actualRowCounts
    on objIdsWithStats.object_id = actualRowCounts.object_id
    
    
  • Zapytanie 2. Znajdź wiek statystyk, sprawdzając czas ostatniej aktualizacji statystyk w każdej tabeli.

    Uwaga

    Jeśli istnieje istotnych zmian w rozkładie wartości dla kolumny, należy zaktualizować statystyki niezależnie od czasu ich ostatniej aktualizacji.

    SELECT
        sm.[name] AS [schema_name],
        tb.[name] AS [table_name],
        co.[name] AS [stats_column_name],
        st.[name] AS [stats_name],
        STATS_DATE(st.[object_id],st.[stats_id]) AS [stats_last_updated_date]
    FROM
        sys.objects ob
        JOIN sys.stats st
            ON  ob.[object_id] = st.[object_id]
        JOIN sys.stats_columns sc
            ON  st.[stats_id] = sc.[stats_id]
            AND st.[object_id] = sc.[object_id]
        JOIN sys.columns co
            ON  sc.[column_id] = co.[column_id]
            AND sc.[object_id] = co.[object_id]
        JOIN sys.types  ty
            ON  co.[user_type_id] = ty.[user_type_id]
        JOIN sys.tables tb
            ON  co.[object_id] = tb.[object_id]
        JOIN sys.schemas sm
            ON  tb.[schema_id] = sm.[schema_id]
    WHERE
        st.[user_created] = 1;
    

Na przykład kolumny dat w dedykowanej puli SQL zwykle wymagają częstych aktualizacji statystyk. Za każdym razem, gdy nowe wiersze są ładowane do dedykowanej puli SQL, dodawane są nowe daty ładowania lub daty transakcji. Te dodatki zmieniają rozkład danych i sprawiają, że statystyki są nieaktualne.

Z drugiej strony statystyki dotyczące kolumny płci w tabeli klienta mogą nigdy nie być aktualizowane. Zakładając, że dystrybucja jest stała między klientami, dodanie nowych wierszy do odmiany tabeli nie spowoduje zmiany rozkładu danych.

Jeśli dedykowana pula SQL zawiera tylko jedną płeć, a nowe wymaganie powoduje wiele płci, musisz zaktualizować statystyki dotyczące kolumny płci.

Aby uzyskać więcej informacji, zobacz ogólne wskazówki dotyczące statystyk.

Implementowanie zarządzania statystykami

Często dobrym pomysłem jest rozszerzenie procesu ładowania danych w celu zapewnienia, że statystyki są aktualizowane na końcu obciążenia, aby uniknąć lub zminimalizować rywalizację o blokowanie lub rywalizację o zasoby między zapytaniami współbieżnymi.

Ładowanie danych polega na tym, że tabele najczęściej zmieniają ich rozmiar lub rozkład wartości. Ładowanie danych to logiczne miejsce do implementowania niektórych procesów zarządzania.

Dostępne są następujące wytyczne dotyczące aktualizowania statystyk:

  • Upewnij się, że każda załadowana tabela ma zaktualizowany co najmniej jeden obiekt statystyk. Spowoduje to zaktualizowanie informacji o rozmiarze tabeli (liczba wierszy i liczba stron) w ramach aktualizacji statystyk.
  • Skup się na kolumnach objętych klauzulami JOIN, GROUP BY, ORDER BY i DISTINCT.
  • Rozważ częstsze aktualizowanie rosnących kolumn kluczy , takich jak daty transakcji, ponieważ te wartości nie są uwzględniane w histogramie statystyk.
  • Rozważ rzadsze aktualizowanie kolumn o rozkładzie statycznym.
  • Pamiętaj, że każdy obiekt statystyk jest aktualizowany po kolei. UPDATE STATISTICS <TABLE_NAME> Implementacja nie zawsze jest idealna, szczególnie w przypadku szerokich tabel z dużą częścią obiektów statystyk.

Aby uzyskać więcej informacji, zobacz Szacowanie kardynalności.

Przykłady: Tworzenie statystyk

W tych przykładach pokazano, jak używać różnych opcji tworzenia statystyk. Opcje używane dla każdej kolumny zależą od właściwości danych i sposobu użycia kolumny w zapytaniach.

Tworzenie statystyk z jedną kolumną przy użyciu opcji domyślnych

Aby utworzyć statystyki dla kolumny, podaj nazwę obiektu statystyk i nazwę kolumny.

Ta składnia używa wszystkich opcji domyślnych. Domyślnie podczas tworzenia statystyk próbkowane jest 20 procent tabeli.

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]);

Na przykład:

CREATE STATISTICS col1_stats ON dbo.table1 (col1);

Tworzenie statystyk z jedną kolumną przez sprawdzenie każdego wiersza

Domyślna częstotliwość próbkowania wynosząca 20 procent jest wystarczająca dla większości sytuacji. Można jednak dostosować częstotliwość próbkowania.

Aby próbkować pełną tabelę, użyj następującej składni:

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]) WITH FULLSCAN;

Na przykład:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH FULLSCAN;

Tworzenie statystyk z jedną kolumną przez określenie rozmiaru próbki

Alternatywnie można określić rozmiar próbki jako procent:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH SAMPLE = 50 PERCENT;

Tworzenie statystyk z jedną kolumną tylko dla niektórych wierszy

Możesz również utworzyć statystyki dotyczące części wierszy w tabeli. Jest to nazywane przefiltrowaną statystyką.

Na przykład możesz użyć przefiltrowanych statystyk podczas planowania wykonywania zapytań dotyczących określonej partycji dużej tabeli podzielonej na partycje. Tworząc statystyki dotyczące tylko wartości partycji, dokładność statystyk poprawia się, co zwiększa wydajność zapytań.

W tym przykładzie są tworzone statystyki dotyczące zakresu wartości. Wartości można łatwo zdefiniować tak, aby odpowiadały zakresowi wartości w partycji.

CREATE STATISTICS stats_col1 ON table1(col1) WHERE col1 > '2000101' AND col1 < '20001231';

Uwaga

Aby optymalizator zapytań rozważył użycie przefiltrowanych statystyk podczas wybierania rozproszonego planu zapytania, zapytanie musi mieścić się wewnątrz definicji obiektu statystyk. Korzystając z poprzedniego przykładu, klauzula WHERE zapytania musi określać wartości col1 między 2000101 a 20001231.

Tworzenie statystyk z jedną kolumną ze wszystkimi opcjami

Możesz również połączyć opcje razem. Poniższy przykład tworzy filtrowany obiekt statystyk z niestandardowym rozmiarem próbki:

CREATE STATISTICS stats_col1 ON table1 (col1) WHERE col1 > '2000101' AND col1 < '20001231' WITH SAMPLE = 50 PERCENT;

Aby uzyskać pełną dokumentację, zobacz CREATE STATISTICS (TWORZENIE STATYSTYK).

Tworzenie statystyk wielokolumnach

Aby utworzyć obiekt statystyk z wieloma kolumnami, użyj poprzednich przykładów, ale określ więcej kolumn.

Uwaga

Histogram, który służy do oszacowania liczby wierszy w wyniku zapytania, jest dostępny tylko dla pierwszej kolumny wymienionej w definicji obiektu statystyk.

W tym przykładzie histogram znajduje się na .product_category Statystyki międzykolumna są obliczane według product_category wartości i product_sub_category:

CREATE STATISTICS stats_2cols ON table1 (product_category, product_sub_category) WHERE product_category > '2000101' AND product_category < '20001231' WITH SAMPLE = 50 PERCENT;

Ponieważ istnieje korelacja między product_category i product_sub_category, obiekt statystyk wielokolumny może być przydatny, jeśli te kolumny są dostępne w tym samym czasie.

Tworzenie statystyk dotyczących wszystkich kolumn w tabeli

Jednym ze sposobów tworzenia statystyk jest wydawanie CREATE STATISTICS poleceń po utworzeniu tabeli:

CREATE TABLE dbo.table1
(
   col1 int
,  col2 int
,  col3 int
)
WITH
  (
    CLUSTERED COLUMNSTORE INDEX
  )
;

CREATE STATISTICS stats_col1 on dbo.table1 (col1);
CREATE STATISTICS stats_col2 on dbo.table2 (col2);
CREATE STATISTICS stats_col3 on dbo.table3 (col3);

Tworzenie statystyk dotyczących wszystkich kolumn w puli SQL przy użyciu procedury składowanej

Dedykowana pula SQL nie ma systemowej procedury składowanej równoważnej sp_create_stats w programie SQL Server. Ta procedura składowana tworzy obiekt statystyki pojedynczej kolumny dla każdej kolumny w puli SQL, która nie ma jeszcze statystyk.

W poniższym przykładzie pokazano, jak rozpocząć pracę z projektem puli SQL. Możesz dostosować go do swoich potrzeb.

CREATE PROCEDURE    [dbo].[prc_sqldw_create_stats]
(   @create_type    tinyint -- 1 default 2 Fullscan 3 Sample
,   @sample_pct     tinyint
)
AS

IF @create_type IS NULL
BEGIN
    SET @create_type = 1;
END;

IF @create_type NOT IN (1,2,3)
BEGIN
    THROW 151000,'Invalid value for @stats_type parameter. Valid range 1 (default), 2 (fullscan) or 3 (sample).',1;
END;

IF @sample_pct IS NULL
BEGIN;
    SET @sample_pct = 20;
END;

IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN;
    DROP TABLE #stats_ddl;
END;

CREATE TABLE #stats_ddl
WITH    (   DISTRIBUTION    = HASH([seq_nmbr])
        ,   LOCATION        = USER_DB
        )
AS
WITH T
AS
(
SELECT      t.[name]                        AS [table_name]
,           s.[name]                        AS [table_schema_name]
,           c.[name]                        AS [column_name]
,           c.[column_id]                   AS [column_id]
,           t.[object_id]                   AS [object_id]
,           ROW_NUMBER()
            OVER(ORDER BY (SELECT NULL))    AS [seq_nmbr]
FROM        sys.[tables] t
JOIN        sys.[schemas] s         ON  t.[schema_id]       = s.[schema_id]
JOIN        sys.[columns] c         ON  t.[object_id]       = c.[object_id]
LEFT JOIN   sys.[stats_columns] l   ON  l.[object_id]       = c.[object_id]
                                    AND l.[column_id]       = c.[column_id]
                                    AND l.[stats_column_id] = 1
LEFT JOIN    sys.[external_tables] e    ON    e.[object_id]        = t.[object_id]
WHERE       l.[object_id] IS NULL
AND            e.[object_id] IS NULL -- not an external table
)
SELECT  [table_schema_name]
,       [table_name]
,       [column_name]
,       [column_id]
,       [object_id]
,       [seq_nmbr]
,       CASE @create_type
        WHEN 1
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+')' AS VARCHAR(8000))
        WHEN 2
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH FULLSCAN' AS VARCHAR(8000))
        WHEN 3
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH SAMPLE '+CONVERT(varchar(4),@sample_pct)+' PERCENT' AS VARCHAR(8000))
        END AS create_stat_ddl
FROM T
;

DECLARE @i INT              = 1
,       @t INT              = (SELECT COUNT(*) FROM #stats_ddl)
,       @s NVARCHAR(4000)   = N''
;

WHILE @i <= @t
BEGIN
    SET @s=(SELECT create_stat_ddl FROM #stats_ddl WHERE seq_nmbr = @i);

    PRINT @s
    EXEC sp_executesql @s
    SET @i+=1;
END

DROP TABLE #stats_ddl;

Aby utworzyć statystyki dotyczące wszystkich kolumn w tabeli przy użyciu wartości domyślnych, wykonaj procedurę składowaną.

EXEC [dbo].[prc_sqldw_create_stats] 1, NULL;

Aby utworzyć statystyki dotyczące wszystkich kolumn w tabeli przy użyciu funkcji fullscan, wywołaj tę procedurę.

EXEC [dbo].[prc_sqldw_create_stats] 2, NULL;

Aby utworzyć przykładowe statystyki dla wszystkich kolumn w tabeli, wprowadź wartość 3 i procent próbki. Ta procedura używa współczynnika próbkowania 20 procent.

EXEC [dbo].[prc_sqldw_create_stats] 3, 20;

Przykłady: Aktualizowanie statystyk

Aby zaktualizować statystyki, możesz:

  • Zaktualizuj jeden obiekt statystyk. Określ nazwę obiektu statystyk, który chcesz zaktualizować.
  • Zaktualizuj wszystkie obiekty statystyczne w tabeli. Określ nazwę tabeli zamiast jednego określonego obiektu statystyk.

Aktualizowanie jednego określonego obiektu statystyk

Użyj następującej składni, aby zaktualizować określony obiekt statystyk:

UPDATE STATISTICS [schema_name].[table_name]([stat_name]);

Na przykład:

UPDATE STATISTICS [dbo].[table1] ([stats_col1]);

Aktualizując określone obiekty statystyczne, można zminimalizować czas i zasoby wymagane do zarządzania statystykami. Wymaga to, aby niektórzy myśleli, aby wybrać najlepsze obiekty statystyczne do zaktualizowania.

Aktualizowanie wszystkich statystyk w tabeli

Prostą metodą aktualizowania wszystkich obiektów statystyk w tabeli jest:

UPDATE STATISTICS [schema_name].[table_name];

Na przykład:

UPDATE STATISTICS dbo.table1;

Instrukcja UPDATE STATISTICS jest łatwa w użyciu. Należy pamiętać, że aktualizuje wszystkie statystyki w tabeli i dlatego może wykonywać więcej pracy niż jest to konieczne. Jeśli wydajność nie jest problemem, jest to najprostszy i najbardziej kompletny sposób zagwarantowania aktualności statystyk.

Uwaga

Podczas aktualizowania wszystkich statystyk w tabeli dedykowana pula SQL wykonuje skanowanie w celu próbkowania tabeli dla każdego obiektu statystyk. Jeśli tabela jest duża i zawiera wiele kolumn i wiele statystyk, bardziej wydajne może być aktualizowanie poszczególnych statystyk w zależności od potrzeb.

Aby zapoznać się z implementacją UPDATE STATISTICS procedury, zobacz Tabele tymczasowe. Metoda implementacji różni się nieco od powyższej CREATE STATISTICS procedury, ale wynik jest taki sam.

Aby uzyskać pełną składnię, zobacz Update Statistics (Statystyki aktualizacji).

Metadane statystyk

Istnieje kilka widoków i funkcji systemowych, których można użyć do znajdowania informacji o statystykach. Na przykład możesz sprawdzić, czy obiekt statystyk może być nieaktualny, używając funkcji stats-date, aby sprawdzić, kiedy statystyki zostały ostatnio utworzone lub zaktualizowane.

Widoki wykazu dla statystyk

Te widoki systemowe zawierają informacje o statystykach:

Widok wykazu opis
sys.columns Jeden wiersz dla każdej kolumny
sys.objects Jeden wiersz dla każdego obiektu w bazie danych
sys.schemas Jeden wiersz dla każdego schematu w bazie danych
sys.stats Jeden wiersz dla każdego obiektu statystyk
sys.stats_columns Jeden wiersz dla każdej kolumny w obiekcie statystyk; łącza z powrotem do pliku sys.columns
sys.tables Jeden wiersz dla każdej tabeli (łącznie z tabelami zewnętrznymi)
sys.table_types Jeden wiersz dla każdego typu danych

Funkcje systemowe statystyk

Te funkcje systemowe są przydatne do pracy ze statystykami:

Funkcja systemowa opis
STATS_DATE Data ostatniej aktualizacji obiektu statystyk
DBCC SHOW_STATISTICS Poziom podsumowania i szczegółowe informacje dotyczące rozkładu wartości w rozumieniu obiektu statystyk

Łączenie kolumn i funkcji statystyk w jednym widoku

Ten widok łączy kolumny, które odnoszą się do statystyk i wyników z STATS_DATE() funkcji.

CREATE VIEW dbo.vstats_columns
AS
SELECT
        sm.[name]                           AS [schema_name]
,       tb.[name]                           AS [table_name]
,       st.[name]                           AS [stats_name]
,       st.[filter_definition]              AS [stats_filter_definition]
,       st.[has_filter]                     AS [stats_is_filtered]
,       STATS_DATE(st.[object_id],st.[stats_id])
                                            AS [stats_last_updated_date]
,       co.[name]                           AS [stats_column_name]
,       ty.[name]                           AS [column_type]
,       co.[max_length]                     AS [column_max_length]
,       co.[precision]                      AS [column_precision]
,       co.[scale]                          AS [column_scale]
,       co.[is_nullable]                    AS [column_is_nullable]
,       co.[collation_name]                 AS [column_collation_name]
,       QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS two_part_name
,       QUOTENAME(DB_NAME())+'.'+QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS three_part_name
FROM    sys.objects                         AS ob
JOIN    sys.stats           AS st ON    ob.[object_id]      = st.[object_id]
JOIN    sys.stats_columns   AS sc ON    st.[stats_id]       = sc.[stats_id]
                            AND         st.[object_id]      = sc.[object_id]
JOIN    sys.columns         AS co ON    sc.[column_id]      = co.[column_id]
                            AND         sc.[object_id]      = co.[object_id]
JOIN    sys.types           AS ty ON    co.[user_type_id]   = ty.[user_type_id]
JOIN    sys.tables          AS tb ON  co.[object_id]        = tb.[object_id]
JOIN    sys.schemas         AS sm ON  tb.[schema_id]        = sm.[schema_id]
WHERE   1=1
AND     st.[user_created] = 1
;

Przykłady SHOW_STATISTICS DBCC ()

DBCC SHOW_STATISTICS() pokazuje dane przechowywane w obiekcie statystyk. Te dane są dostępne w trzech częściach:

  • Nagłówek
  • Wektor gęstości
  • Histogram

Metadane nagłówka dotyczące statystyk. Histogram wyświetla rozkład wartości w pierwszej kolumnie klucza obiektu statystyk. Wektor gęstości mierzy korelację krzyżową.

Uwaga

Dedykowana pula SQL oblicza szacunki kardynalności z dowolnymi danymi w obiekcie statystyk.

Pokaż nagłówek, gęstość i histogram

W tym prostym przykładzie przedstawiono wszystkie trzy części obiektu statystyk:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>)

Na przykład:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1);

Pokaż co najmniej jedną część SHOW_STATISTICS DBCC()

Jeśli interesuje Cię tylko wyświetlanie określonych części, użyj klauzuli WITH i określ, które części chcesz zobaczyć:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>) WITH stat_header, histogram, density_vector

Na przykład:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1) WITH histogram, density_vector

Różnice SHOW_STATISTICS DBCC ()

DBCC SHOW_STATISTICS() program jest bardziej ściśle zaimplementowany w dedykowanej puli SQL w porównaniu z programem SQL Server:

  • Funkcje nieudokumentowane nie są obsługiwane.
  • Nie można użyć polecenia Stats_stream.
  • Nie można połączyć wyników dla określonych podzestawów danych statystycznych. Na przykład STAT_HEADER JOIN DENSITY_VECTOR.
  • NO_INFOMSGS Nie można ustawić dla pomijania komunikatów.
  • Nawiasy kwadratowe wokół nazw statystyk nie mogą być używane.
  • Nie można używać nazw kolumn do identyfikowania obiektów statystyk.
  • Błąd niestandardowy 2767 nie jest obsługiwany.

Monitorowanie obciążenia dedykowanej puli SQL usługi Azure Synapse Analytics przy użyciu widoków DMV