Sdílet prostřednictvím


Optimalizace výkonu pomocí seřazených columnstore indexů

Platí pro: SQL Server 2022 (16.x) a novější verze Azure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Uspořádané indexy columnstore můžou poskytovat rychlejší výkon tím, že přeskočí velké objemy uspořádaných dat, které neodpovídají predikátu dotazu. Při načítání dat do uspořádaného indexu columnstore a udržování pořadí prostřednictvím opětovného sestavení indexu trvá déle než v neřazených indexech, indexované dotazy můžou běžet rychleji s seřazeným columnstorem.

Když dotaz načte index columnstore, databázový stroj zkontroluje minimální a maximální hodnoty uložené v jednotlivých segmentech sloupců. Proces eliminuje segmenty, které spadají mimo hranice predikátu dotazu. Jinými slovy, při čtení dat z disku nebo paměti tyto segmenty přeskočí. Dotaz se dokončí rychleji, pokud je počet segmentů, které se mají přečíst, a jejich celková velikost výrazně menší.

U určitých vzorů zatížení dat se data v indexu columnstore můžou implicitně uspořádat bez zadání ORDER klauzule. Pokud se například data načítají každý den, můžou být data seřazená podle load_date sloupce. V tomto případě už výkon dotazů může těžit z tohoto implicitního pořadí. Seřazení indexu columnstore stejným load_date sloupcem explicitně v ORDER klauzuli pravděpodobně nepřinese žádnou další výhodu ve výkonu.

Informace o dostupnosti seřazených indexů columnstore na různých platformách SQL a ve verzích SQL Serveru najdete v tématu Dostupnost indexu seřazeného columnstore.

Další informace o nedávno přidaných funkcích pro indexy columnstore najdete v tématu Novinky v indexech columnstore.

Uspořádaný vs. neuspořádaný sloupcový index

V indexu columnstore se data v každém sloupci každé skupiny řádků komprimují do samostatného segmentu. Každý segment obsahuje metadata popisující minimální a maximální hodnoty, takže proces provádění dotazu může přeskočit segmenty, které spadají mimo hranice predikátu dotazu.

Pokud index columnstore není seřazený, tvůrce indexů data před komprimací do segmentů neřadí. To znamená, že k segmentům s překrývajícími se rozsahy hodnot může dojít, což způsobí, že dotazy čtou další segmenty, aby získaly požadovaná data. V důsledku toho může dokončení dotazů trvat déle.

Když vytvoříte uspořádaný index columnstore zadáním klauzule ORDER v příkazu CREATE COLUMNSTORE INDEX, databázový stroj seřadí data v každém segmentu každého sloupce objednání předtím, než generátor indexu zkomprimuje data do segmentů. Díky seřazeným datům je překrývání segmentů omezené nebo eliminované, což umožňuje dotazům používat efektivnější odstranění segmentů a tím rychlejší výkon, protože existuje méně segmentů a méně dat ke čtení.

Snížení překrývajících se segmentů a zlepšení výkonu dotazů

Když sestavíte uspořádaný columnstore index, databázový stroj data seřadí co nejlépe. V závislosti na dostupné paměti, velikosti dat, stupni paralelismu, typu indexu (clusterovaný vs. neclusterovaný) a typu sestavení indexu (offline vs. online) může pořadí ve sloupcích v indexu columnstore být úplné bez překryvu segmentů, nebo dílčí s překryvem segmentů. Pokud existuje méně překrývajících se segmentů, dotaz, který může využít výhod pořadí sloupců, běží rychleji.

Návod

I když je pořadí ve sloupci indexu columnstore částečné, lze stále segmenty eliminovat (přeskakovat). Úplné pořadí není nutné k získání výhod výkonu, pokud se částečné pořadí vyhne překrytí mnoha segmentů.

Následující tabulka popisuje výsledné seřazení při vytváření nebo opětovném sestavení seřazeného columnstore indexu v závislosti na nastavení pro sestavení indexu.

Požadavky Typ objednávky
ONLINE = ON a MAXDOP = 1 Full
ONLINE = OFF, MAXDOP = 1, a data, která se mají seřadit, se plně vejde do paměti prostoru pro dotazy. Full
Všechny ostatní případy Částečný

V prvním případě, kdy jsou splněny podmínky ONLINE = ON i MAXDOP = 1, není řazení omezeno pamětí pracovního prostoru dotazu, protože při online sestavení uspořádaného indexu columnstore je použita databáze tempdb pro přelití dat, která se nevejdou do paměti. Tento přístup může zpomalit proces sestavení indexu kvůli dalším tempdb vstupně-výstupním operacím a vyžaduje dostatek volného místa v tempdb. Vzhledem k tomu, že se sestavení indexu provádí online, můžou dotazy během sestavování nového seřazeného indexu pokračovat v používání existujícího indexu.

Podobně, při offline opětovném sestavení indexu columnstore s rozdělením na oddíly, se opětovné sestavení provádí po jednom oddílu. Ostatní oddíly zůstávají dostupné pro dotazy.

Pokud je MAXDOP větší než 1, každé vlákno použité při sestavování seřazeného indexu columnstore pracuje na podmnožině dat a místně je seřadí. Neexistuje globální řazení mezi daty seřazenými podle různých vláken. Použití paralelních vláken může zkrátit dobu vytvoření indexu, ale výsledkem je více překrývajících se segmentů než při použití jednoho vlákna.

Uspořádané indexy columnstore můžete vytvořit nebo znovu sestavit online pouze v některých platformách SQL a verzích SQL Serveru. Další informace najdete v souhrnu funkcí pro vydané verze produktů.

V SQL Serveru nejsou online indexovací operace dostupné ve všech edicích. Další informace najdete v tématech Edice a podporované funkce SQL Serveru 2025 a Provádění operací indexu online.

U určitých datových typů a kódování vám zobrazení systému sys.column_store_segments může pomoct najít počet překrývajících se segmentů. Ukázkový skript založený na tomto zobrazení definuje kvalitu třídění pro vhodné sloupce všech indexů columnstore v aktuální databázi.

Výkonnost dotazů

Zvýšení výkonu z seřazeného indexu columnstore závisí na vzorech dotazu, velikosti dat, počtu překrývajících se segmentů a výpočetních prostředcích dostupných pro provádění dotazů.

Dotazy s následujícími vzory obvykle běží rychleji s seřazenými indexy columnstore:

  • Dotazy, které mají predikáty rovnosti, nerovnosti nebo rozsahu
  • Dotazy, kde jsou sloupce predikátu a seřazené sloupce CCI stejné.

V následujícím příkladu má tabulka T1 sloupcový index typu 'columnstore' s Col_C, Col_B a Col_A jako uspořádané sloupce.

CREATE CLUSTERED COLUMNSTORE INDEX OrderedCCI
ON T1
ORDER (Col_C, Col_B, Col_A);

Dotaz 1 využívá seřazený index columnstore více než dotazy 2 a 3, protože dotaz 1 odkazuje na všechny seřazené sloupce v predikátu.

-- query 1
SELECT *
FROM T1
WHERE Col_C = 'c'
      AND Col_B = 'b'
      AND Col_A = 'a';

-- query 2
SELECT *
FROM T1
WHERE Col_B = 'b'
      AND Col_A = 'a';

-- query 3
SELECT *
FROM T1
WHERE Col_A = 'a'
      AND Col_C = 'c';

Výkon načítání dat

Výkon načítání dat do tabulky s uspořádaným indexem columnstore se podobá výkonu particionované tabulky. Načítání dat může trvat déle než u neřazeného indexu columnstore kvůli operaci řazení dat, ale dotazy můžou běžet rychleji.

Přidání nových dat nebo aktualizace existujících dat

Nová data vyplývající z provádění dávkové operace DML nebo hromadného načítání v tabulce s uspořádaným columnstore indexem jsou seřazena pouze v rámci této dávky. Neexistuje žádné globální řazení, které zahrnuje existující data v tabulce, protože komprimované skupiny řádků v indexu columnstore jsou neměnné.

Pokud chcete omezit překrytí segmentů po vložení nových dat nebo aktualizaci existujících dat, znovu sestavte index columnstore.

Examples

Vytvoření uspořádaného indexu columnstore

Index columnstore seřazený podle clusterů:

CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER(Column1, Column2);

Neclusterovaný uspořádaný index columnstore:

CREATE NONCLUSTERED COLUMNSTORE INDEX ONCCI
ON dbo.Table1(Column1, Column2, Column3)
ORDER(Column1, Column2);

Kontrola seřazených sloupců a řadových řad

SELECT OBJECT_SCHEMA_NAME(c.object_id) AS schema_name,
       OBJECT_NAME(c.object_id) AS table_name,
       c.name AS column_name,
       i.column_store_order_ordinal
FROM sys.index_columns AS i
     INNER JOIN sys.columns AS c
         ON i.object_id = c.object_id
        AND c.column_id = i.column_id
WHERE column_store_order_ordinal > 0;

Přidání nebo odebrání sloupců objednávek a opětovné sestavení existujícího uspořádaného indexu columnstore

Index columnstore seřazený podle clusterů:

CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER(Column1, Column2)
WITH (DROP_EXISTING = ON);

Neclusterovaný uspořádaný index columnstore:

CREATE NONCLUSTERED COLUMNSTORE INDEX ONCCI
ON dbo.Table1(Column1, Column2, Column3)
ORDER(Column1, Column2)
WITH (DROP_EXISTING = ON);

Vytvořte uspořádaný clusterovaný columnstore index online s úplným řazením na haldě

CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER(Column1)
WITH (ONLINE = ON, MAXDOP = 1);

Opětovné sestavení uspořádaného clusterovaného columnstore indexu s úplným uspořádáním online

CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER(Column1)
WITH (DROP_EXISTING = ON, ONLINE = ON, MAXDOP = 1);