Columnstore-Indizes: Data WarehouseColumnstore indexes - Data Warehouse

Gilt für: JaSQL Server JaAzure SQL-Datenbank JaAzure Synapse Analytics (SQL DW) JaParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Columnstore-Indizes sind in Verbindung mit der Partitionierung unverzichtbar für die Erstellung eines SQL ServerSQL Server -Data Warehouse.Columnstore indexes, in conjunction with partitioning, are essential for building a SQL ServerSQL Server data warehouse.

NeuesWhat's new

InSQL Server 2016 (13.x)SQL Server 2016 (13.x) wurden die folgenden Funktionen für Columnstore-Leistungsverbesserungen eingeführt:SQL Server 2016 (13.x)SQL Server 2016 (13.x) introduces these features for columnstore performance enhancements:

  • AlwaysOn unterstützt das Abfragen eines Columnstore-Indexes auf einem lesbaren sekundären Replikat.Always On supports querying a columnstore index on a readable secondary replica.
  • Multiple Active Result Sets (MARS) unterstützt Columnstore-Indizes.Multiple Active Result Sets (MARS) supports columnstore indexes.
  • Eine neue dynamische Verwaltungssicht sys.dm_db_column_store_row_group_physical_stats (Transact-SQL) bietet Informationen über das Beheben von Leistungsproblemen auf Zeilengruppenebene.A new dynamic management view sys.dm_db_column_store_row_group_physical_stats (Transact-SQL) provides performance troubleshooting information at the row group level.
  • Singlethread-Abfragen für Columnstore-Indizes können im Batchmodus ausgeführt werden.Single-threaded queries on columnstore indexes can run in batch mode. Früher konnten nur Multithread-Abfragen im Batchmodus ausgeführt werden.Previously, only multi-threaded queries could run in batch mode.
  • Der SORT-Operator wird im Batchmodus ausgeführt.The SORT operator runs in batch mode.
  • Mehrere DISTINCT-Vorgänge werden im Batchmodus ausgeführt.Multiple DISTINCT operation runs in batch mode.
  • Window Aggregates wird jetzt im Batchmodus für Datenbank-Kompatibilitätsgrad 130 und höher ausgeführt.Window Aggregates now runs in batch mode for database compatibility level 130 and higher.
  • Aggregatweitergabe für die effiziente Verarbeitung von Aggregaten.Aggregate Pushdown for efficient processing of aggregates. Wird für alle Datenbank-Kompatibilitätsgrade unterstützt.This is supported on all database compatibility levels.
  • Zeichenfolgenprädikatweitergabe für die effiziente Verarbeitung von Zeichenfolgenprädikaten.String predicate pushdown for efficient processing of string predicates. Wird für alle Datenbank-Kompatibilitätsgrade unterstützt.This is supported on all database compatibility levels.
  • Momentaufnahmenisolation für den Datenbank-Kompatibilitätsgrad 130 und höherSnapshot isolation for database compatibility level 130 and higher.

Verbessern der Leistung durch Kombinieren von nicht gruppierten Indizes und Columnstore-IndizesImprove performance by combining nonclustered and columnstore indexes

Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) können Sie nicht gruppierte Indizes für einen gruppierten Columnstore-Index definieren.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), you can define nonclustered indexes on a clustered columnstore index.

Beispiel: Verbessern der Effizienz von Suchabfragen auf Tabellen mit einem nicht gruppierten IndexExample: Improve efficiency of table seeks with a nonclustered index

Sie können einen nicht gruppierten Index erstellen, der Abfragen ausführt, die am besten mit Tabellenvorgängen funktionieren, um die Effizienz von Tabellenvorgängen in einem Data Warehouse zu verbessern.To improve efficiency of table seeks in a data warehouse, you can create a nonclustered index designed to run queries that perform best with table seeks. Zum Beispiel erzielen Abfragen, die nach übereinstimmenden Werten suchen oder eine kleine Anzahl von Werten zurückgeben, eine bessere Leistung für einen B-Strukturindex als für einen Columnstore-Index.For example, queries that look for matching values or return a small range of values will perform better against a B-tree index rather than a columnstore index. Ein vollständiger Tabellenscan durch den Columnstore-Index ist für die Abfragen nicht erforderlich. Das korrekte Ergebnis wird durch eine binäre Suche in einem B-Strukturindex schneller zurückgeben.They don't require a full table scan through the columnstore index and will return the correct result faster by doing a binary search through a B-tree index.

--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  
);  
GO  
  
--Store the table as a columnstore.  
CREATE CLUSTERED COLUMNSTORE INDEX taccount_cci ON t_account;  
GO  
  
--Add a nonclustered index.  
CREATE UNIQUE INDEX taccount_nc1 ON t_account (AccountKey);  

Beispiel: Verwenden eines nicht gruppierten Indexes zum Erzwingen einer Primärschlüsseleinschränkung für eine Columnstore-TabelleExample: Use a nonclustered index to enforce a primary key constraint on a columnstore table

Programmbedingt lässt eine Columnstore-Tabelle keine Primärschlüsseleinschränkung zu.By design, a columnstore table does not allow a primary key constraint. Jetzt können Sie einen nicht gruppierten Index für eine Columnstore-Tabelle verwenden, um eine Primärschlüsseleinschränkung zu erzwingen.Now you can use a nonclustered index on a columnstore table to enforce a primary key constraint. Ein Primärschlüssel entspricht einer UNIQUE-Einschränkung für eine Spalte, die ungleich NULL ist, und SQL ServerSQL Server implementiert eine UNIQUE-Einschränkung als nicht gruppierten Index.A primary key is equivalent to a UNIQUE constraint on a non-NULL column, and SQL ServerSQL Server implements a UNIQUE constraint as a nonclustered index. Das folgende Beispiele kombiniert diese Fakten und definiert eine UNIQUE-Einschränkung für den Kontoschlüssel der Spalte, die ungleich NULL ist.Combining these facts, the following example defines a UNIQUE constraint on the non-NULL column accountkey. Das Ergebnis ist ein nicht gruppierter Index, der eine Primärschlüsseleinschränkung als eine UNIQUE-Einschränkung für eine Spalte, die ungleich NULL ist erzwingt.The result is a nonclustered index that enforces a primary key constraint as a UNIQUE constraint on a non-NULL column.

Als Nächstes wird die Tabelle zu einem gruppierten Columnstore-Index konvertiert.Next, the table is converted to a clustered columnstore index. Bei der Konvertierung besteht der nicht gruppierte Index weiterhin.During the conversion, the nonclustered index persists. Das Ergebnis ist ein gruppierter Columnstore-Index mit einem nicht gruppierten Index, der eine Primärschlüsseleinschränkung erzwingt.The result is a clustered columnstore index with a nonclustered index that enforces a primary key constraint. Da jedes Update oder jedes Einfügen in die Columnstore-Tabelle außerdem Auswirkungen auf den nicht gruppierten Index hat, verursachen alle Vorgänge, die die UNIQUE-Einschränkung und die nicht-NULL verletzen, einen Fehler im ganzen Vorgang.Since any update or insert on the columnstore table will also affect the nonclustered index, all operations that violate the unique constraint and the non-NULL will cause the entire operation to fail.

Das Ergebnis ist ein Columnstore-Index mit einem nicht gruppierten Index, der eine Primärschlüsseleinschränkung für beide Indizes erzwingt.The result is a columnstore index with a nonclustered index that enforces a primary key constraint on both indexes.

--EXAMPLE: Enforce a primary key constraint on a columnstore table.   
  
--Create a rowstore table with a unique constraint.  
--The unique constraint is implemented as a nonclustered index.  
CREATE TABLE t_account (  
    AccountKey int NOT NULL,  
    AccountDescription nvarchar (50),  
    AccountType nvarchar(50),  
    UnitSold int,  
  
    CONSTRAINT uniq_account UNIQUE (AccountKey)  
);  
  
--Store the table as a columnstore.   
--The unique constraint is preserved as a nonclustered index on the columnstore table.  
CREATE CLUSTERED COLUMNSTORE INDEX t_account_cci ON t_account  
  
--By using the previous two steps, every row in the table meets the UNIQUE constraint  
--on a non-NULL column.  
--This has the same end-result as having a primary key constraint  
--All updates and inserts must meet the unique constraint on the nonclustered index or they will fail.  
  
--If desired, add a foreign key constraint on AccountKey.  
  
ALTER TABLE [dbo].[t_account]  
WITH CHECK ADD FOREIGN KEY([AccountKey]) REFERENCES my_dimension(Accountkey); 

Verbessern der Leistung durch das Aktivieren von Sperren auf Zeilenebene und ZeilengruppenebeneImprove performance by enabling row-level and row-group-level locking

SQL Server 2016 (13.x)SQL Server 2016 (13.x) bietet eine präzise Sperrfunktion für Auswahl-, Update- und Löschvorgänge, um den nicht gruppierten Index für eine Columnstore-Index-Funktion zu ergänzen.To complement the nonclustered index on a columnstore index feature, SQL Server 2016 (13.x)SQL Server 2016 (13.x) offers granular locking capability for select, update, and delete operations. Abfragen mit Sperren auf Zeilenebene für Index-Suchvorgänge können für einen nicht gruppierten Index ausgeführt werden. Abfragen mit Sperren auf Zeilengruppenebene für vollständige Tabellenscans können für den Columnstore-Index ausgeführt werden.Queries can run with row-level locking on index seeks against a nonclustered index and rowgroup-level locking on full table scans against the columnstore index. Verwenden Sie diese Option, um eine höhere Lese/Schreib-Parallelität durch die korrekte Verwendung von Sperren auf Zeilenebene und Zeilengruppenebene zu erzielen.Use this to achieve higher read/write concurrency by using row-level and rowgroup-level locking appropriately.

--Granular locking example  
--Store table t_account as a columnstore table.  
CREATE CLUSTERED COLUMNSTORE INDEX taccount_cci ON t_account  
GO  
  
--Add a nonclustered index for use with this example  
CREATE UNIQUE INDEX taccount_nc1 ON t_account (AccountKey);  
GO  
  
--Look at locking with access through the nonclustered index  
SET TRANSACTION ISOLATION LEVEL repeatable read;  
GO  
  
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;  
END TRAN  

Momentaufnahme-Isolation und Momentaufnahmen mit der Isolationsstufe READSnapshot isolation and read-committed snapshot isolations

Verwenden Sie die Momentaufnahmeisolation (snapshot-isolation; SI), um die Transaktionskonsistenz zu gewährleisten und die Read Committed-Momentaufnahmeisolation (read-committed snapshot isolations; RCSI), um Konsistenz auf Anweisungsebene für Abfragen auf Columnstore-Indizes zu gewährleisten.Use snapshot isolation (SI) to guarantee transactional consistency, and read-committed snapshot isolations (RCSI) to guarantee statement level consistency for queries on columnstore indexes. Dadurch können Abfragen ohne Blockierung von Datenschreibern ausgeführt werden.This allows the queries to run without blocking data writers. Dieses nicht blockierende Verhalten verringert auch beträchtlich die Wahrscheinlichkeit für Deadlocks bei komplexen Transaktionen.This non-blocking behavior also significantly reduces the likelihood of deadlocks for complex transactions. Weitere Informationen finden Sie unter Momentaufnahmeisolation in SQL Server auf MSDN.For more information, see Snapshot Isolation in SQL Server on MSDN.

Weitere InformationenSee Also

Columnstore Indexes Design Guidance (Leitfaden zum Entwerfen von Columnstore-Indizes) Columnstore Indexes Design Guidance
Columnstore Indexes Data Loading Guidance (Leitfaden zum Laden von Daten in Columnstore-Indizes) Columnstore Indexes Data Loading Guidance
Abfrageleistung für Columnstore-Indizes Columnstore Indexes Query Performance
Erste Schritte mit Columnstore für operative Echtzeitanalyse Get started with Columnstore for real-time operational analytics
Neuorganisieren und Neuerstellen von Indizes Reorganize and Rebuild Indexes
Columnstore Index Architecture (Columnstore-Indizes: Architektur)Columnstore Index Architecture