Indexy založené na sloupcích v datových skladech

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLPdW (Analytics Platform System)Databáze SQL v Microsoft Fabric

Indexy columnstore společně s dělením jsou nezbytné pro vytvoření datového skladu SQL Serveru. Tento článek se zaměřuje na klíčové případy použití a příklady návrhů datových skladů pomocí databázového stroje SQL.

Klíčové funkce pro datové sklady

SQL Server 2016 (13.x) zavedl tyto funkce pro vylepšení výkonu columnstore:

  • Skupiny dostupnosti AlwaysOn podporují dotazování indexu columnstore na čitelné sekundární replice.
  • Několik aktivních sad výsledků (MARS) podporuje indexy sloupcového úložiště.
  • Nové zobrazení dynamické správy sys.dm_db_column_store_row_group_physical_stats (Transact-SQL) poskytuje informace o řešení potíží s výkonem na úrovni skupiny řádků.
  • Všechny dotazy na indexy columnstore se můžou spouštět v dávkovém režimu. Dříve se v dávkovém režimu mohly spouštět pouze paralelní dotazy.
  • Operátory Sort, Distinct Sort a Distinct se spouštějí v dávkovém režimu.
  • Agregace oken se teď spouští v dávkovém režimu pro úroveň kompatibility databáze 130 a vyšší.
  • Agregační odsdílení pro efektivní zpracování agregací To je podporováno na všech úrovních kompatibility databáze.
  • Odsadení predikátu řetězců pro efektivní zpracování predikátů řetězců To je podporováno na všech úrovních kompatibility databáze.
  • Izolace snímků pro úroveň kompatibility databáze 130 a vyšší
  • Uspořádané clusterované indexy columnstore byly zavedeny s SQL Serverem 2022 (16.x). Další informace najdete v článku CREATE COLUMNSTORE INDEX a Ladění výkonu pomocí uspořádaných indexů columnstore. Pro dostupnost seřazeného columnstore indexu, viz Dostupnost seřazeného indexu sloupcového úložiště.

Další informace o nových funkcích ve verzích a platformách SQL Serveru a Azure SQL najdete v tématu Novinky v indexech columnstore.

Zvýšení výkonu kombinováním neclusterovaných indexů a indexů columnstore

Počínaje SQL Serverem 2016 (13.x) můžete vytvářet neklastrované indexy úložiště řádků na klastrovaném sloupcovém indexu.

Příklad: Zlepšení efektivity hledání tabulek pomocí neclusterovaného indexu

Pokud chcete zvýšit efektivitu hledání tabulek v datovém skladu, můžete vytvořit neclusterovaný index navržený ke spouštění dotazů, které nejlépe fungují s hledáním tabulek. Například dotazy, které hledají odpovídající hodnoty, nebo vrací malou oblast hodnot, fungují lépe s indexem B-tree místo indexu columnstore. Nevyžadují úplnou kontrolu indexu columnstore a vrací správný výsledek rychleji provedením binárního vyhledávání prostřednictvím indexu B-tree.

--BASIC EXAMPLE: Create a nonclustered index on a columnstore table.

--Create the table
CREATE TABLE t_account (
    AccountKey int NOT NULL,
    AccountDescription nvarchar (50),
    AccountType nvarchar(50),
    UnitSold int
);

--Store the table as a columnstore.  
CREATE CLUSTERED COLUMNSTORE INDEX taccount_cci ON t_account;

--Add a nonclustered index.
CREATE UNIQUE INDEX taccount_nc1 ON t_account (AccountKey);

Příklad: Použití neclusterovaného indexu k vynucení omezení primárního klíče v tabulce columnstore

Protože tabulka může mít maximálně jeden clusterovaný index, tabulka s clusterovaným indexem columnstore nemůže mít omezení clusterovaného primárního klíče. Pokud chcete vytvořit omezení primárního klíče v tabulce columnstore, musíte ho deklarovat jako neclusterované.

Následující příklad vytvoří tabulku s omezením neklastrovaného primárního klíče a poté vytvoří clusterovaný columnstore index na této tabulce. Vzhledem k tomu, že jakékoli vložení nebo aktualizace v tabulce columnstore také upraví neclusterovaný index, všechny operace, které porušují omezení primárního klíče, způsobí selhání celé operace.

--Create a primary key constraint on a columnstore table.

--Create a rowstore table with a nonclustered primary key constraint.
CREATE TABLE t_account (
    AccountKey int NOT NULL,
    AccountDescription nvarchar (50),
    AccountType nvarchar(50),
    UnitSold int,
    CONSTRAINT pk_account PRIMARY KEY NONCLUSTERED (AccountKey)
);

--Convert the table to columnstore.
--The primary key constraint is preserved as a nonclustered index on the columnstore table.
CREATE CLUSTERED COLUMNSTORE INDEX t_account_cci ON t_account;

Zvýšení výkonu povolením uzamčení na úrovni řádků a skupin řádků

SQL Server 2016 (13.x) nabízí funkci podrobného zamykání operací SELECT, UPDATE, a DELETE, které doplňují neclusterovaný index funkce indexu columnstore. Dotazy mohou běžet se zamykáním na úrovni řádků při prohledávání indexů v neklastrovaném indexu a se zamykáním na úrovni skupin řádků při celkovém prohledávání tabulky se sloupcovým indexem. Pomocí tohoto příkazu dosáhnete vyšší souběžnosti čtení a zápisu pomocí zamykání na úrovni řádků a skupiny řádků.

--Granular locking example
--Store table t_account as a columnstore table.
CREATE CLUSTERED COLUMNSTORE INDEX taccount_cci ON t_account

--Add a nonclustered index for use with this example
CREATE UNIQUE INDEX taccount_nc1 ON t_account (AccountKey);

--Look at locking with access through the nonclustered index
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

BEGIN TRAN
    -- The query plan chooses a seek operation on the nonclustered index
    -- and takes the row lock
    SELECT * 
    FROM t_account 
    WHERE AccountKey = 100;
COMMIT TRAN;

Izolace snímků a režim čtení po potvrzení snímků

Použijte izolaci snímků (SI) k zajištění transakční konzistence a izolaci snímků při potvrzeném čtení (RCSI) k zajištění konzistence na úrovni příkazů pro dotazy na indexy columnstore. To umožňuje spouštění dotazů bez blokování zapisovačů dat. Toto neblokující chování také výrazně snižuje pravděpodobnost zablokování u složitých transakcí. Další informace najdete v tématu Úrovně izolace založené na správě verzí řádků v databázovém stroji.