Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Baza danych SQL w usłudze Microsoft Fabric (wersja zapoznawcza)
Przekonwertuj tabelę magazynu wierszy na indeks klastrowanego magazynu kolumn lub utwórz nieklastrowany indeks magazynu kolumn. Użyj indeksu magazynu kolumn, aby efektywnie uruchamiać analizę operacyjną w czasie rzeczywistym na obciążeniu OLTP lub zwiększyć kompresję danych i wydajność zapytań dla obciążeń magazynowania danych.
Aby uzyskać najnowsze ulepszenia tej funkcji, postępuj zgodnie z instrukcjami Co nowego w indeksach magazynu kolumn .
Uporządkowane indeksy klastrowanego magazynu kolumn zostały wprowadzone w programie SQL Server 2022 (16.x). Aby uzyskać więcej informacji, zobacz CREATE COLUMNSTORE INDEX (TWORZENIE INDEKSU MAGAZYNU KOLUMN). Aby uzyskać informacje o dostępności uporządkowanego indeksu columnstore, zobacz Indeksy columnstore: Omówienie.
Począwszy od programu SQL Server 2016 (13.x), możesz utworzyć tabelę jako indeks klastrowanego magazynu kolumn. Nie jest już konieczne najpierw utworzenie tabeli magazynu wierszy, a następnie przekonwertowanie jej na indeks klastrowanego magazynu kolumn.
Aby uzyskać informacje na temat wytycznych dotyczących projektowania indeksów magazynu kolumn, zobacz Indeksy magazynu kolumn — wskazówki dotyczące projektowania.
Transact-SQL konwencje składni
Syntax
Składnia dla usług Azure SQL Database i Azure SQL Managed InstanceAUTD:
-- Create a clustered columnstore index on disk-based table.
CREATE CLUSTERED COLUMNSTORE INDEX index_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ORDER (column [ , ...n ] ) ]
[ WITH ( <with_option> [ , ...n ] ) ]
[ ON <on_option> ]
[ ; ]
-- Create a nonclustered columnstore index on a disk-based table.
CREATE [ NONCLUSTERED ] COLUMNSTORE INDEX index_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
( column [ , ...n ] )
[ ORDER (column [ , ...n ] ) ]
[ WHERE <filter_expression> [ AND <filter_expression> ] ]
[ WITH ( <with_option> [ , ...n ] ) ]
[ ON <on_option> ]
[ ; ]
<with_option> ::=
DROP_EXISTING = { ON | OFF } -- default is OFF
| MAXDOP = max_degree_of_parallelism
| ONLINE = { ON | OFF }
| COMPRESSION_DELAY = { 0 | delay [ MINUTES ] }
| DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
[ ON PARTITIONS ( { partition_number_expression | range } [ , ...n ] ) ]
<on_option>::=
partition_scheme_name ( column_name )
| filegroup_name
| "default"
<filter_expression> ::=
column_name IN ( constant [ , ...n ]
| column_name { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< } constant )
Składnia dla programu SQL Server:
-- Create a clustered columnstore index on disk-based table.
CREATE CLUSTERED COLUMNSTORE INDEX index_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ WITH ( <with_option> [ , ...n ] ) ]
[ ORDER (column [ , ...n ] ) ]
[ ON <on_option> ]
[ ; ]
-- Create a nonclustered columnstore index on a disk-based table.
CREATE [ NONCLUSTERED ] COLUMNSTORE INDEX index_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
( column [ , ...n ] )
[ ORDER (column [ , ...n ] ) ]
[ WHERE <filter_expression> [ AND <filter_expression> ] ]
[ WITH ( <with_option> [ , ...n ] ) ]
[ ON <on_option> ]
[ ; ]
<with_option> ::=
DROP_EXISTING = { ON | OFF } -- default is OFF
| MAXDOP = max_degree_of_parallelism
| ONLINE = { ON | OFF }
| COMPRESSION_DELAY = { 0 | delay [ MINUTES ] }
| DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
[ ON PARTITIONS ( { partition_number_expression | range } [ , ...n ] ) ]
<on_option>::=
partition_scheme_name ( column_name )
| filegroup_name
| "default"
<filter_expression> ::=
column_name IN ( constant [ , ...n ]
| column_name { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< } constant )
Składnia dla usługi Azure Synapse Analytics and Analytics Platform System (PDW):
CREATE CLUSTERED COLUMNSTORE INDEX index_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ORDER ( column [ , ...n ] ) ]
[ WITH ( DROP_EXISTING = { ON | OFF } ) ] -- default is OFF
[;]
Version availability
Niektóre opcje nie są dostępne we wszystkich wersjach aparatu bazy danych. W poniższej tabeli przedstawiono wersje wprowadzone w klastrowanym magazynie kolumn i nieklastrowanych indeksach magazynu kolumn:
Option | CLUSTERED | NONCLUSTERED |
---|---|---|
COMPRESSION_DELAY | SQL Server 2016 (13.x) | SQL Server 2016 (13.x) |
DATA_COMPRESSION | SQL Server 2016 (13.x) | SQL Server 2016 (13.x) |
ONLINE | SQL Server 2019 (15.x) | SQL Server 2017 (14.x) |
WHERE clause | N/A | SQL Server 2016 (13.x) |
ORDER clause | SQL Server 2016 (13.x) | SQL Server 2025 (wersja zapoznawcza 17.x) |
Wszystkie opcje są dostępne w usługach Azure SQL Database i Azure SQL Managed InstanceAUTD.
Aby uzyskać więcej informacji na temat dostępności funkcji, zobacz Co nowego w indeksach magazynu kolumn.
Arguments
UTWÓRZ KLASTROWANY INDEKS MAGAZYNU KOLUMN
Utwórz klastrowany indeks magazynu kolumn, w którym wszystkie dane są kompresowane i przechowywane według kolumny. Indeks zawiera wszystkie kolumny w tabeli i przechowuje całą tabelę. Jeśli istniejąca tabela jest stosem lub indeksem klastrowanym, jest konwertowana na indeks klastrowanego magazynu kolumn. Jeśli tabela jest już przechowywana jako indeks klastrowanego magazynu kolumn, istniejący indeks zostanie porzucony i ponownie skompilowany.
Important
W bazie danych SQL w sieci szkieletowej indeks klastrowanego magazynu kolumn musi zostać utworzony w ramach tej samej partii lub transakcji co tabela, do której należy. Dodanie klastrowanego indeksu magazynu kolumn do tabeli po jej utworzeniu może spowodować następujący błąd:
Msg 35354, Level 16, State 1, Line 63, The statement failed because a clustered columnstore index cannot be created on a table enabled for Change Feed. Consider disabling Change Feed and then creating the clustered columnstore index.
index_name
Określa nazwę nowego indeksu.
Jeśli tabela ma już indeks klastrowanego magazynu kolumn, możesz określić taką samą nazwę jak istniejący indeks lub użyć opcji DROP EXISTING ,aby określić nową nazwę.
ON [ database_name. [ schema_name ] . | schema_name . ] table_name
Określa jedną, dwuczęściową lub trzyczęściową nazwę tabeli, która ma być przechowywana jako indeks klastrowanego magazynu kolumn. Jeśli tabela jest stertą lub ma indeks klastrowany, tabela jest konwertowana z magazynu wierszy do magazynu kolumn. Jeśli tabela jest już magazynem kolumn, ta instrukcja ponownie kompiluje indeks klastrowanego magazynu kolumn.
ORDER dla klastrowanego magazynu kolumn
Użyj kolumny column_store_order_ordinal
w sys.index_columns , aby określić kolejność kolumn dla klastrowanego indeksu magazynu kolumn. Kolejność magazynu kolumn ułatwia eliminację segmentów, szczególnie w przypadku danych ciągów. Aby uzyskać więcej informacji, zobacz Dostosowywanie wydajności za pomocą uporządkowanych indeksów magazynu kolumn i indeksów magazynu kolumn — wskazówki dotyczące projektowania.
Aby przekonwertować na uporządkowany indeks klastrowanego magazynu kolumn, istniejący indeks musi być indeksem klastrowanego magazynu kolumn. Użyj opcji DROP_EXISTING
.
Typy danych BIZNESOWYCH (maksymalna długość) nie mogą być kluczem uporządkowanego klastrowanego indeksu magazynu kolumn.
Podczas tworzenia uporządkowanego klastrowanego indeksu magazynu kolumn użyj MAXDOP = 1
opcji sortowania o najwyższej jakości w zamian przez znacznie dłuższy czas trwania instrukcji CREATE INDEX
. Aby utworzyć indeks tak szybko, jak to możliwe, nie ograniczaj opcji MAXDOP. Najwyższa jakość kompresji i sortowania może pomóc w zapytaniach dotyczących indeksu magazynu kolumn.
Aby uzyskać informacje o dostępności uporządkowanego indeksu columnstore, zobacz Indeksy columnstore: Omówienie.
WITH options
DROP_EXISTING = [OFF] | NA
DROP_EXISTING = ON
określa, aby usunąć istniejący indeks i utworzyć nowy indeks magazynu kolumn.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (DROP_EXISTING = ON);
Wartość domyślna, DROP_EXISTING = OFF, oczekuje, że nazwa indeksu jest taka sama jak istniejąca nazwa. Błąd występuje, jeśli określona nazwa indeksu już istnieje.
MAXDOP = max_degree_of_parallelism
Ta opcja może zastąpić istniejący maksymalny stopień konfiguracji serwera równoległości podczas operacji indeksowania. Użyj opcji MAXDOP, aby ograniczyć liczbę procesorów używanych w równoległym wykonywaniu planu. Maksymalna wartość to 64 procesory.
max_degree_of_parallelism wartości mogą być następujące:
- 1, co oznacza pomijanie generowania planu równoległego.
- >1, co oznacza ograniczenie maksymalnej liczby procesorów używanych w operacji indeksowania równoległego do określonej liczby lub mniejszej na podstawie bieżącego obciążenia systemu. Na przykład gdy parametr MAXDOP = 4, liczba używanych procesorów wynosi 4 lub mniej.
- 0 (wartość domyślna), co oznacza użycie rzeczywistej liczby procesorów lub mniej na podstawie bieżącego obciążenia systemu.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (MAXDOP = 2);
Aby uzyskać więcej informacji, zobacz Konfiguracja serwera: maksymalny stopień równoległości i Konfigurowanie równoległych operacji indeksowania.
COMPRESSION_DELAY = 0 | delay [ MIN ]
W przypadku tabeli opartej na dysku opóźnienie określa minimalną liczbę minut, przez jaką grupa wierszy różnicowych w stanie zamkniętym musi pozostać w grupie wierszy różnicowych. Program SQL Server może następnie skompresować go do skompresowanej grupy wierszy. Ponieważ tabele oparte na dysku nie śledzą czasów wstawiania i aktualizowania poszczególnych wierszy, program SQL Server stosuje opóźnienie do grup wierszy różnicowych w stanie zamkniętym.
Wartość domyślna to 0 minut.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( COMPRESSION_DELAY = 10 MINUTES );
Aby uzyskać zalecenia dotyczące tego, kiedy używać COMPRESSION_DELAY, zobacz Wprowadzenie do magazynu kolumn na potrzeby analizy operacyjnej w czasie rzeczywistym.
DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE
Określa opcję kompresji danych dla określonej tabeli, numeru partycji lub zakresu partycji. Opcje są następujące:
-
COLUMNSTORE
jest wartością domyślną i określa kompresję z najbardziej wydajną kompresją magazynu kolumn. Ta opcja jest typowym wyborem. -
COLUMNSTORE_ARCHIVE
dodatkowo kompresuje tabelę lub partycję do mniejszego rozmiaru. Użyj tej opcji w sytuacjach, takich jak archiwizacja, która wymaga mniejszego rozmiaru magazynu i może pozwolić sobie na więcej czasu na przechowywanie i pobieranie.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( DATA_COMPRESSION = COLUMNSTORE_ARCHIVE );
Aby uzyskać więcej informacji na temat kompresji, zobacz Kompresja danych.
ONLINE = [ON | WYŁĄCZONE]
-
ON
Określa, że indeks magazynu kolumn pozostaje w trybie online i dostępny, podczas gdy tworzona jest nowa kopia indeksu. -
OFF
Określa, że indeks nie jest dostępny do użycia podczas tworzenia nowej kopii.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( ONLINE = ON );
ON options
Za pomocą tych opcji można określić opcje przechowywania danych, takie jak schemat partycji, określona grupa plików lub domyślna grupa plików. Jeśli opcja WŁ nie jest określona, indeks używa ustawień partycji lub ustawień grupy plików istniejącej tabeli.
partition_scheme_name ( column_name ) określa schemat partycji dla tabeli. Schemat partycji musi już istnieć w bazie danych. Aby utworzyć schemat partycji, zobacz CREATE PARTITION SCHEME (Transact-SQL).
column_name określa kolumnę, dla której jest partycjonowany indeks. Ta kolumna musi być zgodna z typem danych, długością i dokładnością argumentu funkcji partycji, która partition_scheme_name używa.
filegroup_name określa grupę plików do przechowywania klastrowanego indeksu magazynu kolumn. Jeśli nie określono żadnej lokalizacji i tabela nie jest partycjonowana, indeks używa tej samej grupy plików co podstawowa tabela lub widok. Grupa plików musi już istnieć.
Aby utworzyć indeks w domyślnej grupie plików, użyj polecenia "default"
lub [default]
. Jeśli określisz "default"
wartość , QUOTED_IDENTIFIER
opcja musi być ON
dostępna dla bieżącej sesji.
QUOTED_IDENTIFIER
jest domyślnie ON
. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER (Transact-SQL).
CREATE [NONCLUSTERED] COLUMNSTORE INDEX
Utwórz nieklastrowany indeks magazynu kolumn w tabeli magazynu wierszy przechowywany jako stos lub indeks klastrowany. Indeks może mieć filtrowany warunek i nie musi zawierać wszystkich kolumn tabeli bazowej. Indeks magazynu kolumn wymaga wystarczającej ilości miejsca do przechowywania kopii danych. Indeks można zaktualizować i zaktualizować w miarę zmiany tabeli bazowej. Indeks magazynu kolumn nieklastrowanych w klastrowanym indeksie umożliwia analizę w czasie rzeczywistym.
index_name
Określa nazwę indeksu. index_name musi być unikatowa w tabeli, ale nie musi być unikatowa w bazie danych. Nazwy indeksów muszą być zgodne z regułami identyfikatorów .
( kolumna [ ,... n ] )
Określa kolumny do przechowywania. Indeks magazynu kolumn nieklastrowanego jest ograniczony do 1024 kolumn.
Każda kolumna musi być obsługiwanym typem danych dla indeksów magazynu kolumn. Zobacz Ograniczenia i ograniczenia , aby uzyskać listę obsługiwanych typów danych.
ON [ database_name. [ schema_name ] . | schema_name . ] table_name
Określa jedną, dwuczęściową lub trzyczęściową nazwę tabeli zawierającej indeks.
ORDER dla nieklastrowanego magazynu kolumn
Kolumny określone w klauzuli ORDER
dla nieklastrowanego indeksu magazynu kolumn muszą być podzbiorem kolumn kluczy dla indeksu.
Użyj kolumny column_store_order_ordinal
w sys.index_columns , aby określić kolejność kolumn dla nieklastrowanego indeksu magazynu kolumn. Kolejność magazynu kolumn ułatwia eliminację segmentów, szczególnie w przypadku danych ciągów. Aby uzyskać więcej informacji, zobacz Dostosowywanie wydajności za pomocą uporządkowanych indeksów magazynu kolumn i indeksów magazynu kolumn — wskazówki dotyczące projektowania. Zagadnienia dotyczące projektowania i wydajności w tych artykułach dotyczą zwykle zarówno klastrowanych, jak i nieklastrowanych indeksów magazynu kolumn.
Typy danych LOB (maksymalna długość) nie mogą być kluczem uporządkowanego indeksu nieklastrowanego magazynu kolumn.
Podczas tworzenia uporządkowanego indeksu nieklastrowanego magazynu kolumn użyj MAXDOP = 1
opcji sortowania o najwyższej jakości w zamian przez znacznie dłuższy czas trwania instrukcji CREATE INDEX
. Aby utworzyć indeks tak szybko, jak to możliwe, nie ograniczaj MAXDOP
wartości . Najwyższa jakość kompresji i sortowania może pomóc w zapytaniach dotyczących indeksu magazynu kolumn.
Aby uzyskać informacje o dostępności uporządkowanego indeksu kolumnowego, zobacz także Dostępność uporządkowanego indeksu kolumnowego.
WITH options
DROP_EXISTING = [OFF] | NA
DROP_EXISTING = ON Istniejący indeks jest porzucony i ponownie skompilowany. Określona nazwa indeksu musi być taka sama jak aktualnie istniejący indeks; można jednak zmodyfikować definicję indeksu. Można na przykład określić różne kolumny lub opcje indeksu.
DROP_EXISTING = WYŁĄCZONE
Jeśli określona nazwa indeksu już istnieje, zostanie wyświetlony błąd. Nie można zmienić typu indeksu przy użyciu DROP_EXISTING. W składni zgodnej z poprzednimi wersjami funkcja WITH DROP_EXISTING jest równoważna funkcji WITH DROP_EXISTING = ON.
MAXDOP = max_degree_of_parallelism
Zastępuje konfigurację serwera: maksymalny stopień konfiguracji równoległości podczas operacji indeksowania. Użyj opcji MAXDOP, aby ograniczyć liczbę procesorów używanych w równoległym wykonywaniu planu. Maksymalna wartość to 64 procesory.
max_degree_of_parallelism wartości mogą być następujące:
- 1, co oznacza pomijanie generowania planu równoległego.
- >1, co oznacza ograniczenie maksymalnej liczby procesorów używanych w operacji indeksowania równoległego do określonej liczby lub mniejszej na podstawie bieżącego obciążenia systemu. Na przykład gdy parametr MAXDOP = 4, liczba używanych procesorów wynosi 4 lub mniej.
- 0 (wartość domyślna), co oznacza użycie rzeczywistej liczby procesorów lub mniej na podstawie bieżącego obciążenia systemu.
Aby uzyskać więcej informacji, zobacz Konfigurowanie operacji indeksu równoległego.
Note
Operacje indeksowania równoległego nie są dostępne w każdej wersji programu Microsoft SQL Server. Aby uzyskać listę funkcji obsługiwanych przez wersje programu SQL Server, zobacz Editions i obsługiwane funkcje programu SQL Server 2022.
ONLINE = [ON | WYŁĄCZONE]
-
ON
Określa, że indeks magazynu kolumn pozostaje w trybie online i dostępny, podczas gdy tworzona jest nowa kopia indeksu. -
OFF
Określa, że indeks nie jest dostępny do użycia podczas tworzenia nowej kopii. W indeksie nieklastrowanym tabela podstawowa pozostaje dostępna. Tylko nieklastrowany indeks magazynu kolumn nie jest używany do spełnienia zapytań do momentu ukończenia nowego indeksu.
CREATE COLUMNSTORE INDEX ncci ON Sales.OrderLines (StockItemID, Quantity, UnitPrice, TaxRate)
WITH ( ONLINE = ON );
COMPRESSION_DELAY = 0 | delay [ MIN ]
Określa dolną granicę, jak długo wiersz powinien pozostać w grupie wierszy różnicowych, zanim kwalifikuje się do migracji do skompresowanej grupy wierszy. Można na przykład powiedzieć, że jeśli wiersz nie zmieni się przez 120 minut, ten wiersz kwalifikuje się do skompresowania do formatu magazynu kolumnowego.
W przypadku indeksu magazynu kolumn w tabelach opartych na dyskach czas wstawiania lub aktualizowania wiersza nie jest śledzony. Zamiast tego czas zamknięty grupy wierszy różnicowych jest używany jako serwer proxy dla wiersza. Domyślny czas trwania to 0 minut. Wiersz jest migrowany do magazynu kolumnowego po zebraniu 1 miliona wierszy w grupie wierszy różnicowych i jest oznaczony jako zamknięty.
DATA_COMPRESSION
Określa opcję kompresji danych dla określonej tabeli, numeru partycji lub zakresu partycji. Dotyczy tylko indeksów magazynu kolumn, w tym zarówno nieklastrowanych, jak i klastrowanych. Opcje są następujące:
-
COLUMNSTORE
jest wartością domyślną i określa kompresję z najbardziej wydajną kompresją magazynu kolumn. Ta opcja jest typowym wyborem. -
COLUMNSTORE_ARCHIVE
dodatkowo kompresuje tabelę lub partycję do mniejszego rozmiaru. Tej opcji można użyć do archiwizacji lub w innych sytuacjach, które wymagają mniejszego rozmiaru magazynu i mogą pozwolić na więcej czasu na przechowywanie i pobieranie.
Aby uzyskać więcej informacji na temat kompresji, zobacz Kompresja danych.
GDZIE <filter_expression> [ AND <filter_expression> ]
Nazywana predykatem filtru ta opcja określa, które wiersze mają być uwzględniane w indeksie. Program SQL Server tworzy przefiltrowane statystyki dotyczące wierszy danych w filtrowanym indeksie.
Predykat filtru używa prostej logiki porównania. Porównania używające NULL
literałów nie są dozwolone w przypadku operatorów porównania.
IS NULL
Zamiast tego użyj operatorów i IS NOT NULL
.
Oto kilka przykładów predykatów filtru dla Production.BillOfMaterials
tabeli:
WHERE StartDate > '20000101' AND EndDate <= '20000630'
WHERE ComponentID IN (533, 324, 753)
WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL
Aby uzyskać wskazówki dotyczące filtrowanych indeksów, zobacz Tworzenie filtrowanych indeksów.
ON options
Poniższe opcje określają grupy plików, na których tworzony jest indeks.
partition_scheme_name ( column_name )
Określa schemat partycji, który definiuje grupy plików, na których są mapowane partycje indeksu partycjonowanego. Schemat partycji musi istnieć w bazie danych, wykonując polecenie CREATE PARTITION SCHEME (TWORZENIE SCHEMATU PARTYCJI).
column_name określa kolumnę, dla której jest partycjonowany indeks. Ta kolumna musi być zgodna z typem danych, długością i dokładnością argumentu funkcji partycji, która partition_scheme_name używa. column_name nie jest ograniczona do kolumn w definicji indeksu. Podczas partycjonowania indeksu magazynu kolumn aparat bazy danych dodaje kolumnę partycjonowania jako kolumnę indeksu, jeśli nie została jeszcze określona.
Jeśli tabela jest partycjonowana, a partition_scheme_name lub grupa plików nie są określone, indeks jest umieszczany w tym samym schemacie partycji i używa tej samej kolumny partycjonowania co tabela bazowa.
Indeks magazynu kolumn w tabeli partycjonowanej musi być wyrównany do partycji. Aby uzyskać więcej informacji na temat partycjonowania indeksów, zobacz Partycjonowane tabele i indeksy.
filegroup_name
Określa nazwę grupy plików, na której ma zostać utworzony indeks. Jeśli filegroup_name nie zostanie określona, a tabela nie zostanie podzielona na partycje, indeks używa tej samej grupy plików co tabela bazowa. Grupa plików musi już istnieć.
"default"
Tworzy określony indeks w domyślnej grupie plików.
Termin domyślny, w tym kontekście, nie jest słowem kluczowym. Jest to identyfikator domyślnej grupy plików i musi być rozdzielany, tak jak w pliku ON "default"
lub ON [default]
. Jeśli "default"
zostanie określona, opcja QUOTED_IDENTIFIER musi być włączona dla bieżącej sesji, która jest ustawieniem domyślnym. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER.
Permissions
Wymaga uprawnienia ALTER na tabeli.
Remarks
Indeks magazynu kolumn można utworzyć w tabeli tymczasowej. Po usunięciu tabeli lub zakończeniu sesji indeks również zostanie porzucony.
W usłudze Fabric SQL Database tabele z klastrowanym indeksami magazynu kolumn nie są dublowane w usłudze Fabric OneLake.
Filtered indexes
Filtrowany indeks to zoptymalizowany, nieklastrowany indeks, odpowiedni dla zapytań, które wybierają niewielki procent wierszy z tabeli. Używa predykatu filtru do indeksowania części danych w tabeli. Dobrze zaprojektowany filtrowany indeks może poprawić wydajność zapytań, zmniejszyć koszty magazynowania i zmniejszyć koszty konserwacji.
Wymagane opcje ZESTAWU dla filtrowanych indeksów
Opcje SET w wymaganej kolumnie wartości są wymagane za każdym razem, gdy wystąpi dowolny z następujących warunków:
- Utworzysz filtrowany indeks.
- Operacja INSERT, UPDATE, DELETE lub MERGE modyfikuje dane w filtrowanym indeksie.
- Optymalizator zapytań używa filtrowanego indeksu do utworzenia planu zapytania.
SET options | Required value | Wartość domyślna serwera | Domyślna wartość OLE DB i ODBC | Wartość domyślna DB-Library |
---|---|---|---|---|
ANSI_NULLS | ON | ON | ON | OFF |
ANSI_PADDING | ON | ON | ON | OFF |
ANSI_WARNINGS 1 | ON | ON | ON | OFF |
ARITHABORT | ON | ON | OFF | OFF |
CONCAT_NULL_YIELDS_NULL | ON | ON | ON | OFF |
NUMERIC_ROUNDABORT | OFF | OFF | OFF | OFF |
QUOTED_IDENTIFIER | ON | ON | ON | OFF |
1 Ustawienie ANSI_WARNINGS wartość ON niejawnie ustawia wartość ARITHABORT na WŁ., gdy poziom zgodności bazy danych ma wartość 90 lub nowszą. Jeśli poziom zgodności bazy danych ma wartość 80 lub starszą, musisz jawnie ustawić opcję ARITHABORT na WARTOŚĆ WŁĄCZONE.
Jeśli opcje ZESTAWU są niepoprawne, mogą wystąpić następujące warunki:
Filtrowany indeks nie jest tworzony.
Aparat bazy danych generuje błąd i przywraca instrukcje INSERT, UPDATE, DELETE lub MERGE, które zmieniają dane w indeksie.
Optymalizator zapytań nie uwzględnia indeksu w planie wykonywania dla żadnych instrukcji Transact-SQL.
Aby uzyskać więcej informacji na temat filtrowanych indeksów, zobacz Tworzenie filtrowanych indeksów.
Ograniczenia i ograniczenia
Każda kolumna w indeksie magazynu kolumn musi być jednym z następujących typowych typów danych biznesowych:
- datetimeoffset [ ( n ) ]
- datetime2 [ ( n ) ]
- datetime
- smalldatetime
- date
- time [ ( n ) ]
- float [ ( n ) ]
- real [ ( n ) ]
- liczba dziesiętna [ ( precyzja [ , skala ] ) ]
- numeryczne [ ( precyzja [ , skala ] ) ]
- money
- smallmoney
- bigint
- int
- smallint
- tinyint
- bit
- nvarchar [ ( n ) ]
- nvarchar(max)1
- nchar [ ( n ) ]
- varchar [ ( n ) ]
- varchar(max)1
- char [ ( n ) ]
- varbinary [ ( n ) ]
- varbinary(max)1
- binary [ ( n ) ]
- uniqueidentifier2
1 Dotyczy programu SQL Server 2017 (14.x) i usługi Azure SQL Database w warstwie Premium, warstwy Standardowa (S3 i nowszej) oraz wszystkich warstw rdzeni wirtualnych tylko w klastrowanych indeksach magazynu kolumn.
2 Dotyczy programu SQL Server 2014 (12.x) i nowszych wersji.
Jeśli tabela bazowa zawiera kolumnę typu danych, który nie jest obsługiwany dla indeksów magazynu kolumn, należy pominąć tę kolumnę z nieklastrowanego indeksu magazynu kolumn.
Duże dane obiektów (LOB) większe niż 8 kilobajtów są przechowywane w magazynie poza wierszem, loB, z tylko wskaźnikiem do lokalizacji fizycznej przechowywanej w segmencie kolumny. Rozmiar przechowywanych danych nie jest raportowany w sys.column_store_segments, sys.column_store_dictionaries ani sys.dm_db_column_store_row_group_physical_stats.
Kolumny używające dowolnego z następujących typów danych nie mogą być uwzględniane w indeksie magazynu kolumn:
- ntext, text i image
- nvarchar(max), varchar(max)i varbinary(max)1
- rowversion (i znacznik czasu)
- sql_variant
- Typy CLR (hierarchyid i typy przestrzenne)
- xml
- uniqueidentifier2
1 Dotyczy programu SQL Server 2016 (13.x) i wcześniejszych wersji oraz nieklastrowanych indeksów magazynu kolumn.
2 Dotyczy programu SQL Server 2012 (11.x).
Nieklastrowane indeksy magazynu kolumn:
- Nie można mieć więcej niż 1024 kolumn.
- Nie można utworzyć jako indeksu opartego na ograniczeniach. Istnieje możliwość posiadania unikatowych ograniczeń, ograniczeń klucza podstawowego i ograniczeń klucza obcego w tabeli z indeksem magazynu kolumn. Ograniczenia są zawsze wymuszane za pomocą indeksu magazynu wierszy. Nie można wymusić ograniczeń za pomocą indeksu magazynu kolumn (klastrowanego lub nieklastrowanego).
- Nie można uwzględnić rozrzednej kolumny.
- Nie można zmienić za pomocą instrukcji ALTER INDEX. Aby zmienić indeks nieklastrowany, należy zamiast tego usunąć i ponownie utworzyć indeks magazynu kolumn. Za pomocą funkcji ALTER INDEX można wyłączyć i ponownie skompilować indeks magazynu kolumn.
- Nie można utworzyć przy użyciu słowa kluczowego INCLUDE.
- Nie można określić
ASC
słów kluczowych lubDESC
na liście kolumn indeksu. Indeksy magazynu kolumn są uporządkowane zgodnie z algorytmami kompresji. - W usłudze Azure SQL Database, baza danych SQL w wersji zapoznawczej usługi Microsoft Fabric,autD usługi Azure SQL Managed Instance i program SQL Server 2025 (17.x) (wersja zapoznawcza) można zamówić, uwzględniając klauzulę
ORDER
. Aby uzyskać więcej informacji, zobacz Optymalizacja wydajności z uporządkowanymi indeksami kolumnowymi. - Nie można uwzględnić kolumn LOB typu nvarchar(max), varchar(max)i varbinary(max) w indeksach nieklastrowanych magazynu kolumn. Tylko klastrowane indeksy magazynu kolumn obsługują typy LOB, począwszy od wersji programu SQL Server 2017 (14.x), usługi Azure SQL Database (skonfigurowanej w warstwie Premium, warstwie Standardowa (S3 i nowszej) oraz wszystkich warstwach ofert rdzeni wirtualnych. Wcześniejsze wersje nie obsługują typów LOB w klastrowanych i nieklastrowanych indeksach magazynu kolumn.
- Począwszy od programu SQL Server 2016 (13.x), można utworzyć nieklastrowany indeks magazynu kolumn w widoku indeksowanym.
Indeksy magazynu kolumn nie mogą być łączone z następującymi funkcjami:
- Computed columns. Począwszy od programu SQL Server 2017 (14.x), indeks klastrowanego magazynu kolumn może zawierać nietrwałą kolumnę obliczeniową. Jednak w programie SQL Server 2017 (14.x) indeksy klastrowanego magazynu kolumn nie mogą zawierać utrwanych kolumn obliczeniowych i nie można tworzyć indeksów nieklastrowanych w kolumnach obliczeniowych.
- Kompresja stron i wierszy oraz format magazynu vardecimal . (Indeks magazynu kolumn jest już skompresowany w innym formacie).
- Replikacja za pomocą klastrowanych indeksów magazynu kolumn. Indeksy magazynu kolumn nieklastrowanych są obsługiwane. Aby uzyskać więcej informacji, zobacz sp_addarticle.
- Filestream.
Nie można używać kursorów ani wyzwalaczy w tabeli z klastrowanym indeksem magazynu kolumn. To ograniczenie nie ma zastosowania do nieklastrowanych indeksów magazynu kolumn. Możesz użyć kursorów i wyzwalaczy w tabeli z indeksem magazynu kolumn nieklastrowanego.
Ograniczenia specyficzne dla programu SQL Server 2014 (12.x):
Następujące ograniczenia dotyczą tylko programu SQL Server 2014 (12.x). W tej wersji można użyć indeksów magazynu kolumn klastra z możliwością aktualizacji. Indeksy magazynu kolumn nieklastrowanych są nadal tylko do odczytu.
- Change tracking. Nie można używać śledzenia zmian z indeksami magazynu kolumn.
- Zmienianie przechwytywania danych. Tej funkcji nie można włączyć w tabelach z klastrowanym indeksem magazynu kolumn. Począwszy od programu SQL Server 2016 (13.x), przechwytywanie zmian danych można włączyć w tabelach z nieklastrowanym indeksem magazynu kolumn.
- Readable secondary. Nie można uzyskać dostępu do klastrowanego indeksu magazynu kolumn (CCI) z pomocniczej funkcji odczytu zawsze włączonej grupy dostępności z możliwością odczytu. Dostęp do nieklastrowanego indeksu magazynu kolumn (NCCI) można uzyskać z pomocniczego możliwego do odczytu.
- Wiele aktywnych zestawów wyników (MARS). Program SQL Server 2014 (12.x) używa tej funkcji do połączeń tylko do odczytu z tabelami z indeksem magazynu kolumn. Jednak program SQL Server 2014 (12.x) nie obsługuje tej funkcji dla operacji języka manipulowania danymi współbieżnymi (DML) w tabeli z indeksem magazynu kolumn. Jeśli spróbujesz użyć funkcji w tym celu, program SQL Server przerywa połączenia i anuluje transakcje.
- Nie można utworzyć nieklastrowanych indeksów magazynu kolumn w widoku ani w widoku indeksowanym.
Aby uzyskać informacje na temat korzyści z wydajności i ograniczeń indeksów magazynu kolumn, zobacz Indeksy magazynu kolumn: Omówienie.
Metadata
Wszystkie kolumny w indeksie magazynu kolumn są przechowywane w metadanych jako dołączone kolumny. Indeks columnstore nie zawiera kolumn kluczowych. Następujące widoki systemowe zawierają informacje o indeksach magazynu kolumn:
- sys.indexes (Transact-SQL)
- sys.index_columns (Transact-SQL)
- sys.partitions (Transact-SQL)
- sys.column_store_segments (Transact-SQL)
- sys.column_store_dictionaries (Transact-SQL)
- sys.column_store_row_groups (Transact-SQL)
Przykłady: konwertowanie tabeli z magazynu wierszy na magazyn kolumn
A. Konwertowanie sterta do klastrowanego indeksu magazynu kolumn
W tym przykładzie utworzono tabelę jako stertę, a następnie przekonwertowano ją na klasterowy indeks magazynu kolumn o nazwie cci_Simple
. Utworzenie klastrowanego indeksu magazynu kolumn zmienia magazyn dla całej tabeli z magazynu wierszy na magazyn kolumn.
CREATE TABLE dbo.SimpleTable(
ProductKey [INT] NOT NULL,
OrderDateKey [INT] NOT NULL,
DueDateKey [INT] NOT NULL,
ShipDateKey [INT] NOT NULL);
GO
CREATE CLUSTERED COLUMNSTORE INDEX cci_Simple ON dbo.SimpleTable;
GO
B. Konwertowanie klastrowanego indeksu do klastrowanego indeksu magazynu kolumn o tej samej nazwie
W tym przykładzie zostanie utworzona tabela z indeksem klastrowanym, a następnie pokazano składnię konwertowania indeksu klastrowanego na indeks klastrowanego magazynu kolumn. Utworzenie klastrowanego indeksu magazynu kolumn zmienia magazyn dla całej tabeli z magazynu wierszy na magazyn kolumn.
CREATE TABLE dbo.SimpleTable2 (
ProductKey [INT] NOT NULL,
OrderDateKey [INT] NOT NULL,
DueDateKey [INT] NOT NULL,
ShipDateKey [INT] NOT NULL);
GO
CREATE CLUSTERED INDEX cl_simple ON dbo.SimpleTable2 (ProductKey);
GO
CREATE CLUSTERED COLUMNSTORE INDEX cl_simple ON dbo.SimpleTable2
WITH (DROP_EXISTING = ON);
GO
C. Obsługa indeksów nieklastrowanych podczas konwertowania tabeli magazynu wierszy na indeks magazynu kolumn
W tym przykładzie pokazano, jak obsługiwać indeksy nieklastrowane podczas konwertowania tabeli magazynu wierszy na indeks magazynu kolumn. Począwszy od programu SQL Server 2016 (13.x), nie jest wymagana żadna specjalna akcja. Program SQL Server automatycznie definiuje i ponownie kompiluje indeksy nieklastrowane w nowym, klastrowanym indeksie magazynu kolumn.
Jeśli chcesz usunąć indeksy nieklastrowane, przed utworzeniem indeksu magazynu kolumn użyj instrukcji DROP INDEX. Opcja DROP EXISTING usuwa tylko indeks klastrowany, który jest konwertowany. Nie usuwa indeksów nieklastrowanych.
W programach SQL Server 2012 (11.x) i SQL Server 2014 (12.x) nie można utworzyć indeksu nieklastrowanego w indeksie magazynu kolumn.
--Create the table for use with this example.
CREATE TABLE dbo.SimpleTable (
ProductKey [INT] NOT NULL,
OrderDateKey [INT] NOT NULL,
DueDateKey [INT] NOT NULL,
ShipDateKey [INT] NOT NULL);
GO
--Create two nonclustered indexes for use with this example
CREATE INDEX nc1_simple ON dbo.SimpleTable (OrderDateKey);
CREATE INDEX nc2_simple ON dbo.SimpleTable (DueDateKey);
GO
Tylko w przypadku programów SQL Server 2012 (11.x) i SQL Server 2014 (12.x) należy usunąć indeksy nieklastrowane, aby utworzyć indeks magazynu kolumn.
DROP INDEX dbo.SimpleTable.nc1_simple;
DROP INDEX dbo.SimpleTable.nc2_simple;
--Convert the rowstore table to a columnstore index.
CREATE CLUSTERED COLUMNSTORE INDEX cci_simple ON dbo.SimpleTable;
GO
D. Konwertowanie dużej tabeli faktów z magazynu wierszy na magazyn kolumn
W tym przykładzie wyjaśniono, jak przekonwertować dużą tabelę faktów z tabeli rowstore na tabelę magazynu kolumn.
Utwórz małą tabelę do użycia w tym przykładzie.
--Create a rowstore table with a clustered index and a nonclustered index. CREATE TABLE dbo.MyFactTable ( ProductKey [INT] NOT NULL, OrderDateKey [INT] NOT NULL, DueDateKey [INT] NOT NULL, ShipDateKey [INT] NOT NULL INDEX IDX_CL_MyFactTable CLUSTERED ( ProductKey ) ); --Add a nonclustered index. CREATE INDEX my_index ON dbo.MyFactTable ( ProductKey, OrderDateKey );
Usuń wszystkie indeksy nieklastrowane z tabeli rowstore. Możesz chcieć utworzyć skrypty indeksów, aby utworzyć je ponownie później.
--Drop all nonclustered indexes DROP INDEX my_index ON dbo.MyFactTable;
Przekonwertuj tabelę magazynu wierszy na tabelę magazynu kolumn za pomocą klastrowanego indeksu magazynu kolumn.
Najpierw wyszukaj nazwę istniejącego klastrowanego indeksu magazynu wierszy. W kroku 1 ustawimy nazwę indeksu na
IDX_CL_MyFactTable
. Jeśli nazwa indeksu nie została określona, otrzymano automatycznie wygenerowaną unikatową nazwę indeksu. Możesz pobrać automatycznie wygenerowaną nazwę przy użyciu następującego przykładowego zapytania:SELECT i.object_id, i.name, t.object_id, t.name FROM sys.indexes i INNER JOIN sys.tables t ON i.object_id = t.object_id WHERE i.type_desc = 'CLUSTERED' AND t.name = 'MyFactTable';
Opcja 1. Usuń istniejący indeks
IDX_CL_MyFactTable
klastrowany i przekonwertujMyFactTable
na magazyn kolumn. Zmień nazwę nowego klastrowanego indeksu magazynu kolumn.--Drop the clustered rowstore index. DROP INDEX [IDX_CL_MyFactTable] ON dbo.MyFactTable; GO --Create a new clustered columnstore index with the name MyCCI. CREATE CLUSTERED COLUMNSTORE INDEX IDX_CCL_MyFactTable ON dbo.MyFactTable; GO
Opcja 2. Przekonwertuj na magazyn kolumn i ponownie użyj istniejącej nazwy indeksu klastrowanego magazynu wierszy.
--Create the clustered columnstore index, --replacing the existing rowstore clustered index of the same name CREATE CLUSTERED COLUMNSTORE INDEX [IDX_CL_MyFactTable] ON dbo.MyFactTable WITH (DROP_EXISTING = ON);
E. Konwertowanie tabeli magazynu kolumn na tabelę magazynu wierszy za pomocą indeksu klastrowanego
Aby przekonwertować tabelę magazynu kolumn na tabelę magazynu wierszy z indeksem klastrowanym, użyj instrukcji CREATE INDEX z opcją DROP_EXISTING.
CREATE CLUSTERED INDEX [IDX_CL_MyFactTable]
ON dbo.[MyFactTable] ( ProductKey )
WITH ( DROP_EXISTING = ON );
F. Konwertowanie tabeli magazynu kolumn na stertę magazynu wierszy
Aby przekonwertować tabelę magazynu kolumn na stertę magazynu wierszy, usuń indeks klastrowanego magazynu kolumn. Zazwyczaj nie jest to zalecane, ale niektóre mogą mieć wąskie zastosowania. Aby uzyskać więcej informacji na temat stert, zobacz Heaps (tabele bez indeksów klastrowanych).
DROP INDEX [IDX_CL_MyFactTable]
ON dbo.[MyFactTable];
G. Defragmentacja przez reorganizację indeksu magazynu kolumn
Istnieją dwa sposoby obsługi klastrowanego indeksu magazynu kolumn. Począwszy od programu SQL Server 2016 (13.x), użyj zamiast funkcji ALTER INDEX...REORGANIZE
REBUILD. Aby uzyskać więcej informacji, zobacz Grupa wierszy indeksu magazynu kolumn. W poprzednich wersjach programu SQL Server można użyć polecenia CREATE CLUSTERED COLUMNSTORE INDEX with DROP_EXISTING=ON lub ALTER INDEX (Transact-SQL) i opcji ODBUDOWA. Obie metody osiągnęły te same wyniki.
Zacznij od określenia nazwy klastrowanego indeksu magazynu kolumn w pliku MyFactTable
.
SELECT i.object_id, i.name, t.object_id, t.name
FROM sys.indexes i
INNER JOIN sys.tables t on i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED COLUMNSTORE'
AND t.name = 'MyFactTable';
Usuń fragmentację, wykonując polecenie REORGANIZE w indeksie magazynu kolumn.
--Rebuild the entire index by using ALTER INDEX and the REBUILD option.
ALTER INDEX IDX_CL_MyFactTable
ON dbo.[MyFactTable]
REORGANIZE;
Przykłady nieklastrowanych indeksów magazynu kolumn
A. Tworzenie indeksu magazynu kolumn jako indeksu pomocniczego w tabeli rowstore
W tym przykładzie tworzony jest nieklastrowany indeks magazynu kolumn w tabeli rowstore. W tej sytuacji można utworzyć tylko jeden indeks magazynu kolumn. Indeks magazynu kolumn wymaga dodatkowego magazynu, ponieważ zawiera kopię danych w tabeli rowstore. W tym przykładzie utworzono prostą tabelę i indeks klastrowany magazynu wierszy, a następnie pokazano składnię tworzenia indeksu magazynu kolumn nieklastrowanego.
CREATE TABLE dbo.SimpleTable (
ProductKey [INT] NOT NULL,
OrderDateKey [INT] NOT NULL,
DueDateKey [INT] NOT NULL,
ShipDateKey [INT] NOT NULL);
GO
CREATE CLUSTERED INDEX cl_simple ON dbo.SimpleTable (ProductKey);
GO
CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
ON dbo.SimpleTable (OrderDateKey, DueDateKey, ShipDateKey);
GO
B. Tworzenie podstawowego indeksu magazynu kolumn nieklastrowanego przy użyciu wszystkich opcji
W poniższym przykładzie pokazano składnię tworzenia nieklastrowanego indeksu magazynu kolumn w domyślnej grupie plików, określając maksymalny stopień równoległości (MAXDOP) jako 2.
CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
ON SimpleTable (OrderDateKey, DueDateKey, ShipDateKey)
WITH (DROP_EXISTING = ON,
MAXDOP = 2)
ON "DEFAULT";
GO
C. Tworzenie nieklastrowanego indeksu magazynu kolumn z filtrowanym predykatem
Poniższy przykład tworzy filtrowany, nieklastrowany indeks magazynu kolumn w Production.BillOfMaterials
tabeli w przykładowej AdventureWorks2022
bazie danych. Predykat filtru może zawierać kolumny, które nie są kluczowymi kolumnami w filtrowanym indeksie. Predykat w tym przykładzie wybiera tylko wiersze, w których EndDate
nie ma wartości NULL.
IF EXISTS (SELECT name FROM sys.indexes
WHERE name = N'FIBillOfMaterialsWithEndDate'
AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))
DROP INDEX FIBillOfMaterialsWithEndDate
ON Production.BillOfMaterials;
GO
CREATE NONCLUSTERED COLUMNSTORE INDEX "FIBillOfMaterialsWithEndDate"
ON Production.BillOfMaterials (ComponentID, StartDate)
WHERE EndDate IS NOT NULL;
D. Zmienianie danych w indeksie magazynu kolumn nieklastrowanego
Dotyczy: SQL Server 2012 (11.x) do programu SQL Server 2014 (12.x).
W programie SQL Server 2014 (12.x) i starszych wersjach po utworzeniu nieklastrowanego indeksu magazynu kolumn w tabeli nie można bezpośrednio modyfikować danych w tej tabeli. Zapytanie z instrukcjami INSERT, UPDATE, DELETE lub MERGE kończy się niepowodzeniem i zwraca komunikat o błędzie. Poniżej przedstawiono opcje, których można użyć do dodawania lub modyfikowania danych w tabeli:
Wyłącz lub upuść indeks magazynu kolumn. Następnie możesz zaktualizować dane w tabeli. Jeśli wyłączysz indeks magazynu kolumn, możesz ponownie skompilować indeks magazynu kolumn po zakończeniu aktualizowania danych. For example:
ALTER INDEX mycolumnstoreindex ON dbo.mytable DISABLE; -- update the data in mytable as necessary ALTER INDEX mycolumnstoreindex on dbo.mytable REBUILD;
Załaduj dane do tabeli przejściowej, która nie ma indeksu magazynu kolumn. Utwórz indeks magazynu kolumn w tabeli przejściowej. Przełącz tabelę przejściową na pustą partycję tabeli głównej.
Przełącz partycję z tabeli z indeksem magazynu kolumn do pustej tabeli przejściowej. Jeśli istnieje indeks magazynu kolumn w tabeli przejściowej, wyłącz indeks magazynu kolumn. Wykonaj wszystkie aktualizacje. Skompiluj (lub ponownie skompiluj) indeks magazynu kolumn. Przełącz tabelę przejściową z powrotem na partycję (teraz pustą) tabeli głównej.
Przykłady: Azure Synapse Analytics, Analytics Platform System (PDW)
A. Zmienianie klastrowanego indeksu na klastrowany indeks magazynu kolumn
Korzystając z instrukcji CREATE CLUSTERED COLUMNSTORE INDEX z DROP_EXISTING = ON, możesz:
Zmień indeks klastrowany na klastrowany indeks magazynu kolumn.
Ponowne kompilowanie klastrowanego indeksu magazynu kolumn.
W tym przykładzie tabela jest tworzona xDimProduct
jako tabela magazynu wierszy z indeksem klastrowanym. Następnie w przykładzie użyto polecenia CREATE CLUSTERED COLUMNSTORE INDEX w celu zmiany tabeli z tabeli rowstore na tabelę magazynu kolumn.
-- Uses AdventureWorks
IF EXISTS (SELECT name FROM sys.tables
WHERE name = N'xDimProduct'
AND object_id = OBJECT_ID (N'xDimProduct'))
DROP TABLE xDimProduct;
--Create a distributed table with a clustered index.
CREATE TABLE xDimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey)
WITH ( DISTRIBUTION = HASH(ProductKey),
CLUSTERED INDEX (ProductKey) )
AS SELECT ProductKey, ProductAlternateKey, ProductSubcategoryKey FROM DimProduct;
Wyszukaj nazwę indeksu klastrowanego automatycznie utworzonego dla nowej tabeli w metadanych systemu przy użyciu polecenia sys.indexes
. For example:
SELECT i.object_id, i.name, t.object_id, t.name, i.type_desc
FROM sys.indexes i
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED'
AND t.name = 'xdimProduct';
Teraz możesz wybrać następujące elementy:
- Usuń istniejący indeks klastrowanego magazynu kolumn z automatycznie utworzoną nazwą, a następnie utwórz nowy indeks klastrowanego magazynu kolumn z nazwą zdefiniowaną przez użytkownika.
- Upuść i zastąp istniejący indeks klastrowanym indeksem magazynu kolumn, zachowując tę samą nazwę wygenerowaną przez system, taką jak
ClusteredIndex_1bd8af8797f7453182903cc68df48541
.
For example:
--1. DROP the existing clustered columnstore index with an automatically-created name, for example:
DROP INDEX ClusteredIndex_1bd8af8797f7453182903cc68df48541 on xdimProduct;
GO
CREATE CLUSTERED COLUMNSTORE INDEX [<new_index_name>]
ON xdimProduct;
GO
--Or,
--2. Change the existing clustered index to a clustered columnstore index with the same name.
CREATE CLUSTERED COLUMNSTORE INDEX [ClusteredIndex_1bd8af8797f7453182903cc68df48541]
ON xdimProduct
WITH ( DROP_EXISTING = ON );
GO
B. Ponowne kompilowanie klastrowanego indeksu magazynu kolumn
Korzystając z poprzedniego przykładu, w tym przykładzie użyto polecenia CREATE CLUSTERED COLUMNSTORE INDEX w celu ponownego skompilowania istniejącego klastrowanego indeksu magazynu kolumn o nazwie cci_xDimProduct
.
--Rebuild the existing clustered columnstore index.
CREATE CLUSTERED COLUMNSTORE INDEX cci_xDimProduct
ON xdimProduct
WITH ( DROP_EXISTING = ON );
C. Zmienianie nazwy klastrowanego indeksu magazynu kolumn
Aby zmienić nazwę klastrowanego indeksu magazynu kolumn, usuń istniejący indeks klastrowanego magazynu kolumn, a następnie ponownie utwórz indeks o nowej nazwie.
Zalecamy ograniczenie tej operacji do małej lub pustej tabeli. Usunięcie dużego, klastrowanego indeksu magazynu kolumn i ponowne skompilowanie z inną nazwą trwa długo.
W tym przykładzie odwołuje się do klastrowanego indeksu cci_xDimProduct
magazynu kolumn z poprzedniego przykładu. W tym przykładzie cci_xDimProduct
spadnie indeks klastrowanego magazynu kolumn, a następnie ponownie utworzy klastrowany indeks magazynu kolumn o nazwie mycci_xDimProduct
.
--For illustration purposes, drop the clustered columnstore index.
--The table continues to be distributed, but changes to a heap.
DROP INDEX cci_xdimProduct ON xDimProduct;
--Create a clustered index with a new name, mycci_xDimProduct.
CREATE CLUSTERED COLUMNSTORE INDEX mycci_xDimProduct
ON xdimProduct
WITH ( DROP_EXISTING = OFF );
D. Konwertowanie tabeli magazynu kolumn na tabelę magazynu wierszy za pomocą indeksu klastrowanego
Może wystąpić sytuacja, w której chcesz usunąć klastrowany indeks magazynu kolumn i utworzyć indeks klastrowany. Po usunięciu klastrowanego indeksu magazynu kolumn tabela zostanie zmieniona na format magazynu wierszy. W tym przykładzie tabela magazynu kolumn jest konwertowana na tabelę magazynu wierszy z indeksem klastrowanym o tej samej nazwie. Żadne z danych nie zostanie utracone. Wszystkie dane przechodzą do tabeli rowstore, a wymienione kolumny stają się kluczowymi kolumnami w indeksie klastrowanym.
--Drop the clustered columnstore index and create a clustered rowstore index.
--All of the columns are stored in the rowstore clustered index.
--The columns listed are the included columns in the index.
CREATE CLUSTERED INDEX cci_xDimProduct
ON xdimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey, WeightUnitMeasureCode)
WITH ( DROP_EXISTING = ON);
E. Konwertowanie tabeli magazynu kolumn z powrotem na stertę magazynu wierszy
Użyj funkcji DROP INDEX , aby usunąć indeks klastrowanego magazynu kolumn i przekonwertować tabelę na stertę magazynu wierszy. W tym przykładzie tabela jest cci_xDimProduct
konwertowana na stertę magazynu wierszy. Tabela nadal jest dystrybuowana, ale jest przechowywana jako sterta.
--Drop the clustered columnstore index. The table continues to be distributed, but changes to a heap.
DROP INDEX cci_xdimProduct ON xdimProduct;
F. Tworzenie uporządkowanego klastrowanego indeksu magazynu kolumn w tabeli bez indeksu
Nieurządkowany indeks magazynu kolumn domyślnie obejmuje wszystkie kolumny bez konieczności określania listy kolumn. Uporządkowany indeks magazynu kolumn umożliwia określenie kolejności kolumn. Lista nie musi zawierać wszystkich kolumn.
Aby uzyskać więcej informacji, zobacz Optymalizacja wydajności z uporządkowanymi indeksami kolumnowymi.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE);
G. Konwertowanie klastrowanego indeksu magazynu kolumn na uporządkowany indeks klastrowanego magazynu kolumn
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE)
WITH (DROP_EXISTING = ON);
H. Dodawanie kolumny do kolejności uporządkowanego klastrowanego indeksu magazynu kolumn
Możesz określić kolejność kolumn w indeksie magazynu kolumn. Oryginalny uporządkowany indeks klastrowanego magazynu kolumn został uporządkowany tylko w kolumnie SHIPDATE
. Poniższy przykład dodaje kolumnę PRODUCTKEY
do kolejności. Aby uzyskać informacje o dostępności uporządkowanego indeksu columnstore, zobacz Indeksy columnstore: Omówienie.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE, PRODUCTKEY)
WITH (DROP_EXISTING = ON);
I. Zmienianie porządkowości uporządkowanych kolumn
Oryginalny uporządkowany indeks klastrowanego magazynu kolumn został uporządkowany w dniu SHIPDATE
, PRODUCTKEY
. Poniższy przykład zmienia kolejność na PRODUCTKEY
, SHIPDATE
. Aby uzyskać informacje o dostępności uporządkowanego indeksu columnstore, zobacz Indeksy columnstore: Omówienie.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (PRODUCTKEY,SHIPDATE)
WITH (DROP_EXISTING = ON);
J. Tworzenie uporządkowanego klastrowanego indeksu magazynu kolumn
Możesz utworzyć indeks klastrowanego magazynu kolumn z kluczami porządkowania. Podczas tworzenia uporządkowanego klastrowanego indeksu magazynu kolumn należy zastosować wskazówkę MAXDOP = 1
zapytania dla maksymalnej jakości sortowania i najkrótszego czasu trwania. Aby uzyskać informacje o dostępności uporządkowanego indeksu columnstore, zobacz Indeksy columnstore: Omówienie.
CREATE CLUSTERED COLUMNSTORE INDEX [OrderedCCI] ON dbo.FactResellerSalesPartCategoryFull
ORDER (EnglishProductSubcategoryName, EnglishProductName)
WITH (MAXDOP = 1, DROP_EXISTING = ON);