Statystyki tabeli dedykowanej puli SQL w usłudze Azure Synapse Analytics
W tym artykule znajdziesz zalecenia i przykłady dotyczące tworzenia i aktualizowania statystyk optymalizacji zapytań w tabelach 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 czynności, 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 będzie wykonywany najszybciej.
Jeśli na przykład optymalizator szacuje, że data filtrowania zapytania zwróci jeden wiersz, wybierze jeden plan. Jeśli szacuje się, że wybrana data zwróci 1 milion wierszy, zwróci inny plan.
Automatyczne tworzenie statystyk
Gdy opcja AUTO_CREATE_STATISTICS bazy danych jest włączona, dedykowana pula SQL analizuje przychodzące zapytania użytkowników w celu uzyskania brakujących statystyk.
Jeśli brakuje statystyk, optymalizator zapytań tworzy statystyki dotyczące poszczególnych kolumn w predykacie zapytania lub warunku sprzężenia w celu poprawy szacowania kardynalności dla planu zapytania.
Uwaga
Automatyczne tworzenie statystyk jest obecnie domyślnie włączone.
Możesz sprawdzić, czy dedykowana pula SQL ma skonfigurowaną AUTO_CREATE_STATISTICS, uruchamiając następujące polecenie:
SELECT name, is_auto_create_stats_on
FROM sys.databases
Jeśli dedykowana pula SQL nie ma skonfigurowanej AUTO_CREATE_STATISTICS, zalecamy włączenie tej właściwości, uruchamiając następujące polecenie:
ALTER DATABASE <yourdatawarehousename>
SET AUTO_CREATE_STATISTICS ON
Te instrukcje będą wyzwalać automatyczne tworzenie statystyk:
- SELECT
- INSERT-SELECT
- CTAS
- UPDATE
- DELETE
- WYJAŚNIENIE w przypadku wykrycia sprzężenia lub obecności predykatu
Uwaga
Automatyczne tworzenie statystyk nie jest tworzone w tabelach tymczasowych ani zewnętrznych.
Automatyczne tworzenie statystyk jest wykonywane synchronicznie, dlatego wydajność zapytań może spowodować nieznaczną obniżenie wydajności zapytań, 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 porównawczego przed profilowaniem systemu.
Uwaga
Tworzenie statystyk zostanie zarejestrowane w sys.dm_pdw_exec_requests w innym kontekście użytkownika.
Po utworzeniu automatycznych statystyk będą miały postać: WA_Sys<8-cyfrowy identyfikator kolumny w identyfikatorze tabeli szesnastkowej szesnastkowej>><. Możesz wyświetlić statystyki, które zostały już utworzone, uruchamiając polecenie DBCC SHOW_STATISTICS :
DBCC SHOW_STATISTICS (<table_name>, <target>)
Table_name to nazwa tabeli zawierającej statystyki do wyświetlenia. Ta tabela nie może być tabelą zewnętrzną. Element docelowy to nazwa indeksu docelowego, statystyk lub kolumny, dla której mają być wyświetlane informacje statystyczne.
Aktualizacja statystyk
Najlepszym rozwiązaniem jest zaktualizowanie 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 są nieaktualne.
Statystyki dotyczące kolumny kraju/regionu w tabeli klienta mogą nigdy nie być aktualizowane, ponieważ rozkład wartości nie ulega ogólnej zmianie. 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 i dane są wprowadzane 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 | Konserwatywny: 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?"
To pytanie nie jest takie, na które można odpowiedzieć według wieku danych. Aktualny obiekt statystyk może być stary, jeśli nie wprowadzono żadnych zmian w danych bazowych. Gdy liczba wierszy uległa znacznej zmianie lub nastąpiła istotna 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: Zapoznaj się z 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: Sprawdź wiek statystyk, sprawdzając czas ostatniej aktualizacji statystyk w każdej tabeli.
Uwaga
Jeśli nastąpiła zmiana materialna 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;
Kolumny dat w dedykowanej puli SQL, na przykład, 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 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ć i 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ąć/zminimalizować rywalizację o blokowanie lub rywalizację o zasoby między zapytaniami współbieżnymi.
Obciążenie danych polega na tym, że tabele najczęściej zmieniają ich rozmiar i/lub rozkład wartości. Ładowanie danych to logiczne miejsce do implementowania niektórych procesów zarządzania.
Do aktualizowania statystyk podano następujące wytyczne:
- Upewnij się, że każda załadowana tabela ma co najmniej jeden obiekt statystyk zaktualizowany. Spowoduje to zaktualizowanie informacji o rozmiarze tabeli (liczba wierszy i liczba stron) w ramach aktualizacji statystyk.
- Skup się na kolumnach uczestniczących w klauzulach JOIN, GROUP BY, ORDER BY i DISTINCT.
- Rozważ zaktualizowanie kolumn "klucza rosnącego", takich jak daty transakcji częściej, ponieważ te wartości nie zostaną uwzględnione w histogramie statystyk.
- Rozważ rzadziej aktualizowanie kolumn rozkładu statycznego.
- Pamiętaj, że każdy obiekt statystyk jest aktualizowany w sekwencji. Po prostu implementacja
UPDATE STATISTICS <TABLE_NAME>
nie zawsze jest idealna, zwłaszcza 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 cech danych i sposobu użycia kolumny w zapytaniach.
Tworzenie statystyk jednokolumnach z opcjami domyślnymi
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]);
Przykład:
CREATE STATISTICS col1_stats ON dbo.table1 (col1);
Tworzenie statystyk z jedną kolumną przez zbadanie każdego wiersza
Domyślna częstotliwość próbkowania wynosząca 20 procent jest wystarczająca w przypadku 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;
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żna użyć filtrowanych statystyk podczas planowania wykonywania zapytań dotyczących określonej partycji dużej tabeli partycjonowanej. Tworząc statystyki dotyczące tylko wartości partycji, dokładność statystyk zwiększy się i w związku z tym poprawi 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żał użycie filtrowanych statystyk podczas wybierania planu zapytania rozproszonego, zapytanie musi mieścić się wewnątrz definicji obiektu statystyk. W poprzednim przykładzie klauzula WHERE zapytania musi określać wartości kolumny col1 między 2000101 a 20001231.
Tworzenie statystyk z jedną kolumną ze wszystkimi opcjami
Możesz również połączyć te opcje. 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 szacowania 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 na podstawie product_category 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 a product_sub_category, obiekt statystyk z wieloma kolumnami może być przydatny, jeśli te kolumny są dostępne w tym samym czasie.
Tworzenie statystyk dla wszystkich kolumn w tabeli
Jednym ze sposobów tworzenia statystyk jest wydawanie poleceń CREATE STATISTICS 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 za pomocą procedury składowanej
Dedykowana pula SQL nie ma systemowej procedury składowanej równoważnej sp_create_stats w SQL Server. Ta procedura składowana tworzy obiekt statystyki pojedynczej kolumny dla każdej kolumny w puli SQL, która nie ma jeszcze statystyk.
Poniższy przykład pomoże Ci rozpocząć projektowanie 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. W tej procedurze jest używana częstotliwość 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]);
Przykład:
UPDATE STATISTICS [dbo].[table1] ([stats_col1]);
Aktualizując określone obiekty statystyk, można zminimalizować czas i zasoby wymagane do zarządzania statystykami. Wymaga to przemyślenia, 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];
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 przeprowadza skanowanie w celu próbkowania tabeli dla każdego obiektu statystyk. Jeśli tabela jest duża i zawiera wiele kolumn i wiele statystyk, może być bardziej wydajne 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. Możesz na przykład sprawdzić, czy obiekt statystyk może być nieaktualny, używając funkcji statystyki daty, 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. Tworzy łą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 na temat rozkładu wartości zrozumiałych dla obiektu statystyk. |
Łączenie kolumn i funkcji statystyk w jednym widoku
Ten widok zawiera kolumny powiązane ze statystykami i wynikami funkcji STATS_DATE().
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ą dostarczane 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ę między kolumnami.
Uwaga
Dedykowana pula SQL oblicza szacowanie kardynalności z dowolnymi danymi w obiekcie statystyk.
Pokaż nagłówek, gęstość i histogram
W tym prostym przykładzie pokazano wszystkie trzy części obiektu statystyk:
DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>)
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
Przykład:
DBCC SHOW_STATISTICS (dbo.table1, stats_col1) WITH histogram, density_vector
Różnice w SHOW_STATISTICS DBCC()
Funkcja DBCC SHOW_STATISTICS() jest bardziej ściśle zaimplementowana w dedykowanej puli SQL w porównaniu z SQL Server:
- Funkcje nieudokumentowane nie są obsługiwane.
- Nie można użyć Stats_stream.
- Nie można sprzężć 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.
Następne kroki
Aby uzyskać więcej informacji na temat poprawy wydajności zapytań, zobacz Monitorowanie obciążenia