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 oříznuty skupiny řádků.
Během hromadného načítání nebo opětovného sestavení indexu columnstore někdy není k dispozici dostatek paměti ke komprimaci všech řádků určených pro každou skupinu řádků. Při nedostatku paměti zmenší indexy sloupcového úložiště velikosti skupin řádků, aby komprese do sloupcového úložiště mohla proběhnout ú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 sys.dm_pdw_nodes_db_column_store_row_group_physical_stats (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, jako je počet řádků ve skupinách řádků a důvod oříznutí, pokud došlo k oříznutí.
Následující zobrazení můžete vytvořit jako praktický způsob dotazování tohoto zobrazení dynamické správy, abyste získali informace o oříznutí 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;
Trim_reason_desc říká, jestli byla skupina řádků oříznutá(trim_reason_desc = NO_TRIM znamená, že nedošlo k oříznutí a skupina řádků je optimální kvality). Následující důvody prořezávání označují předčasné prořezávání řádkové skupiny:
- BULKLOAD: Tento důvod oříznutí se používá, když příchozí dávka řádků pro zatížení 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í dávky dat, aby zahrnovala více řádků. Také znovu zhodnoťte své schéma dělení, abyste měli jistotu, že není příliš podrobné, protože skupiny řádků nemohou překračovat hranice oddílů.
- MEMORY_LIMITATION: Pokud chcete vytvořit skupiny řádků s 1 miliony řádků, vyžaduje modul určitou pracovní paměť. Pokud je dostupná paměť načítací relace menší než požadovaná operační paměť, skupiny řádků se předčasně zkrátí. Následující části vysvětlují, jak odhadnout požadovanou paměť a přidělit více paměti.
- DICTIONARY_SIZE: Tento důvod oříznutí značí, že došlo k oříznutí skupiny řádků, protože byl alespoň jeden sloupec řetězce s širokými a/nebo velkými řetězci kardinality. 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ěť
Pokud chcete zobrazit odhad požadavků na paměť pro kompresi skupiny řádků s maximální velikostí do indexu columnstore, zvažte vytvoření ukázkového zobrazení dbo.vCS_mon_mem_grant. Tento dotaz ukazuje velikost přidělení paměti, kterou skupina řádků vyžaduje pro kompresi do columnstore.
Maximální požadovaná paměť pro komprimaci jedné skupiny řádků je přibližně
- 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:
Krátké řetězcové sloupce používají řetězcové datové typy < = 32 bajtů a dlouhé řetězcové sloupce používají řetězcové datové typy > = 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 pro každou dlouhou řetězcovou sloupcovou položku pouze jeden slovník.
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 vyhrazeného fondu SQL ve službě Azure Synapse Analytics se počet oddílů rychle zvětšuje, protože se distribuují data a každá distribuce je rozdělená na oddíly.
Pokud tabulka obsahuje příliš mnoho oddílů, může chybět dostatek řádků k vyplnění skupin řádků. Nedostatek řádků během komprese nezpůsobuje tlak na paměť. Ale vede ke skupinám řádků, které nedosáhnou nejlepšího výkonu dotazů pro sloupcové uložení dat.
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.
Návod
Nejprve můžete také načíst data a pak pomocí systému MPP transformovat data.
Ú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, jak zlepšit výkon vyhrazeného fondu SQL, najdete v přehledu výkonu.