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.
Kvalita skupiny řádků je určena počtem řádků ve skupině řádků. Zvýšení dostupné paměti může maximalizovat počet řádků, které index columnstore komprimuje do každé skupiny řádků. Tyto metody slouží ke zlepšení míry komprese a výkonu dotazů pro indexy columnstore.
Proč záleží na velikosti skupiny řádků
Vzhledem k tomu, že index columnstore prohledává tabulku prohledáváním segmentů sloupců jednotlivých skupin řádků, maximalizace počtu řádků v každé skupině řádků zvyšuje výkon dotazů. Pokud mají řádkové skupiny velký počet řádků, zlepší se komprese dat, což znamená, že z disku bude třeba přečíst méně dat.
Další informace o skupinách řádků naleznete v Příručce pro Columnstore Indexy.
Cílová velikost pro skupiny řádků
Pro dosažení nejlepšího výkonu dotazů je cílem maximalizovat počet řádků na skupinu řádků v indexu columnstore. Skupina řádků může mít maximálně 1 048 576 řádků. V pořádku, pokud nemáte maximální počet řádků na skupinu řádků. Indexy columnstore mají dobrý výkon, pokud mají skupiny řádků alespoň 100 000 řádků.
Během komprese mohou být skupiny řádků oříznuty.
Během hromadného načítání nebo opětovného sestavení indexu columnstore někdy není k dispozici dostatek paměti pro komprimaci všech řádků určených pro každou skupinu řádků. Pokud dojde k zatížení paměti, indexy columnstore zmenší velikosti skupin řádků, aby komprese do columnstore byla úspěšná.
Pokud není dostatek paměti ke komprimaci nejméně 10 000 řádků do každé skupiny řádků, vygeneruje se chyba.
Další informace o hromadném načítání najdete v tématu Hromadné načítání do clusterovaného columnstore indexu.
Jak monitorovat kvalitu skupiny řádků
Zobrazení dynamické správy (DMV) (sys.dm_db_column_store_row_group_physical_stats obsahuje definici zobrazení odpovídající databázi SQL), která zveřejňuje užitečné informace, například počet řádků ve skupinách řádků a důvod oříznutí, pokud došlo k oříznutí. Můžete vytvořit následující pohled jako praktický způsob dotazování tohoto DMV, abyste získali informace o trimování skupiny řádků.
CREATE VIEW dbo.vCS_rg_physical_stats
AS
WITH cte
AS
(
select tb.[name] AS [logical_table_name]
, rg.[row_group_id] AS [row_group_id]
, rg.[state] AS [state]
, rg.[state_desc] AS [state_desc]
, rg.[total_rows] AS [total_rows]
, rg.[trim_reason_desc] AS trim_reason_desc
, mp.[physical_name] AS physical_name
FROM sys.[schemas] sm
JOIN sys.[tables] tb ON sm.[schema_id] = tb.[schema_id]
JOIN sys.[pdw_table_mappings] mp ON tb.[object_id] = mp.[object_id]
JOIN sys.[pdw_nodes_tables] nt ON nt.[name] = mp.[physical_name]
JOIN sys.[dm_pdw_nodes_db_column_store_row_group_physical_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]
)
SELECT *
FROM cte;
Sloupec trim_reason_desc označuje, zda byla skupina řádků oříznuta (trim_reason_desc = NO_TRIM znamená, že nedošlo k oříznutí a skupina řádků je optimální kvality). Následující důvody oříznutí ukazují na předčasné oříznutí skupiny řádků:
- BULKLOAD: Tento důvod oříznutí se používá, když příchozí dávka řádků pro načtení měla méně než 1 milion řádků. Motor vytvoří komprimované skupiny řádků, pokud je vkládáno více než 100 000 řádků (na rozdíl od vložení do rozdílového úložiště), ale nastaví důvod pro úpravu na BULKLOAD. V tomto scénáři zvažte zvýšení objemu dávky, aby zahrnovala více řádků. Také znovu zhodnoťte své schéma dělení, abyste se ujistili, že není příliš podrobné, protože skupiny řádků nemohou přesahovat hranice oddílů.
- MEMORY_LIMITATION: Pokud chcete vytvořit skupiny řádků s 1 miliony řádků, vyžaduje modul určitou pracovní paměť. Pokud dostupná paměť v rámci relace načítání je menší než požadovaná paměť pro práci, skupiny řádků budou předčasně oříznuty. Následující části vysvětlují, jak odhadnout požadovanou paměť a přidělit více paměti.
- DICTIONARY_SIZE: Tato příčina oříznutí značí, že došlo k oříznutí řádkové skupiny, protože byl alespoň jeden textový sloupec s širokými a/nebo vysoce kardinálními řetězci. Velikost slovníku je omezená na 16 MB v paměti a po dosažení tohoto limitu je skupina řádků komprimovaná. Pokud narazíte na tuto situaci, zvažte izolování problematického sloupce do samostatné tabulky.
Odhad požadavků na paměť
Maximální požadovaná paměť pro kompresi jedné skupiny řádků je přibližně následující:
- 72 MB +
- #rows * #columns * 8 bajtů +
- cs-CZ: #řádky * #krátké řetězcové sloupce * 32 bajtů +
- #dlouhé řetězcové sloupce * 16 MB pro kompresní slovník
Poznámka:
Pro krátké sloupce řetězců se používají datové typy < s délkou 32 bajtů a pro dlouhé sloupce řetězců se používají datové typy > s délkou 32 bajtů.
Dlouhé řetězce jsou komprimovány metodou komprese určenou pro komprimaci textu. Tato metoda komprese používá slovník k ukládání vzorů textu. Maximální velikost slovníku je 16 MB. Ve skupině řádků existuje pouze jeden slovník pro každý dlouhý sloupec řetězce.
Způsoby snížení požadavků na paměť
Pomocí následujících technik můžete snížit požadavky na paměť pro komprimaci skupin řádků do indexů columnstore.
Použití menšího počtu sloupců
Pokud je to možné, navrhňte tabulku s menším počtem sloupců. Když je skupina řádků komprimována do columnstore, index columnstore komprimuje každý segment sloupce zvlášť. Proto se požadavky na paměť pro komprimaci skupiny řádků s rostoucím počtem sloupců zvyšují.
Použijte méně sloupců řetězců
Sloupce řetězcových datových typů vyžadují více paměti než číselné a datové typy kalendářních dat. Pokud chcete snížit požadavky na paměť, zvažte odebrání sloupců řetězců z tabulek faktů a jejich umístění do menších tabulek dimenzí.
Další požadavky na paměť pro kompresi řetězců:
- Datové typy řetězců až 32 znaků mohou vyžadovat 32 dalších bajtů na hodnotu.
- Datové typy řetězců s více než 32 znaky jsou komprimovány pomocí metod slovníku. Každý sloupec ve skupině řádků může k sestavení slovníku vyžadovat až dalších 16 MB.
Vyhněte se nadměrnému dělení
Indexy columnstore vytvářejí jednu nebo více skupin řádků pro každý oddíl. U datových skladů ve službě Azure Synapse Analytics se počet oddílů rychle zvětšuje, protože se data distribuují a každá distribuce se rozdělí. Pokud tabulka obsahuje příliš mnoho oddílů, může chybět dostatek řádků k vyplnění skupin řádků. Nedostatek řádků během komprese nevytlačuje paměť, ale vede k seskupení řádků, které nedosáhnou nejlepšího výkonu dotazů columnstore.
Dalším důvodem, proč se vyhnout nadměrnému dělení, je režijní náklady na paměť při načítání řádků do indexu columnstore v dělené tabulce. Během zpracování dat může mnoho oddílů přijímat příchozí datové řádky, které jsou uloženy v paměti, dokud každý oddíl nemá dostatek řádků k tomu, aby mohly být komprimovány. Příliš mnoho oddílů vytváří další zatížení paměti.
Zjednodušení zátěžového dotazu
Databáze sdílí udělení paměti pro dotaz mezi všemi operátory v dotazu. Pokud má zátěžový dotaz komplexní řazení a spojení, sníží se paměť, která je k dispozici pro kompresi.
Navrhujte zátěžový dotaz tak, aby se zaměřoval pouze na načtení dotazu. Pokud potřebujete spouštět transformace na datech, spusťte je odděleně od zátěžového dotazu. Například připravte data v hromadné tabulce, spusťte transformace a pak načtěte pracovní tabulku do indexu columnstore.
Úprava MAXDOP
Každá distribuce komprimuje skupiny řádků do columnstore paralelně, pokud je k dispozici více než jedno jádro procesoru na distribuci. Paralelismus vyžaduje další paměťové prostředky, což může vést k tlaku na paměť a zmenšení velikosti skupin řádků.
Pokud chcete snížit zatížení paměti, můžete použít nápovědu dotazu MAXDOP k vynucení spuštění operace načítání v sériovém režimu v rámci každé distribuce.
CREATE TABLE MyFactSalesQuota
WITH (DISTRIBUTION = ROUND_ROBIN)
AS SELECT * FROM FactSalesQuota
OPTION (MAXDOP 1);
Způsoby přidělení více paměti
Velikost DWU a třída prostředků uživatele společně určují, kolik paměti je pro uživatelský dotaz k dispozici. Pokud chcete zvýšit přidělení paměti pro zátěžový dotaz, můžete zvýšit počet jednotek DWU nebo zvýšit třídu prostředků.
- Pokud chcete zvýšit počet jednotek DWU, podívejte se, jak můžu škálovat výkon?
- Pokud chcete změnit třídu prostředků dotazu, přečtěte si téma Změna příkladu třídy prostředků uživatele.
Další kroky
Další způsoby zlepšení výkonu ve službě Synapse SQL najdete v přehledu výkonu.