Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek obsahuje doporučení a příklady pro vytváření a aktualizaci statistik optimalizace dotazů pomocí prostředků Synapse SQL: vyhrazený fond SQL a bezserverový fond SQL.
Statistiky ve vyhrazeném SQL repozitáři
Proč používat statistiky
Čím více vyhrazený fond SQL ví o vašich datech, tím rychleji dokáže spouštět dotazy. Po načtení dat do vyhrazeného fondu SQL je shromažďování statistik o datech jednou z nejdůležitějších věcí, které můžete udělat pro 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.
Pokud například optimalizátor odhadne, že datum, kdy 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í statistik
Vyhrazený modul fondu SQL bude analyzovat příchozí dotazy uživatelů na chybějící statistiky, pokud je možnost databáze AUTO_CREATE_STATISTICS nastavena na ON. Pokud statistiky chybí, vytvoří optimalizátor dotazů statistiku u jednotlivých sloupců v predikátu dotazu nebo v podmínce spojení.
Tato funkce slouží ke zlepšení odhadů kardinality pro plán dotazu.
Důležité
Automatické vytváření statistik je ve výchozím nastavení zapnuté.
Spuštěním následujícího příkazu můžete zkontrolovat, jestli je váš datový sklad nakonfigurovaný AUTO_CREATE_STATISTICS:
SELECT name, is_auto_create_stats_on
FROM sys.databases
Pokud váš datový sklad nemá povolené 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:
- VYBRAT
- INSERT-SELECT
- CTAS
- Aktualizace
- VYMAZAT
- VYSVĚTLIT v případě, že je zjištěno spojení nebo přítomnost predikátu
Poznámka:
Automatické vytváření statistik se negeneruje u dočasných nebo externích tabulek.
Automatické vytváření statistik se provádí synchronně. Pokud tedy ve sloupcích chybí statistika, může dojít k mírnému snížení výkonu dotazů. 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 v sys.dm_pdw_exec_requests v rámci jiného kontextu uživatele.
Když se vytvoří automatické statistiky, budou mít tvar: WA_Sys<8místné ID sloupce v šestnáctkové soustavě>_<8místné ID tabulky v šestnáctkové soustavě>. Již vytvořené statistiky můžete zobrazit spuštěním příkazu SHOW_STATISTICS DBCC :
DBCC SHOW_STATISTICS (<table_name>, <target>)
Table_name je název tabulky, která obsahuje statistiku, která se má zobrazit, což nemůže být externí tabulka. Cílem je název cílového indexu, statistiky nebo sloupce, pro který se mají zobrazit informace o statistikách.
Aktualizace statistik
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 do datového skladu načtou nové řádky, přidají se nová data načtení nebo data transakcí. Tyto doplňky mění distribuci dat a způsobují zastaralost statistik.
Statistiky sloupce země nebo oblasti v tabulce zákazníků nemusí být nikdy potřeba aktualizovat, protože rozdělení hodnot se obvykle 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 však váš datový sklad obsahuje pouze jednu zemi nebo oblast a přidáte data z nové země nebo oblasti, musíte aktualizovat statistiky ve sloupci země nebo oblasti.
Následují doporučení pro aktualizaci statistik:
| Typ | Doporučení |
|---|---|
| Frekvence aktualizací statistik | Konzervativní: Denně po načtení nebo transformaci vašich 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 dvouprocentní vzorkování. |
Určení poslední aktualizace statistiky
Jednou z prvních otázek, které byste se měli zeptat, když řešíte potíže s dotazem, je "Jsou statistiky aktuální?"
Tato otázka není ta, na kterou je možné 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 dojde k podstatné změně rozdělení hodnot pro sloupec, je čas aktualizovat statistiky.
Zobrazení dynamické správy není k dispozici k určení, jestli se data v tabulce od poslední aktualizace statistik změnila. Znalost stáří vaší statistiky vám může poskytnout část celkového obrazu.
Pomocí následujícího dotazu můžete určit čas poslední aktualizace statistiky v každé tabulce.
Poznámka:
Pokud dojde k podstatné změně v rozložení hodnot ve sloupci, 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 s daty v datovém skladu, například obvykle potřebují časté aktualizace statistik. Pokaždé, když se do datového skladu načtou nové řádky, přidají se nová data načtení nebo data transakcí. Tyto doplňky mění distribuci dat a způsobují zastaralost statistik.
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 ale váš datový sklad obsahuje pouze jedno pohlaví a nový požadavek způsobí, že bude více pohlaví, musíte aktualizovat statistiky ve sloupci pohlaví.
Další informace najdete v článku Statistika .
Implementace správy statistik
Často je vhodné rozšířit proces načítání dat, aby se zajistilo, že se statistiky aktualizují na konci načítání. K zatížení dat dochází, když tabulky nejčastěji mění svoji velikost, distribuci hodnot, případně obojí. Proto je proces zatížení logickým místem pro implementaci některých managementových procesů.
Následující hlavní principy jsou poskytnuty pro aktualizaci vašich statistik během procesu načítání:
- Ujistěte se, že každá načtená tabulka má aktualizovaný alespoň jeden objekt statistiky. Tento proces jako součást 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 častější aktualizaci sloupců vzestupného klíče, jako jsou například data transakcí, protože tyto hodnoty nebudou 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 vašich 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í vzorkuje vyhrazený fond SQL při vytváření statistik 20 procent tabulky.
CREATE STATISTICS [statistics_name]
ON [schema_name].[table_name]([column_name]);
Napří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;
Například:
CREATE STATISTICS col1_stats
ON dbo.table1 (col1)
WITH FULLSCAN;
Vytvoření statistik s jedním sloupcem zadáním velikosti vzorku
Další možností je zadat velikost vzorku jako procento:
CREATE STATISTICS col1_stats
ON dbo.table1 (col1)
WITH SAMPLE 50 PERCENT;
Vytvořte statistiky s jedním sloupcem pouze pro některé řádky
Můžete také vytvořit statistiku části řádků v tabulce, která 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 statistik pouze na základě hodnot oddílů se přesnost statistik zlepší. Zároveň se setkáte se zlepšením výkonu dotazů.
Tento příklad vytvoří statistiku o rozsahu hodnot. Hodnoty lze snadno definovat tak, aby odpovídaly rozsahu hodnot v určitém 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 na product_category. Statistiky křížového sloupce se počítají na 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 mezi product_category a product_sub_category existuje korelace, může být objekt statistiky s více sloupci užitečný, pokud se k těmto sloupcům přistupuje současně. Při dotazování této tabulky zlepší statistiky s více sloupci odhad kardinality pro spojení, agregace GROUP BY, jedinečné počty a filtry WHERE (pokud je primární statistický sloupec součástí filtru).
Vytváření statistik 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);
Vytvoření statistik pro všechny sloupce v databázi pomocí uložené procedury
SQL pool nemá systémovou uloženou proceduru ekvivalentní k sp_create_stats v SQL Serveru. Tato uložená procedura vytvoří jeden objekt statistiky sloupce pro každý sloupec databáze, který ještě nemá statistiky.
Následující příklad vám pomůže začít s návrhem databáze. Přizpůsobte si ho 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 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í úplného prohledání, zavolejte tuto proceduru:
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. Následující postup používá míru vzorkování 20 procent.
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]);
Napří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. Tato akce vyžaduje určitou myšlenku pro výběr nejlepších statistických objektů, 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];
Napří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, což přináší více práce, než je nutné.
Pokud výkon není problém, je tato metoda nejjednodušším a nejúplnějším způsobem, jak zaručit, že statistiky jsou aktuální.
Poznámka:
Při aktualizaci všech statistik v tabulce provede vyhrazený fond SQL skenování tabulky pro každý statistický objekt. 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.
Pro implementaci procedury UPDATE STATISTICS viz 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 statistik.
Metadata statistiky
K nalezení informací o statistikách můžete použít několik systémových zobrazení a funkcí. Pomocí funkce STATS_DATE() můžete například zjistit, jestli je objekt statistiky zastaralý. STATS_DATE() umožňuje zobrazit, kdy byly statistiky naposledy vytvořeny nebo aktualizovány.
Pohledy na katalog 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 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 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 DBCC SHOW_STATISTICS()
DBCC SHOW_STATISTICS() zobrazuje data uložená v objektu statistiky. Tato data mají tři části:
- Záhlaví
- Vektor hustoty
- Histogram
Hlavička je metadata o statistikách. Histogram zobrazuje rozdělení hodnot v prvním klíčovém sloupci objektu statistiky.
Vektor hustoty měří korelaci mezi sloupci. Vyhrazený fond SQL odhaduje kardinalitu pomocí jakýchkoli dat 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>)
Napří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 WITH klauzuli a určete, které části chcete zobrazit:
DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>)
WITH stat_header, histogram, density_vector
Například:
DBCC SHOW_STATISTICS ('dbo.table1', 'stats_col1')
WITH histogram, density_vector
Rozdíly v DBCC SHOW_STATISTICS()
DBCC SHOW_STATISTICS() je v porovnání s SQL Serverem přesněji implementovaný ve vyhrazeném fondu SQL:
- Nezdokumentované funkce nejsou podporované.
- Nejde 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í podporována.
Statistiky v bezserverovém fondu SQL
Statistiky se vytvoří pro konkrétní sloupec pro konkrétní datovou sadu (cestu k úložišti).
Poznámka:
Statistiky nelze vytvořit pro LOB sloupce.
Proč používat statistiky
Čím více bezserverový fond SQL ví o vašich datech, tím rychleji může spouštět dotazy. Shromažďování statistik o datech je jednou z nejdůležitějších věcí, které můžete udělat při optimalizaci dotazů.
Optimalizátor dotazů SQL bez serveru 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.
Pokud například optimalizátor odhadne, že datum filtrování dotazu vrátí jeden řádek, zvolí jeden plán. Pokud odhadne, že vybrané datum vrátí 1 milion řádků, vybere jiný plán.
Automatické vytváření statistik
Bezserverový 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.
Příkaz SELECT aktivuje automatické vytváření statistik.
Poznámka:
Pro automatické vytváření statistik se používá vzorkování a ve většině případů bude procento vzorkování menší než 100%. Tento tok je stejný pro každý formát souboru. Mějte na paměti, že při čtení souboru CSV s vzorkováním verze 1.0 se nepodporuje vzorkování a automatické vytváření statistik se nestane s procentem vzorkování nižším než 100%. U malých tabulek s odhadovanou nízkou kardinalitou (počet řádků) se automatické vytváření statistik aktivuje s procentem vzorkování 100 %. To v podstatě znamená, že se aktivuje fullscan a automatické statistiky se vytvářejí i pro soubory CSV s parserem verze 1.0.
Automatické vytváření statistik se provádí synchronně, takže pokud ve sloupcích chybí statistika, může dojít k mírně sníženému výkonu dotazů. Doba vytvoření statistiky pro jeden sloupec závisí na velikosti cílových souborů.
Ruční vytváření statistik
Bezserverový fond SQL umožňuje vytvářet statistiky ručně. Pokud používáte parser verze 1.0 s CSV, budete pravděpodobně muset vytvořit statistiky ručně, protože tato verze parseru nepodporuje vzorkování. Automatické vytváření statistik v případě analyzátoru verze 1.0 se nestane, pokud procento vzorkování není 100%.
Pokyny k ručnímu vytvoření statistiky najdete v následujících příkladech.
Aktualizace statistik
Změny dat v souborech, odstranění a přidání souborů vedou ke změnám distribuce dat a k zastaralým statistikům. V takovém případě je potřeba aktualizovat statistiky.
Bezserverový fond SQL automaticky znovu vytvoří statistiky pro sloupce OPENROWSET, pokud se data výrazně změní. Pokaždé, když se automaticky vytvoří statistika, uloží se také aktuální stav datové sady: cesty k souborům, velikosti, data poslední změny.
Pokud jsou statistiky zastaralé, vytvoří se nové. Algoritmus prochází daty a porovnává je s aktuálním stavem datové sady. Pokud je velikost změn větší než konkrétní prahová hodnota, staré statistiky se odstraní a znovu se vytvoří přes novou datovou sadu.
Ruční statistiky nejsou nikdy deklarovány jako zastaralé.
Poznámka:
Pro automatické vytvoření statistik se používá vzorkování a ve většině případů bude podíl vzorkování menší než 100%. Tento tok je stejný pro každý formát souboru. Mějte na paměti, že při čtení CSV s parserem verze 1.0 se nepodporuje vzorkování a automatické obnovení statistik se neprovede s procentem vzorkování nižším než 100%. V takovém případě potřebujete statistiku ručně vypustit a znovu vytvořit. V následujících příkladech se dozvíte, jak odstranit a vytvořit statistiky. U malých tabulek s odhadovanou nízkou kardinalitou (počet řádků) se automatická statistika znovu aktivuje s procentem vzorkování 100%. To v podstatě znamená, že se aktivuje fullscan a automatické statistiky se vytvářejí i pro soubory CSV s parserem verze 1.0.
Jednou z prvních otázek, které byste se měli zeptat, když řešíte potíže s dotazem, je "Jsou statistiky aktuální?"
Pokud se počet řádků podstatně změnil nebo došlo k podstatné změně rozdělení hodnot pro sloupec, je čas aktualizovat statistiky.
Poznámka:
Pokud dojde k podstatné změně v rozložení hodnot ve sloupci, měli byste aktualizovat statistiky bez ohledu na to, kdy byly naposledy aktualizovány.
Implementace správy statistik
Možná budete chtít datový kanál rozšířit, aby se zajistilo, že se statistiky aktualizují, když se data výrazně změní přidáním, odstraněním nebo změnou souborů.
Pro aktualizaci statistik jsou k dispozici následující základní principy:
- Ujistěte se, že datová sada má alespoň jeden aktualizovaný objekt statistik. Tato aktualizace aktualizuje informace o velikosti (počet řádků a počet stránek) jako součást aktualizace statistiky.
- Zaměřte se na sloupce, které se podílejí na klauzulích WHERE, JOIN, GROUP BY, ORDER BY a DISTINCT.
- Aktualizujte sloupce vzestupného klíče, například data transakcí častěji, protože tyto hodnoty nebudou zahrnuty do histogramu statistiky.
- Méně často aktualizujte sloupce statické distribuce.
Další informace naleznete v tématu odhad kardinality.
Příklady: Vytvoření statistiky pro sloupec pomocí OPENROWSET.
Následující příklady ukazují, jak používat různé možnosti pro vytváření statistik v bezserverových fondech SQL Azure Synapse. Možnosti, které použijete pro každý sloupec, závisí na vlastnostech vašich dat a způsobu použití sloupce v dotazech. Další informace o uložených procedurách použitých v těchto příkladech najdete v sys.sp_create_openrowset_statistics a sys.sp_drop_openrowset_statistics, které platí jenom pro bezserverové fondy SQL.
Poznámka:
Statistiky s jedním sloupcem můžete vytvořit pouze v tuto chvíli.
K provedení sp_create_openrowset_statistics a sp_drop_openrowset_statistics jsou vyžadována následující oprávnění: SPRÁVA HROMADNÝCH OPERACÍ nebo SPRÁVA HROMADNÝCH OPERACÍ DATABÁZE.
K vytvoření statistiky se používá následující uložená procedura:
sys.sp_create_openrowset_statistics [ @stmt = ] N'statement_text'
Argumenty: [ @stmt = ] N'statement_text' – Určuje příkaz Transact-SQL, který vrátí hodnoty sloupců, které se mají použít pro statistiku. Můžete použít TABLESAMPLE k určení vzorků dat, která se mají použít. Pokud není zadána funkce TABLESAMPLE, použije se FULLSCAN.
<tablesample_clause> ::= TABLESAMPLE ( sample_number PERCENT )
Poznámka:
Vzorkování CSV nefunguje, pokud používáte analyzátor verze 1.0, pro CSV s analyzátorem verze 1.0 je podporováno pouze FULLSCAN.
Vytvoření statistik s jedním sloupcem prozkoumáním každého řádku
Pokud chcete vytvořit statistiku sloupce, zadejte dotaz, který vrátí sloupec, pro který potřebujete statistiku.
Pokud při ručním vytváření statistik nezadáte jinak, bezserverový fond SQL při vytváření statistik používá 100% dat zadaných v datové sadě.
Pokud například chcete vytvořit statistiku s výchozími nastaveními (FULLSCAN) pro sloupec populace datové sady na základě souboru us_population.csv:
EXEC sys.sp_create_openrowset_statistics N'SELECT
population
FROM OPENROWSET(
BULK ''https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/raw_us_population_county/us_population.csv'',
FORMAT = ''CSV'',
PARSER_VERSION = ''2.0'',
HEADER_ROW = TRUE)
AS [r]'
Vytvoření statistik s jedním sloupcem zadáním velikosti vzorku
Velikost vzorku můžete zadat jako procento:
/* make sure you have credentials for storage account access created
IF EXISTS (SELECT * FROM sys.credentials WHERE name = 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer')
DROP CREDENTIAL [https://azureopendatastorage.blob.core.windows.net/censusdatacontainer]
GO
CREATE CREDENTIAL [https://azureopendatastorage.blob.core.windows.net/censusdatacontainer]
WITH IDENTITY='SHARED ACCESS SIGNATURE',
SECRET = ''
GO
*/
EXEC sys.sp_create_openrowset_statistics N'SELECT payment_type
FROM OPENROWSET(
BULK ''https://sqlondemandstorage.blob.core.windows.net/parquet/taxi/year=2018/month=6/*.parquet'',
FORMAT = ''PARQUET''
) AS [nyc]
TABLESAMPLE(5 PERCENT)
'
Příklady: Aktualizace statistik
Pokud chcete aktualizovat statistiky, musíte je odstranit a znovu vytvořit. Další informace najdete v sys.sp_create_openrowset_statistics a sys.sp_drop_openrowset_statistics.
Uložená procedura sys.sp_drop_openrowset_statistics slouží k poklesu statistik:
sys.sp_drop_openrowset_statistics [ @stmt = ] N'statement_text'
Poznámka:
K provedení sp_create_openrowset_statistics a sp_drop_openrowset_statistics jsou vyžadována následující oprávnění: SPRÁVA HROMADNÝCH OPERACÍ nebo SPRÁVA HROMADNÝCH OPERACÍ DATABÁZE.
Argumenty: [ @stmt = ] N'statement_text' – Určuje stejný příkaz Transact-SQL použitý při vytváření statistik.
Pokud chcete aktualizovat statistiku sloupce pro rok v datové sadě, která je založená na population.csv souboru, musíte zrušit a znovu vytvořit statistiky:
EXEC sys.sp_drop_openrowset_statistics N'SELECT payment_type
FROM OPENROWSET(
BULK ''https://sqlondemandstorage.blob.core.windows.net/parquet/taxi/year=2018/month=6/*.parquet'',
FORMAT = ''PARQUET''
) AS [nyc]
TABLESAMPLE(5 PERCENT)
'
GO
/* make sure you have credentials for storage account access created
IF EXISTS (SELECT * FROM sys.credentials WHERE name = 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer')
DROP CREDENTIAL [https://azureopendatastorage.blob.core.windows.net/censusdatacontainer]
GO
CREATE CREDENTIAL [https://azureopendatastorage.blob.core.windows.net/censusdatacontainer]
WITH IDENTITY='SHARED ACCESS SIGNATURE',
SECRET = ''
GO
*/
EXEC sys.sp_create_openrowset_statistics N'SELECT payment_type
FROM OPENROWSET(
BULK ''https://sqlondemandstorage.blob.core.windows.net/parquet/taxi/year=2018/month=6/*.parquet'',
FORMAT = ''PARQUET''
) AS [nyc]
TABLESAMPLE(5 PERCENT)
'
Příklady: Vytvoření statistiky pro sloupec externí tabulky
Následující 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 vašich dat a způsobu použití sloupce v dotazech.
Poznámka:
Statistiky s jedním sloupcem můžete vytvořit pouze v tuto chvíli.
Pokud chcete vytvořit statistiku sloupce, zadejte název objektu statistiky a název sloupce.
CREATE STATISTICS statistics_name
ON { external_table } ( column )
WITH
{ FULLSCAN
| [ SAMPLE number PERCENT ] }
, { NORECOMPUTE }
Argumenty: external_table Určuje externí tabulku, kterou by se měly vytvořit statistiky.
FULLSCAN Výpočet statistik skenováním všech řádků. FULLSCAN a SAMPLE 100 PERCENT mají stejné výsledky. FULLSCAN nelze použít s možností SAMPLE.
SAMPLE number PERCENT Určuje přibližné procento nebo počet řádků v tabulce nebo indexované zobrazení pro optimalizátor dotazů, který se má použít při vytváření statistik. Číslo může být od 0 do 100.
VZOREK nelze použít s volbou FULLSCAN.
Poznámka:
Vzorkování CSV nefunguje, pokud používáte analyzátor verze 1.0, pro CSV s analyzátorem verze 1.0 je podporováno pouze FULLSCAN.
Vytvoření statistik s jedním sloupcem prozkoumáním každého řádku
CREATE STATISTICS sState
on census_external_table (STATENAME)
WITH FULLSCAN, NORECOMPUTE
Vytvoření statistik s jedním sloupcem zadáním velikosti vzorku
-- following sample creates statistics with sampling 5%
CREATE STATISTICS sState
on census_external_table (STATENAME)
WITH SAMPLE 5 percent, NORECOMPUTE
Příklady: Aktualizace statistik
Pokud chcete aktualizovat statistiky, musíte je odstranit a znovu vytvořit. Nejprve vynechejte statistiky:
DROP STATISTICS census_external_table.sState
A vytvořte statistiky:
CREATE STATISTICS sState
on census_external_table (STATENAME)
WITH FULLSCAN, NORECOMPUTE
Metadata statistiky
K nalezení informací o statistikách můžete použít několik systémových zobrazení a funkcí. Pomocí funkce STATS_DATE() můžete například zjistit, jestli je objekt statistiky zastaralý. STATS_DATE() umožňuje zobrazit, kdy byly statistiky naposledy vytvořeny nebo aktualizovány.
Poznámka:
Metadata statistik jsou k dispozici pouze pro sloupce externí tabulky. Pro sloupce OPENROWSET nejsou k dispozici metadata statistiky.
Pohledy na katalog 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 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 |
Sloučení sloupců a funkcí statistiky do jednoho zobrazení
Toto zobrazení spojuje sloupce, které souvisejí se statistikou 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 st.[user_created] = 1
;
Další kroky
Další zlepšení výkonu dotazů pro vyhrazený fond SQL najdete v tématu Monitorování úloh a osvědčených postupů pro vyhrazený fond SQL.
Pokud chcete dále zlepšit výkon dotazů pro bezserverový fond SQL, přečtěte si osvědčené postupy pro bezserverový fond SQL.