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.