Sdílet prostřednictvím


Statistika tabulek pro vyhrazený fond SQL ve službě Azure Synapse Analytics

V tomto článku najdete doporučení a příklady pro vytváření a aktualizaci statistik optimalizace dotazů u tabulek ve vyhrazeném fondu SQL.

Proč používat statistiky

Čím více vyhrazený fond SQL ví o vašich datech, tím rychleji na tato data dokáže provádět dotazy. Shromažďování statistik o datech po načtení do vyhrazeného fondu SQL je jednou z nejdůležitějších věcí, které můžete pro optimalizaci dotazů udělat.

Optimalizátor dotazů vyhrazeného fondu SQL je optimalizátor založený na nákladech. Porovná náklady na různé plány dotazů a pak zvolí plán s nejnižšími náklady. Ve většině případů zvolí plán, který se provede nejrychleji.

Pokud například optimalizátor odhaduje, že datum, podle kterého se dotaz filtruje, vrátí jeden řádek, zvolí jeden plán. Pokud odhadne, že vybrané datum vrátí 1 milion řádků, vrátí jiný plán.

Automatické vytváření statistiky

Když je možnost AUTO_CREATE_STATISTICS databáze zapnutá, vyhrazený fond SQL analyzuje chybějící statistiky příchozích dotazů uživatelů.

Pokud chybí statistika, vytvoří optimalizátor dotazů statistiku pro jednotlivé sloupce v predikátu dotazu nebo podmínce spojení, aby zlepšil odhad kardinality pro plán dotazu.

Poznámka

Automatické vytváření statistik je aktuálně ve výchozím nastavení zapnuté.

Spuštěním následujícího příkazu můžete zkontrolovat, jestli je váš vyhrazený fond SQL nakonfigurovaný AUTO_CREATE_STATISTICS:

SELECT name, is_auto_create_stats_on
FROM sys.databases

Pokud váš vyhrazený fond SQL nemá nakonfigurované AUTO_CREATE_STATISTICS, doporučujeme tuto vlastnost povolit spuštěním následujícího příkazu:

ALTER DATABASE <yourdatawarehousename>
SET AUTO_CREATE_STATISTICS ON

Tyto příkazy aktivují automatické vytváření statistik:

  • SELECT
  • INSERT-SELECT
  • CTAS
  • UPDATE
  • DELETE
  • EXPLAIN při výskytu spojení nebo zjištění přítomnosti predikátu

Poznámka

Automatické vytváření statistik se nevytvořilo u dočasných nebo externích tabulek.

Automatické vytváření statistik se provádí synchronně, takže pokud ve sloupcích chybí statistika, může dojít k mírnému snížení výkonu dotazů. Doba potřebná k vytvoření statistiky pro jeden sloupec závisí na velikosti tabulky.

Abyste se vyhnuli měřitelnému snížení výkonu, měli byste nejprve zajistit, aby se statistiky vytvořily spuštěním úlohy srovnávacího testu a teprve potom profilací systému.

Poznámka

Vytváření statistik se bude protokolovat sys.dm_pdw_exec_requests v jiném kontextu uživatele.

Při vytváření automatických statistik budou mít podobu: WA_Sys<8místné ID sloupce v šestnáctkové tabulce> hex>_<8. Vytvořené statistiky můžete zobrazit spuštěním příkazu DBCC SHOW_STATISTICS :

DBCC SHOW_STATISTICS (<table_name>, <target>)

Table_name je název tabulky, která obsahuje statistiky, které se mají zobrazit. Tato tabulka nemůže být externí. Cíl je název cílového indexu, statistiky nebo sloupce, pro který se mají zobrazit statistické informace.

Aktualizační statistika

Jedním z osvědčených postupů je aktualizovat statistiky sloupců kalendářních dat každý den při přidání nových dat. Pokaždé, když se do vyhrazeného fondu SQL načtou nové řádky, přidají se nová data načtení nebo data transakcí. Tyto doplňky mění distribuci dat a statistiky jsou zastaralé.

Statistiky sloupce země/oblasti v tabulce zákazníků nemusí být nikdy potřeba aktualizovat, protože distribuce hodnot se obecně nemění. Za předpokladu, že je distribuce mezi zákazníky konstantní, přidání nových řádků do varianty tabulky distribuci dat nezmění.

Pokud ale váš vyhrazený fond SQL obsahuje jenom jednu zemi nebo oblast a vy jste přinesli data z nové země nebo oblasti, což vede k ukládání dat z více zemí nebo oblastí, budete muset aktualizovat statistiku sloupce země/oblasti.

Následující doporučení aktualizují statistiky:

Atribut Statistika Doporučení
Četnost aktualizací statistik Konzervativní: Každý den
po načtení nebo transformaci dat
Vzorkování Méně než 1 miliarda řádků, použijte výchozí vzorkování (20 procent).
S více než 1 miliardou řádků použijte vzorkování dvou procent.

Jednou z prvních otázek, které si při řešení potíží s dotazem položte, je : "Jsou statistiky aktuální?"

Na tuto otázku se nedá odpovědět podle stáří dat. Objekt aktuální statistiky může být starý, pokud nedošlo k žádné významné změně podkladových dat. Pokud se počet řádků podstatně změnil nebo došlo k podstatné změně v rozdělení hodnot pro sloupec, je čas aktualizovat statistiku.

Neexistuje žádné zobrazení dynamické správy, které by určilo, jestli se data v tabulce od poslední aktualizace statistik změnila. Následující dva dotazy vám můžou pomoct určit, jestli jsou statistiky zastaralé.

Dotaz 1: Zjistěte rozdíl mezi počtem řádků ze statistiky (stats_row_count) a skutečným počtem řádků (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

Dotaz 2: Věk statistik zjistíte tak, že zkontrolujete čas poslední aktualizace statistiky v každé tabulce.

Poznámka

Pokud dojde k významné změně v rozdělení hodnot pro sloupec, měli byste aktualizovat statistiky bez ohledu na to, kdy byly naposledy aktualizovány.

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;

Například sloupce kalendářních dat ve vyhrazeném fondu SQL obvykle vyžadují časté aktualizace statistik. Pokaždé, když se do vyhrazeného fondu SQL načtou nové řádky, přidají se nová data načtení nebo data transakcí. Tyto doplňky mění distribuci dat a statistiky jsou zastaralé.

Naopak statistiky sloupce pohlaví v tabulce zákazníků nemusí být nikdy potřeba aktualizovat. Za předpokladu, že je distribuce mezi zákazníky konstantní, přidání nových řádků do varianty tabulky distribuci dat nezmění.

Pokud váš vyhrazený fond SQL obsahuje jenom jedno pohlaví a nový požadavek má za následek více pohlaví, budete muset aktualizovat statistiky sloupce pohlaví.

Další informace najdete v obecných pokynech pro statistiku.

Implementace správy statistik

Často je vhodné proces načítání dat rozšířit, aby se zajistilo, že se statistiky na konci zatížení aktualizují, abyste se vyhnuli blokování nebo kolizím prostředků mezi souběžnými dotazy a minimalizovali je.

K načítání dat dochází, když tabulky nejčastěji mění svou velikost nebo rozdělení hodnot. Načítání dat je logické místo pro implementaci některých procesů správy.

Pro aktualizaci statistik jsou k dispozici následující základní principy:

  • Ujistěte se, že každá načtená tabulka obsahuje alespoň jeden objekt statistiky aktualizovaný. Tím se v rámci aktualizace statistiky aktualizují informace o velikosti tabulky (počet řádků a počet stránek).
  • Zaměřte se na sloupce, které se účastní klauzulí JOIN, GROUP BY, ORDER BY a DISTINCT.
  • Zvažte častější aktualizaci sloupců "vzestupných klíčů", jako jsou data transakcí, protože tyto hodnoty nebudou zahrnuty do histogramu statistiky.
  • Zvažte méně častou aktualizaci statických distribučních sloupců.
  • Nezapomeňte, že každý objekt statistiky se postupně aktualizuje. Jednoduchá implementace UPDATE STATISTICS <TABLE_NAME> není vždy ideální, zejména u širokých tabulek se spoustou objektů statistiky.

Další informace najdete v tématu Odhad kardinality.

Příklady: Vytvoření statistiky

Tyto příklady ukazují, jak používat různé možnosti pro vytváření statistik. Možnosti, které použijete pro každý sloupec, závisí na charakteristikách dat a na tom, jak se bude sloupec používat v dotazech.

Vytvoření jednosloupcové statistiky s výchozími možnostmi

Pokud chcete vytvořit statistiku sloupce, zadejte název objektu statistiky a název sloupce.

Tato syntaxe používá všechny výchozí možnosti. Ve výchozím nastavení se při vytváření statistiky vzorkuje 20 procent tabulky.

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

Příklad:

CREATE STATISTICS col1_stats ON dbo.table1 (col1);

Vytvoření jednosloupkové statistiky prozkoumáním každého řádku

Výchozí vzorkovací frekvence 20 procent je pro většinu situací dostačující. Vzorkovací frekvenci ale můžete upravit.

K vzorkování celé tabulky použijte tuto syntaxi:

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

Příklad:

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

Vytvoření jednosloupceové statistiky zadáním velikosti vzorku

Případně můžete velikost vzorku zadat jako procento:

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

Vytvoření jednosloupceové statistiky jenom u některých řádků

Můžete také vytvořit statistiku pro část řádků v tabulce. Tomu se říká filtrovaná statistika.

Filtrovanou statistiku můžete použít například v případě, že plánujete dotazovat konkrétní oddíl velké tabulky. Vytvořením statistik pouze pro hodnoty oddílů se přesnost statistik zlepší, a tím se zlepší výkon dotazů.

Tento příklad vytvoří statistiku pro rozsah hodnot. Hodnoty lze snadno definovat tak, aby odpovídaly rozsahu hodnot v oddílu.

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

Poznámka

Aby optimalizátor dotazů při volbě distribuovaného plánu dotazů zvážil použití filtrované statistiky, musí se dotaz vejít do definice objektu statistiky. V předchozím příkladu musí klauzule WHERE dotazu zadat hodnoty col1 mezi 2000101 a 20001231.

Vytvoření statistiky s jedním sloupcem se všemi možnostmi

Tyto možnosti můžete také zkombinovat. Následující příklad vytvoří objekt filtrované statistiky s vlastní velikostí vzorku:

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

Úplné referenční informace najdete v tématu VYTVOŘENÍ STATISTIKY.

Vytvoření statistiky s více sloupci

Pokud chcete vytvořit objekt statistiky s více sloupci, použijte předchozí příklady, ale zadejte více sloupců.

Poznámka

Histogram, který se používá k odhadu počtu řádků ve výsledku dotazu, je k dispozici pouze pro první sloupec uvedený v definici objektu statistiky.

V tomto příkladu je histogram na product_category. Statistiky křížových sloupců se počítají podle product_category a 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;

Vzhledem k tomu, že existuje korelace mezi product_category a product_sub_category, může být objekt statistiky s více sloupci užitečný, pokud se k těmto sloupcům přistupuje současně.

Vytvoření statistiky pro všechny sloupce v tabulce

Jedním ze způsobů, jak vytvořit statistiku, je vydat příkazy CREATE STATISTICS po vytvoření tabulky:

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);

Použití uložené procedury k vytvoření statistiky pro všechny sloupce ve fondu SQL

Vyhrazený fond SQL nemá systémovou uloženou proceduru ekvivalentní sp_create_stats v SQL Server. Tato uložená procedura vytvoří jeden objekt statistiky sloupce pro každý sloupec ve fondu SQL, který ještě nemá statistiku.

Následující příklad vám pomůže začít s návrhem fondu SQL. Nebojte se ho přizpůsobit svým potřebám.

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;

Pokud chcete vytvořit statistiky pro všechny sloupce v tabulce pomocí výchozích nastavení, spusťte uloženou proceduru.

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

Pokud chcete vytvořit statistiky pro všechny sloupce v tabulce pomocí úplného prohledávání, zavolejte tento postup.

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

Pokud chcete vytvořit vzorkované statistiky pro všechny sloupce v tabulce, zadejte 3 a procento výběru. Tento postup používá vzorkovací frekvenci 20 %.

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

Příklady: Aktualizace statistik

Pokud chcete aktualizovat statistiku, můžete:

  • Aktualizujte jeden objekt statistiky. Zadejte název objektu statistiky, který chcete aktualizovat.
  • Aktualizujte všechny objekty statistiky v tabulce. Místo jednoho konkrétního objektu statistiky zadejte název tabulky.

Aktualizace jednoho konkrétního objektu statistiky

K aktualizaci konkrétního objektu statistiky použijte následující syntaxi:

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

Příklad:

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

Aktualizací konkrétních objektů statistiky můžete minimalizovat čas a prostředky potřebné ke správě statistik. To vyžaduje určité myšlenky zvolit nejlepší statistické objekty, které se mají aktualizovat.

Aktualizace všech statistik v tabulce

Jednoduchá metoda aktualizace všech objektů statistiky v tabulce je:

UPDATE STATISTICS [schema_name].[table_name];

Příklad:

UPDATE STATISTICS dbo.table1;

Příkaz UPDATE STATISTICS se snadno používá. Mějte na paměti, že aktualizuje všechny statistiky v tabulce, a proto může provést více práce, než je nutné. Pokud výkon není problém, je to nejjednodušší a nejúplnější způsob, jak zaručit, že jsou statistiky aktuální.

Poznámka

Při aktualizaci všech statistik v tabulce provede vyhrazený fond SQL kontrolu a vzorkuje tabulku pro každý objekt statistiky. Pokud je tabulka velká a obsahuje mnoho sloupců a mnoho statistik, může být efektivnější aktualizovat jednotlivé statistiky na základě potřeby.

Implementaci UPDATE STATISTICS procedury najdete v tématu Dočasné tabulky. Metoda implementace se mírně liší od předchozího CREATE STATISTICS postupu, ale výsledek je stejný.

Úplnou syntaxi najdete v tématu Aktualizace statistiky.

Metadata statistiky

Existuje několik systémových zobrazení a funkcí, které můžete použít k vyhledání informací o statistikách. Pomocí funkce stats-date můžete například zjistit, jestli je objekt statistiky zastaralý, abyste zjistili, kdy byly statistiky naposledy vytvořeny nebo aktualizovány.

Zobrazení katalogu pro statistiky

Tato systémová zobrazení poskytují informace o statistikách:

Zobrazení katalogu Popis
sys.columns Jeden řádek pro každý sloupec.
Sys.objects Jeden řádek pro každý objekt v databázi.
sys.schemas Jeden řádek pro každé schéma v databázi.
sys.stats Jeden řádek pro každý objekt statistiky.
sys.stats_columns Jeden řádek pro každý sloupec v objektu statistiky. Odkazuje zpět na sys.columns.
sys.tables Jeden řádek pro každou tabulku (včetně externích tabulek).
sys.table_types Jeden řádek pro každý datový typ.

Systémové funkce pro statistiku

Tyto systémové funkce jsou užitečné pro práci se statistikami:

Systémová funkce Popis
STATS_DATE Datum poslední aktualizace objektu statistiky
DBCC SHOW_STATISTICS Souhrnná úroveň a podrobné informace o rozdělení hodnot podle statistického objektu.

Kombinování sloupců a funkcí statistiky do jednoho zobrazení

Toto zobrazení spojuje sloupce, které se týkají statistiky, a výsledky funkce 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
;

Příklady SHOW_STATISTICS() DBCC

DBCC SHOW_STATISTICS() zobrazuje data uložená v objektu statistiky. Tato data mají tři části:

  • Hlavička
  • Vektor hustoty
  • Histogram

Metadata hlaviček o statistikách. Histogram zobrazuje rozdělení hodnot v prvním klíčovém sloupci statistického objektu. Vektor hustoty měří korelaci mezi sloupci.

Poznámka

Vyhrazený fond SQL vypočítá odhad kardinality s libovolnými daty v objektu statistiky.

Zobrazení záhlaví, hustoty a histogramu

Tento jednoduchý příklad ukazuje všechny tři části objektu statistiky:

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

Příklad:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1);

Zobrazit jednu nebo více částí DBCC SHOW_STATISTICS()

Pokud vás zajímá jenom zobrazení konkrétních částí, použijte klauzuli WITH a určete, které části chcete zobrazit:

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

Příklad:

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

Rozdíly mezi SHOW_STATISTICS() DBCC

DbCC SHOW_STATISTICS() se ve vyhrazeném fondu SQL implementuje přísněji než SQL Server:

  • Nezdokumentované funkce nejsou podporovány.
  • Nelze použít Stats_stream.
  • Nelze spojit výsledky pro konkrétní podmnožinu statistických dat. Například STAT_HEADER JOIN DENSITY_VECTOR.
  • NO_INFOMSGS nelze nastavit pro potlačení zprávy.
  • Kolem názvů statistik nelze použít hranaté závorky.
  • Názvy sloupců nelze použít k identifikaci objektů statistiky.
  • Vlastní chyba 2767 není podporována.

Další kroky

Další vylepšení výkonu dotazů najdete v tématu Monitorování úloh.