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í.
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á.