Sdílet prostřednictvím


Maximalizace kvality skupiny řádků pro výkon indexu columnstore

Kvalita skupiny řádků je určena počtem řádků ve skupině řádků. Zvýšením dostupné paměti můžete maximalizovat počet řádků, které index columnstore komprimuje do každé skupiny řádků. Tyto metody použijte 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ů. Když mají skupiny řádků velký počet řádků, komprese dat se zlepší, což znamená, že je méně dat ke čtení z disku.

Další informace o skupinách řádků najdete v tématu Průvodce indexy columnstore.

Cílová velikost pro skupiny řádků

Pro zajištění 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ů. Je v pořádku, když nemáte maximální počet řádků na skupinu řádků. Indexy Columnstore dosahují dobrého výkonu, když skupiny řádků mají alespoň 100 000 řádků.

Během komprese se můžou oříznout skupiny řádků

Během hromadného načítání nebo opětovného sestavení indexu columnstore někdy není k dispozici dostatek paměti pro kompresi všech řádků určených pro každou skupinu řádků. Pokud dochází k zatížení paměti, indexy columnstore oříznou velikosti skupin řádků, aby komprese do columnstore byla úspěšná.

Pokud není dostatek paměti pro kompresi alespoň 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 indexu columnstore.

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, 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, jak se na toto zobrazení dynamické správy dotazovat, abyste získali informace o ořezávání skupin řá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, jestli byla skupina řádků oříznuta (trim_reason_desc = NO_TRIM znamená, že nedošlo k oříznutí a skupina řádků má optimální kvalitu). Následující důvody oříznutí značí předčasné oříznutí skupiny řádků:

  • BULKLOAD: Tento důvod oříznutí se používá v případě, že příchozí dávka řádků pro zatížení měla méně než 1 milion řádků. Modul vytvoří komprimované skupiny řádků, pokud se vkládá více než 100 000 řádků (místo vložení do úložiště Delta), ale nastaví důvod oříznutí na BULKLOAD. V tomto scénáři zvažte zvýšení dávkového zatížení tak, aby zahrnovalo více řádků. Znovu také vyhodnocujte schéma dělení, abyste se ujistili, že není příliš podrobné, protože skupiny řádků nemohou překlenovat hranice oddílů.
  • MEMORY_LIMITATION: K vytvoření skupin řádků s 1 milionem řádků vyžaduje modul určitou velikost pracovní paměti. Pokud je dostupná paměť relace načítání menší než požadovaná pracovní paměť, skupiny řádků se předčasně oříznou. 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 existoval aspoň 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 se skupina řádků zkomprimuje. Pokud se do této situace dostanete, 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ů +
  • #rows * sloupce #short řetězec * 32 bajtů +
  • #long-string-columns * 16 MB pro kompresní slovník

Poznámka

Sloupce s krátkým řetězcem používají řetězcové <datové typy = 32 bajtů a sloupce s dlouhým řetězcem používají datové typy řetězců o > 32 bajtech.

Dlouhé řetězce jsou komprimovány metodou komprese určenou pro kompresi textu. Tato metoda komprese používá slovník k ukládání textových vzorů. Maximální velikost slovníku je 16 MB. Pro každý sloupec dlouhého řetězce ve skupině řádků je 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 kompresi skupin řádků do indexů columnstore.

Použít méně sloupců

Pokud je to možné, navrhňte tabulku s menším počtem sloupců. Když se skupina řádků zkomprimuje do columnstore, index columnstore zkomprimuje každý segment sloupce zvlášť. Požadavky na paměť pro kompresi skupiny řádků se proto s rostoucím počtem sloupců zvyšují.

Použít méně sloupců řetězců

Sloupce řetězcových datových typů vyžadují více paměti než číselné datové typy 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ů:

  • Řetězcové datové typy o délce až 32 znaků mohou vyžadovat 32 dalších bajtů na hodnotu.
  • Datové typy řetězců s více než 32 znaky se komprimují pomocí slovníkových metod. Každý sloupec ve skupině řádků může k vytvoření 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ů na oddíl. U datových skladů v Azure Synapse Analytics počet oddílů rychle roste, protože se data distribuují a každá distribuce je rozdělená na oddíly. Pokud má tabulka příliš mnoho oddílů, nemusí být k vyplnění skupin řádků dostatek řádků. Nedostatek řádků nevytěžuje paměť během komprese, ale vede k skupinám řádků, které nedosáhnou nejlepšího výkonu dotazů columnstore.

Dalším důvodem, proč se vyhnout nadměrnému dělení, je zatížení paměti pro načítání řádků do indexu columnstore v dělené tabulce. Během načítání může mnoho oddílů přijímat příchozí řádky, které se uchovávají v paměti, dokud nebude mít každý oddíl dostatek řádků ke komprimaci. Příliš mnoho oddílů vytváří další zatížení paměti.

Zjednodušení načítání dotazu

Databáze sdílí přidělení paměti pro dotaz mezi všemi operátory v dotazu. Když má zátěžový dotaz složité řazení a spojení, sníží se velikost paměti dostupné pro kompresi.

Navrhněte dotaz načtení tak, aby se zaměřil pouze na načtení dotazu. Pokud potřebujete spouštět transformace dat, spusťte je odděleně od dotazu na načtení. Můžete například připravit data v tabulce haldy, spustit transformace a pak načíst pracovní tabulku do indexu columnstore.

Úprava funkce MAXDOP

Každá distribuce komprimuje skupiny řádků do columnstore paralelně, pokud je k dispozici více než jedno jádro procesoru pro každou distribuci. Paralelismus vyžaduje další paměťové prostředky, což může vést k zatížení paměti a oříznutí skupin řádků.

Pokud chcete snížit zatížení paměti, můžete pomocí pomocného dotazu MAXDOP vynutit 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 k dispozici pro dotaz uživatele. Pokud chcete zvýšit přidělení paměti pro dotaz zatížení, můžete buď zvýšit počet jednotek DWU, nebo zvýšit třídu prostředků.

Další kroky

Další způsoby, jak zlepšit výkon v Synapse SQL, najdete v tématu Přehled výkonu.