Sdílet prostřednictvím


Vytvoření a aktualizace statistik tabulek ve vyhrazeném fondu SQL

Tento článek obsahuje 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 může spouštět dotazy. Po načtení dat do vyhrazeného fondu SQL je shromažďování statistik dat jedním z nejdůležitějších věcí, které můžete udělat při optimalizaci dotazů.

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 spustí nejrychleji.

Optimalizátor například vybere určitý plán, pokud odhaduje, že datum, kdy dotaz filtruje, vrátí jeden řádek. Pokud optimalizátor odhaduje, že vybrané datum vrátí milion řádků, zvolí jiný plán.

Automatické vytváření statistiky

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

Pokud statistiky chybí, optimalizátor dotazů vytvoří statistiky pro jednotlivé sloupce v predikátu dotazu nebo podmínku spojení, aby se zlepšily odhady kardinality pro plán dotazu.

Poznámka:

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

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

SELECT name, is_auto_create_stats_on
FROM sys.databases

Pokud váš vyhrazený fond SQL není AUTO_CREATE_STATISTICS nakonfigurovaný, doporučujeme tuto vlastnost povolit spuštěním následujícího příkazu. Nahraďte <your-datawarehouse-name> názvem vyhrazeného fondu SQL.

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

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

  • SELECT
  • INSERT... SELECT
  • CREATE TABLE AS SELECT (CTAS)
  • UPDATE
  • DELETE
  • EXPLAIN při zjištění spojení nebo přítomnosti predikátu

Poznámka:

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

Automatické vytvářenístatistikch Doba vytvoření statistiky pro jeden sloupec závisí na velikosti tabulky.

Abyste se vyhnuli měřitelnému snížení výkonu, před profilací systému byste měli zajistit, aby se statistiky vytvořily jako první.

Poznámka:

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

Při vytváření automatických statistik mají podobu: _WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex>. Statistiky, které už byly vytvořeny, můžete zobrazit spuštěním příkazu SHOW_STATISTICS DBCC:

DBCC SHOW_STATISTICS (<table_name>, <target>)

Jedná se table_name o název tabulky, která obsahuje statistiky, které se mají zobrazit. Tato tabulka nemůže být externí tabulkou. Cílem je název cílového indexu, statistiky nebo sloupce, pro který se mají zobrazit informace o statistikách.

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 kalendářních dat. Pokaždé, když se nové řádky načtou do vyhrazeného fondu SQL, přidají se nová data načtení nebo data transakcí. Tyto doplňky mění distribuci dat a zpřístupní statistiky.

Statistiky ve sloupci země/oblasti v tabulce zákazníků nemusí být nikdy potřeba aktualizovat, protože rozdělení 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 nezmění distribuci dat.

Pokud ale vyhrazený fond SQL obsahuje jenom jednu zemi nebo oblast a přineste data z nové země nebo oblasti, což vede k ukládání dat z více zemí nebo oblastí, musíte aktualizovat statistiky ve sloupci země/oblasti.

Následují doporučení pro aktualizaci statistik:

Atribut statistiky Doporučení
Frekvence aktualizací statistik Konzervativ: Denně
po načtení nebo transformaci dat
Vzorkování Méně než 1 miliardu řá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é byste se měli zeptat, když řešíte potíže s dotazem, je "Jsou statistiky aktuální?"

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

Neexistuje žádné zobrazení dynamické správy k určení, 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 vaše statistiky zastaralé.

  • Dotaz 1: Najdě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: Najděte věk statistiky tak, že zkontrolujete čas poslední aktualizace statistiky v každé tabulce.

    Poznámka:

    Pokud je ve sloupci změna materiálu, 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;
    

Sloupce kalendářních dat ve vyhrazeném fondu SQL, například obvykle potřebují časté aktualizace statistik. Pokaždé, když se nové řádky načtou do vyhrazeného fondu SQL, přidají se nová data načtení nebo data transakcí. Tyto doplňky mění distribuci dat a zpřístupní statistiky.

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 nezmění distribuci dat.

Pokud vyhrazený fond SQL obsahuje pouze jeden pohlaví a výsledkem nového požadavku je více pohlaví, musíte aktualizovat statistiky ve sloupci pohlaví.

Další informace najdete v obecných doprovodných materiálech pro statistiky.

Implementace správy statistik

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

Načtení dat je, když tabulky nejčastěji mění jejich velikost nebo jejich 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 má aktualizovaný alespoň jeden objekt statistiky. Tím se v rámci aktualizace statistiky aktualizuje 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 aktualizaci vzestupných klíčových sloupců, jako jsou například data transakcí častěji, protože tyto hodnoty nejsou zahrnuty do histogramu statistiky.
  • Zvažte méně častou aktualizaci sloupců statické distribuce.
  • Nezapomeňte, že každý statistický objekt se aktualizuje postupně. Jednoduchá implementace UPDATE STATISTICS <TABLE_NAME> není vždy ideální, zejména pro široké tabulky s velkým množstvím statistických objektů.

Další informace naleznete 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 vlastnostech dat a způsobu použití sloupce v dotazech.

Vytvoření statistik s jedním sloupcem 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í statistik 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í statistik s jedním sloupcem prozkoumáním každého řádku

Výchozí vzorkovací frekvence 20 procent je dostatečná pro většinu situací. Můžete ale upravit vzorkovací frekvenci.

Pokud chcete vzorek 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í statistik s jedním sloupcem 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í statistik s jedním sloupcem pouze u některých řádků

Můžete také vytvořit statistiky pro část řádků v tabulce. Tato statistika se nazývá filtrovaná statistika.

Filtrované statistiky můžete například použít, když plánujete dotazovat konkrétní oddíl velké dělené tabulky. Vytvořením statistiky pouze s hodnotami oddílů se přesnost statistiky zlepšuje, což zlepšuje výkon dotazů.

Tento příklad vytvoří statistiku o rozsahu 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 výběru plánu distribuovaného dotazu zvážil použití filtrovaných statistik, musí se dotaz vejít do definice objektu statistiky. V předchozím příkladu musí klauzule WHERE dotazu zadat hodnoty sloupce 1 mezi 2000101 a 20001231.

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

Můžete také kombinovat možnosti dohromady. Následující příklad vytvoří filtrovaný objekt statistiky s vlastní velikostí vzorku:

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

Úplný odkaz 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 zapnutý product_category. Statistiky křížového sloupce se počítají podleproduct_category: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, objekt statistiky s více sloupci může být užitečný, pokud jsou tyto sloupce přístupné ve stejnou dobu.

Vytváření statistik pro všechny sloupce v tabulce

Jedním ze způsobů, jak vytvořit statistiku, je vydat CREATE STATISTICS příkazy 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);

Vytvoření statistik pro všechny sloupce ve fondu SQL pomocí uložené procedury

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

Následující příklad ukazuje, jak začít s návrhem fondu SQL. Nebojte se ho přizpůsobit vašim 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 hodnot, spusťte uloženou proceduru.

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

Chcete-li vytvořit statistiky pro všechny sloupce v tabulce pomocí fullscan, zavolejte tento postup.

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

Pokud chcete vytvořit ukázkové statistiky pro všechny sloupce v tabulce, zadejte 3 a procento vzorku. Tento postup používá 20 % vzorkovací frekvenci.

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

Příklady: Aktualizace statistik

Pokud chcete aktualizovat statistiky, 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ů statistik můžete minimalizovat čas a prostředky potřebné ke správě statistik. K tomu je potřeba, abyste si vybrali nejlepší statistické objekty, které se mají aktualizovat.

Aktualizace všech statistik v tabulce

Jednoduchá metoda pro aktualizaci všech statistických objektů v tabulce je:

UPDATE STATISTICS [schema_name].[table_name];

Příklad:

UPDATE STATISTICS dbo.table1;

Příkaz UPDATE STATISTICS se snadno používá. Nezapomeňte, že aktualizuje všechny statistiky v tabulce, a proto může provádět 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 statistiky jsou aktuální.

Poznámka:

Když aktualizujete všechny statistiky v tabulce, vyhrazený fond SQL provede kontrolu ukázkové tabulky 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.

Implementace UPDATE STATISTICS procedury naleznete v části 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

K nalezení informací o statistikách můžete použít několik systémových zobrazení a funkcí. Pomocí funkce statistiky můžete například zjistit, jestli objekt statistiky není aktuální, a to pomocí funkce statistiky a zjistit, 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; odkazy 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 statistiky

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, jak rozumí objekt statistiky

Sloučení sloupců a funkcí statistiky do jednoho zobrazení

Toto zobrazení spojuje sloupce, které souvisejí se statistikou STATS_DATE() a výsledky funkce.

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 záhlaví statistiky. Histogram zobrazuje rozdělení hodnot v prvním klíčovém sloupci objektu statistiky. Vektor hustoty měří korelaci mezi sloupci.

Poznámka:

Vyhrazený fond SQL počítá odhady 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);

Zobrazení jedné nebo více částí dbCC SHOW_STATISTICS()

Pokud vás zajímá jenom zobrazení konkrétních částí, použijte WITH klauzuli 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() je v porovnání s SQL Serverem přesněji implementovaný ve vyhrazeném fondu SQL:

  • Nepodporované funkce nejsou podporované.
  • Nelze použít Stats_stream.
  • Nejde spojit výsledky pro konkrétní podmnožinu dat statistiky. Například STAT_HEADER JOIN DENSITY_VECTOR.
  • NO_INFOMSGS nelze nastavit pro potlačení zpráv.
  • Hranaté závorky kolem názvů statistik se nedají použít.
  • Názvy sloupců nelze použít k identifikaci objektů statistiky.
  • Vlastní chyba 2767 není podporovaná.

Monitorování úloh vyhrazeného fondu SQL ve službě Azure Synapse Analytics pomocí zobrazení dynamické správy