Aracılığıyla paylaş


CREATE COLUMNSTORE INDEX (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnalytics Platform Sistemi (PDW)Microsoft Fabric'teki SQL veritabanı

Satır deposu tablosunu kümelenmiş columnstore dizinine dönüştürün veya kümelenmemiş bir columnstore dizini oluşturun. OlTP iş yükünde gerçek zamanlı operasyonel analizleri verimli bir şekilde çalıştırmak veya veri ambarı iş yükleri için veri sıkıştırma ve sorgu performansını geliştirmek için columnstore dizini kullanın.

Bu özellikteki en son geliştirmeler için columnstore dizinlerindeki yenilikler'i izleyin.

  • Sql Server 2022'de (16.x) sıralı kümelenmiş columnstore dizinleri kullanıma sunuldu. Daha fazla bilgi için bkz. CREATE COLUMNSTORE INDEX. Columnstore dizinlerinin erişilebilirliği için bkz. Columnstore dizinleri: Genel Bakış.

  • SQL Server 2016'dan (13.x) başlayarak, tabloyu kümelenmiş columnstore dizini olarak oluşturabilirsiniz. Artık önce bir satır deposu tablosu oluşturmak ve sonra bunu kümelenmiş columnstore dizinine dönüştürmek gerekmez.

  • Columnstore dizini tasarım yönergeleri hakkında bilgi için bkz. Columnstore dizinleri - Tasarım kılavuzu.

Transact-SQL söz dizimi kuralları

Sözdizimi

Azure SQL Veritabanı ve Azure SQL Yönetilen ÖrneğiAUTD söz dizimi:

-- 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 )

SQL Server söz dizimi:

-- 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 )

Azure Synapse Analytics ve Analytics Platform Sistemi (PDW) için söz dizimi:

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
[;]

Sürüm kullanılabilirliği

Bazı seçenekler tüm veritabanı altyapısı sürümlerinde kullanılamaz. Aşağıdaki tabloda, kümelenmiş columnstore ve kümelenmemiş columnstore dizinlerinde seçeneklerin sunulduğu sürümler gösterilmektedir:

Seçenek kümelenmiş KÜMELENMİDİ
COMPRESSION_DELAY SQL Server 2016 (13.x) SQL Server 2016 (13.x)
VERİ_SIKIŞTIRMA SQL Server 2016 (13.x) SQL Server 2016 (13.x)
ÇEVRİMİÇİ SQL Server 2019 (15.x) SQL Server 2017 (14.x)
WHERE ifadesi Mevcut Değil SQL Server 2016 (13.x)
ORDER yan tümcesi SQL Server 2016 (13.x) SQL Server 2025 (17.x) Önizlemesi

Tüm seçenekler Azure SQL Veritabanı ve Azure SQL Yönetilen ÖrneğiAUTD'de kullanılabilir.

Özellik kullanılabilirliği hakkında daha fazla ayrıntı için bkz. Columnstore dizinlerindeki yenilikler.

Tartışmalar

KÜMELENMIŞ COLUMNSTORE DIZINI OLUŞTURMA

Tüm verilerin sütuna göre sıkıştırıldığı ve depolandığı kümelenmiş bir columnstore dizini oluşturun. Dizin, tablodaki tüm sütunları içerir ve tablonun tamamını depolar. Mevcut tablo bir yığın veya kümelenmiş dizinse, kümelenmiş columnstore dizinine dönüştürülür. Tablo zaten kümelenmiş columnstore dizini olarak depolanıyorsa, mevcut dizin bırakılır ve yeniden oluşturulur.

Önemli

Doku'daki SQL veritabanında, kümelenmiş columnstore dizini ait olduğu tabloyla aynı toplu işlem veya işlem içinde oluşturulmalıdır. Tablo oluşturulduktan sonra bir tabloya kümelenmiş columnstore dizini eklemek aşağıdaki hataya neden olabilir:

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

Yeni dizinin adını belirtir.

Tabloda zaten bir kümelenmiş columnstore dizini varsa, var olan dizinle aynı adı belirtebilir veya DROP EXISTING seçeneğini kullanarak yeni bir ad belirtebilirsiniz.

ON [ database_name. [ schema_name ] . | schema_name . ] table_name

Kümelenmiş columnstore dizini olarak depolanacak tablonun bir, iki veya üç bölümlü adını belirtir. Tablo bir yığınsa veya kümelenmiş bir dizine sahipse, tablo bir satır deposundan columnstore'a dönüştürülür. Tablo zaten bir columnstore ise, bu deyim kümelenmiş columnstore dizinini yeniden oluşturur.

Kümelenmiş columnstore için ORDER

column_store_order_ordinal Kümelenmiş columnstore dizini için sütunların sırasını belirlemek için sys.index_columns sütununu kullanın. Columnstore sıralama, özellikle dize verileriyle segment ortadan kaldırmaya yardımcı olur. Daha fazla bilgi için bkz. Sıralı columnstore dizinleriyle performans ayarlama ve Columnstore dizinleri - Tasarım kılavuzu.

Sıralı bir kümelenmiş columnstore dizinine dönüştürmek için mevcut dizinin kümelenmiş bir columnstore dizini olması gerekir. DROP_EXISTING seçeneğini kullanın.

LOB veri türleri (maksimum) uzunluklu veri türleri, sıralı kümelenmiş columnstore dizininin anahtarı olamaz.

Sıralı kümelenmiş columnstore dizini oluştururken, deyiminin MAXDOP = 1 çok daha uzun bir süresi CREATE INDEX karşılığında en yüksek kaliteli sıralama seçeneğini kullanın. Dizini mümkün olan en hızlı şekilde oluşturmak için MAXDOP'u sınırlandırmayın. En yüksek sıkıştırma ve sıralama kalitesi columnstore dizinindeki sorgulara yardımcı olabilir.

Columnstore dizinlerinin erişilebilirliği için bkz. Columnstore dizinleri: Genel Bakış.

WITH seçenekleri

DROP_EXISTING = [KAPALI] | ÜZERİNDE

DROP_EXISTING = ON , var olan dizini bırakmayı ve yeni bir columnstore dizini oluşturmayı belirtir.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (DROP_EXISTING = ON);

varsayılan değer olan DROP_EXISTING = KAPALI, dizin adının mevcut adla aynı olmasını bekler. Belirtilen dizin adı zaten varsa bir hata oluşur.

MAXDOP = max_degree_of_parallelism

Bu seçenek, dizin işlemi sırasında mevcut en yüksek paralellik derecesi sunucu yapılandırmasını geçersiz kılabilir. Paralel plan yürütmesinde kullanılan işlemci sayısını sınırlamak için MAXDOP kullanın. Maksimum değer 64 işlemcidir.

max_degree_of_parallelism değerler:

  • 1, paralel plan oluşturmayı gizleme anlamına gelir.
  • >1, paralel dizin işleminde kullanılan en fazla işlemci sayısını geçerli sistem iş yüküne göre belirtilen sayıda veya daha az işlemciyle kısıtlamak anlamına gelir. Örneğin, MAXDOP = 4 olduğunda, kullanılan işlemci sayısı 4 veya daha azdır.
  • 0 (varsayılan), geçerli sistem iş yüküne göre gerçek işlemci sayısını veya daha azını kullanmak anlamına gelir.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (MAXDOP = 2);

Daha fazla bilgi için bkz . Sunucu yapılandırması: maksimum paralellik derecesi ve Paralel Dizin İşlemlerini Yapılandırma.

COMPRESSION_DELAY = 0 | delay [ DAKİkA ]

Disk tabanlı bir tablo için gecikme , kapalı durumdaki bir delta satır grubunun delta satır grubunda kalması gereken en az dakika sayısını belirtir. SQL Server daha sonra sıkıştırılmış satır grubuna sıkıştırabilir. Disk tabanlı tablolar tek tek satırlarda ekleme ve güncelleştirme sürelerini izlemediğinden, SQL Server gecikmeyi kapalı durumdaki delta satır gruplarına uygular.

Varsayılan değer 0 dakikadır.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( COMPRESSION_DELAY = 10 MINUTES );

COMPRESSION_DELAY ne zaman kullanılacağına ilişkin öneriler için bkz. Gerçek zamanlı operasyonel analiz için Columnstore ile çalışmaya başlama.

DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE

Belirtilen tablo, bölüm numarası veya bölüm aralığı için veri sıkıştırma seçeneğini belirtir. Seçenekler şunlardır:

  • COLUMNSTORE varsayılandır ve en performanslı columnstore sıkıştırmasıyla sıkıştırmayı belirtir. Bu seçenek tipik bir seçimdir.
  • COLUMNSTORE_ARCHIVE tabloyu veya bölümü daha küçük bir boyuta sıkıştırır. Daha küçük bir depolama boyutu gerektiren ve depolama ve alma için daha fazla zaman ayırabilen arşivleme gibi durumlar için bu seçeneği kullanın.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( DATA_COMPRESSION = COLUMNSTORE_ARCHIVE );

Sıkıştırma hakkında daha fazla bilgi için bkz. Veri sıkıştırma.

ÇEVRİmİÇİ = [ON | KAPALI]
  • ON , dizinin yeni kopyası oluşturulurken columnstore dizininin çevrimiçi ve kullanılabilir durumda kaldığını belirtir.
  • OFF yeni kopya oluşturulurken dizinin kullanılamadığını belirtir.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( ONLINE = ON );

ON seçenekleri

Bu seçeneklerle, bölüm düzeni, belirli bir dosya grubu veya varsayılan dosya grubu gibi veri depolama seçeneklerini belirtebilirsiniz. AÇILDI seçeneği belirtilmezse, dizin mevcut tablonun ayarlar bölümünü veya dosya grubu ayarlarını kullanır.

partition_scheme_name ( column_name ) tablonun bölüm düzenini belirtir. Bölüm düzeni veritabanında zaten mevcut olmalıdır. Bölüm düzenini oluşturmak için bkz . CREATE PARTITION SCHEME (Transact-SQL).

column_name bölümlenmiş dizinin bölümlendiği sütunu belirtir. Bu sütun, partition_scheme_name'nin kullandığı bölüm işlevinin bağımsız değişkeninin veri türü, uzunluğu ve duyarlığıyla eşleşmelidir.

filegroup_name kümelenmiş columnstore dizinini depolamak için dosya grubunu belirtir. Konum belirtilmezse ve tablo bölümlenmemişse, dizin temel tablo veya görünümle aynı dosya grubunu kullanır. Dosya grubu zaten var olmalıdır.

Dizini varsayılan dosya grubunda oluşturmak için veya "default"kullanın[default]. belirtirseniz "default", QUOTED_IDENTIFIER seçeneği geçerli oturum için olmalıdır ON . QUOTED_IDENTIFIER varsayılan değerdir ON . Daha fazla bilgi için bkz. SET QUOTED_IDENTIFIER (Transact-SQL).

CREATE [NONCLUSTERED] COLUMNSTORE INDEX

Yığın veya kümelenmiş dizin olarak depolanan bir satır deposu tablosunda kümelenmemiş sütun deposu dizini oluşturun. Dizin filtrelenmiş bir koşula sahip olabilir ve temel alınan tablonun tüm sütunlarını içermesi gerekmez. Columnstore dizini, verilerin bir kopyasını depolamak için yeterli alan gerektirir. Dizini güncelleştirebilirsiniz ve temel tablo değiştikçe güncelleştirilir. Kümelenmiş bir dizindeki kümelenmemiş columnstore dizini gerçek zamanlı analiz sağlar.

index_name

Dizinin adını belirtir. index_name tablo içinde benzersiz olmalıdır, ancak veritabanında benzersiz olması gerekmez. Dizin adları tanımlayıcıların kurallarına uymalıdır.

( sütun [ ,... n ] )

Depoya alınacak sütunları belirtir. Kümelenmemiş columnstore dizini 1.024 sütunla sınırlıdır.

Her sütun, columnstore dizinleri için desteklenen bir veri türünde olmalıdır. Desteklenen veri türlerinin listesi için bkz. Sınırlamalar ve kısıtlamalar .

ON [ database_name. [ schema_name ] . | schema_name . ] table_name

Dizini içeren tablonun bir, iki veya üç bölümlü adını belirtir.

Kümelenmemiş columnstore için ORDER

Kümelenmemiş columnstore dizini için yan tümcesinde ORDER belirtilen sütunlar, dizin için anahtar sütunların bir alt kümesi olmalıdır.

column_store_order_ordinal sütununu, kümelenmemiş columnstore dizini için sütunların sırasını belirlemek için kullanın. Columnstore sıralama, özellikle dize verileriyle segment ortadan kaldırmaya yardımcı olur. Daha fazla bilgi için bkz. Sıralı columnstore dizinleriyle performans ayarlama ve Columnstore dizinleri - Tasarım kılavuzu. Bu makalelerdeki tasarım ve performans konuları genellikle hem kümelenmiş hem de kümelenmemiş columnstore dizinleri için geçerlidir.

LOB veri türleri (maksimum) uzunluklu veri türleri, sıralı bir kümelenmemiş columnstore dizininin anahtarı olamaz.

Sıralı bir kümelenmemiş columnstore dizini oluştururken, deyiminin MAXDOP = 1 çok daha uzun bir süresi CREATE INDEX karşılığında en yüksek kaliteli sıralama seçeneklerini kullanın. Dizini mümkün olan en hızlı şekilde oluşturmak için sınırlamayın MAXDOP. En yüksek sıkıştırma ve sıralama kalitesi columnstore dizinindeki sorgulara yardımcı olabilir.

Sıralı columnstore dizini kullanılabilirliği için bkz. Sıralı columnstore dizini kullanılabilirliği.

WITH seçenekleri

DROP_EXISTING = [KAPALI] | ÜZERİNDE

DROP_EXISTING = ON Mevcut dizin bırakılır ve yeniden oluşturulur. Belirtilen dizin adı şu anda var olan bir dizinle aynı olmalıdır; ancak dizin tanımı değiştirilebilir. Örneğin, farklı sütunlar veya dizin seçenekleri belirtebilirsiniz.

DROP_EXISTING = KAPALI
Belirtilen dizin adı zaten varsa bir hata gösterilir. Dizin türü DROP_EXISTING kullanılarak değiştirilemez. Geriye dönük uyumlu söz diziminde, WITH DROP_EXISTING, WITH DROP_EXISTING = ON ile eşdeğerdir.

MAXDOP = max_degree_of_parallelism

Dizin işlemi sırasında Sunucu yapılandırmasını geçersiz kılar: en yüksek paralellik derecesi yapılandırma seçeneği. Paralel plan yürütmesinde kullanılan işlemci sayısını sınırlamak için MAXDOP kullanın. Maksimum değer 64 işlemcidir.

max_degree_of_parallelism değerler:

  • 1, paralel plan oluşturmayı gizleme anlamına gelir.
  • >1, paralel dizin işleminde kullanılan en fazla işlemci sayısını geçerli sistem iş yüküne göre belirtilen sayıda veya daha az işlemciyle kısıtlamak anlamına gelir. Örneğin, MAXDOP = 4 olduğunda, kullanılan işlemci sayısı 4 veya daha azdır.
  • 0 (varsayılan), geçerli sistem iş yüküne göre gerçek işlemci sayısını veya daha azını kullanmak anlamına gelir.

Daha fazla bilgi için bkz. Paralel Dizin İşlemlerini Yapılandırma.

Uyarı

Paralel dizin işlemleri Microsoft SQL Server'ın her sürümünde kullanılamaz. SQL Server sürümleri tarafından desteklenen özelliklerin listesi için bkz. Sürümleri ve SQL Server 2022'nin desteklenen özellikleri.

ÇEVRİmİÇİ = [ON | KAPALI]
  • ON , dizinin yeni kopyası oluşturulurken columnstore dizininin çevrimiçi ve kullanılabilir durumda kaldığını belirtir.
  • OFF yeni kopya oluşturulurken dizinin kullanılamadığını belirtir. Kümelenmemiş bir dizinde temel tablo kullanılabilir durumda kalır. Yeni dizin tamamlanana kadar sorguları karşılamak için yalnızca kümelenmemiş columnstore dizini kullanılmaz.
CREATE COLUMNSTORE INDEX ncci ON Sales.OrderLines (StockItemID, Quantity, UnitPrice, TaxRate)
WITH ( ONLINE = ON );
COMPRESSION_DELAY = 0 | delay [ DAKİkA ]

Bir satırın, sıkıştırılmış bir satır grubuna geçiş için uygun olmadan önce delta satır grubunda ne kadar süre kalması gerektiğine ilişkin alt sınırı belirtir. Örneğin, bir satır 120 dakika boyunca değişmediyse, bu satırın sütunlu depolama biçimine sıkıştırılmaya uygun olduğunu söyleyebilirsiniz.

Disk tabanlı tablolardaki bir columnstore dizini için, satırın eklendiği veya güncelleştirildiği zaman izlenmez. Bunun yerine, delta satır grubu kapalı saati satır için ara sunucu olarak kullanılır. Varsayılan süre 0 dakikadır. Delta satır grubunda 1 milyon satır biriktiklerinde satır sütunlu depolamaya geçirilir ve kapalı olarak işaretlenir.

VERİ_SIKIŞTIRMA

Belirtilen tablo, bölüm numarası veya bölüm aralığı için veri sıkıştırma seçeneğini belirtir. Hem kümelenmemiş hem de kümelenmiş dahil olmak üzere yalnızca columnstore dizinleri için geçerlidir. Seçenekler şunlardır:

  • COLUMNSTORE varsayılandır ve en performanslı columnstore sıkıştırmasıyla sıkıştırmayı belirtir. Bu seçenek tipik bir seçimdir.
  • COLUMNSTORE_ARCHIVE tabloyu veya bölümü daha küçük bir boyuta sıkıştırır. Arşivleme için veya daha küçük bir depolama boyutu gerektiren ve depolama ve alma için daha fazla zaman ayırabilen diğer durumlarda bu seçeneği kullanabilirsiniz.

Sıkıştırma hakkında daha fazla bilgi için bkz. Veri sıkıştırma.

WHERE <filter_expression> [ AND <filter_expression> ]

Filtre koşulu olarak adlandırılan bu seçenek, dizine eklenecek satırları belirtir. SQL Server, filtrelenmiş dizindeki veri satırlarında filtrelenmiş istatistikler oluşturur.

Filtre koşulu basit karşılaştırma mantığı kullanır. Karşılaştırma işleçleriyle değişmez değerleri kullanan NULL karşılaştırmalara izin verilmez. IS NULL Bunun yerine ve IS NOT NULL işleçlerini kullanın.

Tablo için filtre koşullarının bazı örnekleri aşağıda verilmiştir Production.BillOfMaterials :

  • WHERE StartDate > '20000101' AND EndDate <= '20000630'
  • WHERE ComponentID IN (533, 324, 753)
  • WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

Filtrelenmiş dizinler hakkında yönergeler için bkz. Filtrelenmiş dizinler oluşturma.

ON seçenekleri

Aşağıdaki seçenekler dizinin oluşturulduğu dosya gruplarını belirtir.

partition_scheme_name ( column_name )

Bölümlenmiş dizinin bölümlerinin eşlendiği dosya gruplarını tanımlayan bölüm düzenini belirtir. Bölüm düzeni , CREATE PARTITION SCHEME yürütülerek veritabanında bulunmalıdır.

column_name bölümlenmiş dizinin bölümlendiği sütunu belirtir. Bu sütun, partition_scheme_name'nin kullandığı bölüm işlevinin bağımsız değişkeninin veri türü, uzunluğu ve duyarlığıyla eşleşmelidir. column_name dizin tanımındaki sütunlarda sınırlı değildir. Bir columnstore dizinini bölümlerken, Veritabanı Altyapısı bölümleme sütununu henüz belirtilmemişse dizinin sütunu olarak ekler.

Tablo bölümlenmişse ve partition_scheme_name veya dosya grubu belirtilmemişse, dizin aynı bölüm düzenine yerleştirilir ve temel tabloyla aynı bölümleme sütununu kullanır.

Bölümlenmiş bir tablodaki columnstore dizininin bölüme hizalanmış olması gerekir. Dizinleri bölümleme hakkında daha fazla bilgi için bkz . Bölümlenmiş tablolar ve dizinler.

filegroup_name

Dizinin oluşturulacağı dosya grubu adını belirtir. filegroup_name belirtilmezse ve tablo bölümlenmemişse, dizin temel tabloyla aynı dosya grubunu kullanır. Dosya grubu zaten var olmalıdır.

"varsayılan"

Varsayılan dosya grubunda belirtilen dizini oluşturur.

Bu bağlamda varsayılan terimi bir anahtar sözcük değildir. Varsayılan dosya grubu için bir tanımlayıcıdır ve veya ON "default"içinde ON [default] olduğu gibi sınırlandırılmalıdır. Belirtilirse "default" , geçerli oturum için varsayılan ayar olan QUOTED_IDENTIFIER seçeneği ON olmalıdır. Daha fazla bilgi için bkz. SET QUOTED_IDENTIFIER.

İzinler

Tabloda değişiklik yapmak için ALTER izni gereklidir.

Açıklamalar

Geçici bir tabloda columnstore dizini oluşturabilirsiniz. Tablo bırakıldığında veya oturum sona erdiğinde dizin de bırakılır.

Fabric SQL veritabanında, kümelenmiş columnstore dizinlerine sahip tablolar Fabric OneLake'e yansıtılmaz.

Filtrelenmiş dizinler

Filtrelenmiş dizin, bir tablodan küçük bir satır yüzdesi seçen sorgular için uygun, iyileştirilmiş, kümelenmemiş bir dizindir. Tablodaki verilerin bir kısmını dizine almak için bir filtre koşulu kullanır. İyi tasarlanmış bir filtrelenmiş dizin sorgu performansını artırabilir, depolama maliyetlerini azaltabilir ve bakım maliyetlerini azaltabilir.

Filtrelenmiş dizinler için gerekli SET seçenekleri

Aşağıdaki koşullardan herhangi biri oluştuğunda gerekli değer sütunundaki SET seçenekleri gereklidir:

  • Filtrelenmiş bir dizin oluşturursunuz.
  • INSERT, UPDATE, DELETE veya MERGE işlemi filtrelenmiş bir dizindeki verileri değiştirir.
  • Sorgu iyileştiricisi, sorgu planını oluşturmak için filtrelenmiş dizini kullanır.
SET seçenekleri Gerekli değer Varsayılan sunucu değeri Varsayılan OLE DB ve ODBC değeri Varsayılan DB-Library değeri
ANSI_NULLS (ANSI NULL Değerleri Ayarları) AÇIK AÇIK AÇIK KAPALI
ANSI_PADDING AÇIK AÇIK AÇIK KAPALI
ANSI_WARNINGS 1 AÇIK AÇIK AÇIK KAPALI
ARITHABORT AÇIK AÇIK KAPALI KAPALI
CONCAT_NULL_YIELDS_NULL (Boş değerler birleştirildiğinde boş değer döner) AÇIK AÇIK AÇIK KAPALI
SAYISAL_YUVARLAMADURDUR KAPALI KAPALI KAPALI KAPALI
TIRNAKLI_BELİRLEYİCİ AÇIK AÇIK AÇIK KAPALI

1 veritabanı uyumluluk düzeyi 90 veya üzeri olarak ayarlandığında ANSI_WARNINGS ON olarak ayarlanması, ARITHABORT'ı örtük olarak ON olarak ayarlar. Veritabanı uyumluluk düzeyi 80 veya daha eski bir değere ayarlanmışsa, ARITHABORT seçeneğini açıkça AÇIK olarak ayarlamanız gerekir.

SET seçenekleri yanlışsa aşağıdaki koşullar oluşabilir:

  • Filtrelenmiş dizin oluşturulmaz.

  • Veritabanı Altyapısı bir hata oluşturur ve dizindeki verileri değiştiren INSERT, UPDATE, DELETE veya MERGE deyimlerini geri alır.

  • Sorgu iyileştiricisi, Transact-SQL deyimleri için yürütme planındaki dizini dikkate almaz.

Filtrelenmiş dizinler hakkında daha fazla bilgi için bkz. Filtrelenmiş dizinler oluşturma.

Sınırlamalar ve kısıtlamalar

Columnstore dizinindeki her sütun aşağıdaki yaygın iş veri türlerinden birinde olmalıdır:

  • datetimeoffset [ ( n ) ]
  • datetime2 [ ( n ) ]
  • tarih ve saat
  • smalldatetime
  • tarih
  • time [ ( n ) ]
  • float [ ( n ) ]
  • real [ ( n ) ]
  • decimal [ ( duyarlık [ , ölçek ] ) ]
  • numeric [ ( precision [ , scale ] ) ]
  • para
  • küçük para
  • büyük
  • 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 Yalnızca kümelenmiş columnstore dizinlerindeki SQL Server 2017 (14.x) ve Premium katmanında Azure SQL Veritabanı, Standart katman (S3 ve üzeri) ve tüm sanal çekirdek teklifleri katmanları için geçerlidir.

2 SQL Server 2014 (12.x) ve sonraki sürümler için geçerlidir.

Temel alınan tabloda sütun deposu dizinleri için desteklenmeyen bir veri türü sütunu varsa, bu sütunu kümelenmemiş columnstore dizininden atlamalısınız.

8 kilobayttan büyük büyük nesne (LOB) verileri, yalnızca sütun kesiminde depolanan fiziksel konumu gösteren bir işaretçiyle satır dışı, LOB depolama alanında depolanır. Depolanan verilerin boyutu sys.column_store_segments, sys.column_store_dictionaries veya sys.dm_db_column_store_row_group_physical_stats raporlanmaz.

Aşağıdaki veri türlerinden herhangi birini kullanan sütunlar columnstore dizinine eklenemez:

  • ntext, text ve image
  • nvarchar(max), varchar(max)ve varbinary(max)1
  • rowversion (ve zaman damgası)
  • sql_variant
  • CLR türleri (hiyerarşi kimliği ve uzamsal türler)
  • XML
  • uniqueidentifier2

1 SQL Server 2016 (13.x) ve önceki sürümler ve kümelenmemiş columnstore dizinleri için geçerlidir.

2 SQL Server 2012 (11.x) için geçerlidir.

Kümelenmemiş columnstore dizinleri:

  • 1.024'ten fazla sütun olamaz.
  • Kısıtlama tabanlı dizin olarak oluşturulamaz. Columnstore dizini olan bir tabloda benzersiz kısıtlamalara, birincil anahtar kısıtlamalarına ve yabancı anahtar kısıtlamalarına sahip olmak mümkündür. Kısıtlamalar her zaman bir satır deposu diziniyle zorlanır. Kısıtlamalar bir columnstore (kümelenmiş veya kümelenmemiş) diziniyle zorlanamaz.
  • Seyrek sütun eklenemez.
  • ALTER INDEX deyimi kullanılarak değiştirilemez. Kümelenmemiş dizini değiştirmek için, bunun yerine columnstore dizinini bırakmanız ve yeniden oluşturmanız gerekir. BIR columnstore dizinini devre dışı bırakmak ve yeniden oluşturmak için ALTER INDEX kullanabilirsiniz.
  • INCLUDE anahtar sözcüğü kullanılarak oluşturulamaz.
  • Dizin sütunları listesinde veya ASC anahtar sözcükleri belirtemezDESC. Columnstore dizinleri sıkıştırma algoritmalarına göre sıralanır.
  • Azure SQL Veritabanı'nda Microsoft Fabric'teki SQL veritabanı, Azure SQL Yönetilen ÖrneğiAUTD ve SQL Server 2025 (17.x) Önizlemesi yan tümcesi ORDER dahil edilerek sıralanabilir. Daha fazla bilgi için bkz. Sıralı columnstore dizinleriyle performans ayarlama.
  • Nvarchar(max), varchar(max)ve varbinary(max) türünde LOB sütunları, kümelenmemiş columnstore dizinlerine eklenemez. YALNıZCA kümelenmiş columnstore dizinleri SQL Server 2017 (14.x) sürümünden, Azure SQL Veritabanı'nda (Premium katmanında, Standart katmanda (S3 ve üzeri) ve tüm sanal çekirdek teklifleri katmanlarından başlayarak LOB türlerini destekler. Önceki sürümler kümelenmiş ve kümelenmemiş columnstore dizinlerindeki LOB türlerini desteklemez.
  • SQL Server 2016'dan (13.x) başlayarak, dizinli bir görünümde kümelenmemiş bir columnstore dizini oluşturabilirsiniz.

Columnstore dizinleri aşağıdaki özelliklerle birleştirilemiyor:

  • Hesaplanan sütunlar. SQL Server 2017'den (14.x) başlayarak, kümelenmiş columnstore dizini kalıcı olmayan bir hesaplanmış sütun içerebilir. Ancak SQL Server 2017'de (14.x) kümelenmiş columnstore dizinleri kalıcı hesaplanan sütunlar içeremez ve hesaplanan sütunlarda kümelenmemiş dizinler oluşturamazsınız.
  • Sayfa ve satır sıkıştırma ve vardecimal depolama biçimi. (Columnstore dizini zaten farklı bir biçimde sıkıştırılmış.)
  • Kümelenmiş columnstore dizinleriyle çoğaltma. Kümelenmemiş columnstore dizinleri desteklenir. Daha fazla bilgi için bkz. sp_addarticle.
  • Dosya akışı.

Kümelenmiş columnstore dizini olan bir tabloda imleçleri veya tetikleyicileri kullanamazsınız. Bu kısıtlama, kümelenmemiş columnstore dizinleri için geçerli değildir. Kümelenmemiş columnstore dizini olan bir tabloda imleçleri ve tetikleyicileri kullanabilirsiniz.

SQL Server 2014 (12.x) özel sınırlamaları:

Aşağıdaki sınırlamalar yalnızca SQL Server 2014 (12.x) için geçerlidir. Bu sürümde güncelleştirilebilir, kümelenmiş columnstore dizinlerini kullanabilirsiniz. Kümelenmemiş columnstore dizinleri hala salt okunur durumdadır.

  • Değişiklik izleme. Değişiklik izlemeyi columnstore dizinleriyle kullanamazsınız.
  • Veri yakalamayı değiştirme. Bu özellik, kümelenmiş columnstore dizini olan tablolarda etkinleştirilemiyor. SQL Server 2016'dan (13.x) başlayarak, kümelenmemiş columnstore dizini olan tablolarda değişiklik verileri yakalama etkinleştirilebilir.
  • Okunabilir ikincil. Her Zaman Açık okunabilir kullanılabilirlik grubunun okunabilir bir ikincil bölümünden kümelenmiş columnstore dizinine (CCI) erişemezsiniz. Bir kümelenmemiş columnstore dizinine (NCCI) okunabilir bir ikincil dizinden erişebilirsiniz.
  • Birden çok Etkin Sonuç Kümesi (MARS). SQL Server 2014 (12.x), columnstore dizini olan tablolara salt okunur bağlantılar için bu özelliği kullanır. Ancak SQL Server 2014 (12.x), columnstore dizini olan bir tablodaki eşzamanlı veri işleme dili (DML) işlemleri için bu özelliği desteklemez. Bu özelliği bu amaçla kullanmaya çalışırsanız, SQL Server bağlantıları sonlandırır ve işlemleri iptal eder.
  • Kümelenmemiş columnstore dizinleri bir görünümde veya dizinlenmiş görünümde oluşturulamaz.

Columnstore dizinlerinin performans avantajları ve sınırlamaları hakkında bilgi için bkz. Columnstore dizinleri: Genel bakış.

Meta veriler

Bir columnstore dizinindeki tüm sütunlar meta verilerde dahil edilen sütunlar olarak depolanır. columnstore dizininde anahtar sütunlar yoktur. Aşağıdaki sistem görünümleri columnstore dizinleri hakkında bilgi sağlar:

Örnekler: tabloyu rowstore'dan columnstore'a dönüştürme

A. Yığını kümelenmiş columnstore dizinine dönüştürme

Bu örnek yığın olarak bir tablo oluşturur ve bunu adlı cci_Simplekümelenmiş columnstore dizinine dönüştürür. Kümelenmiş columnstore dizininin oluşturulması, tablonun tamamı için depolama alanını satır deposundan columnstore'a değiştirir.

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. Kümelenmiş dizini aynı ada sahip kümelenmiş columnstore dizinine dönüştürme

Bu örnek, kümelenmiş dizine sahip bir tablo oluşturur ve kümelenmiş dizini kümelenmiş columnstore dizinine dönüştürme söz dizimini gösterir. Kümelenmiş columnstore dizininin oluşturulması, tablonun tamamı için depolama alanını satır deposundan columnstore'a değiştirir.

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. Bir rowstore tablosunu columnstore dizinine dönüştürürken kümelenmemiş dizinleri işleme

Bu örnekte, bir satır deposu tablosunu columnstore dizinine dönüştürdüğünüzde, kümelenmemiş dizinlerin nasıl işlendiği gösterilmektedir. SQL Server 2016(13.x) sürümünden itibaren özel bir eylem gerekmez. SQL Server, kümelenmiş yeni columnstore dizinindeki kümelenmemiş dizinleri otomatik olarak tanımlar ve yeniden oluşturur.

Kümelenmemiş dizinleri bırakmak istiyorsanız, columnstore dizinini oluşturmadan önce DROP INDEX deyimini kullanın. DROP EXISTING seçeneği yalnızca dönüştürülmekte olan kümelenmiş dizini bırakır. Kümelenmemiş dizinleri bırakmaz.

SQL Server 2012 (11.x) ve SQL Server 2014'te (12.x), columnstore dizininde kümelenmemiş dizin oluşturamazsınız.

--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

Yalnızca SQL Server 2012 (11.x) ve SQL Server 2014 (12.x) için columnstore dizinini oluşturmak için kümelenmemiş dizinleri bırakmanız gerekir.

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. Büyük bir olgu tablosunu rowstore'dan columnstore'a dönüştürme

Bu örnekte, büyük bir olgu tablosunun satır deposu tablosundan columnstore tablosuna nasıl dönüştürüldüğü açıklanmaktadır.

  1. Bu örnekte kullanmak için küçük bir tablo oluşturun.

    --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 );
    
  2. Tüm kümelenmemiş dizinleri rowstore tablosundan bırakın. Dizinleri daha sonra yeniden oluşturmak için betik oluşturmak isteyebilirsiniz.

    --Drop all nonclustered indexes
    DROP INDEX my_index ON dbo.MyFactTable;
    
  3. Rowstore tablosunu kümelenmiş columnstore dizini olan bir columnstore tablosuna dönüştürün.

    İlk olarak, mevcut kümelenmiş satır deposu dizininin adını arayın. 1. Adımda dizinin adını olarak IDX_CL_MyFactTableayarlayacağız. Dizin adı belirtilmemişse, otomatik olarak oluşturulan benzersiz bir dizin adı verilmiştir. Otomatik olarak oluşturulan adı aşağıdaki örnek sorguyla alabilirsiniz:

    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';
    

    1. Seçenek: Mevcut kümelenmiş dizini IDX_CL_MyFactTablebırakın ve columnstore'ya dönüştürün MyFactTable . Yeni kümelenmiş columnstore dizininin adını değiştirin.

    --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
    

    Seçenek 2: Columnstore'a dönüştürün ve mevcut satır deposu kümelenmiş dizin adını yeniden kullanın.

    --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. Columnstore tablosunu kümelenmiş dizine sahip bir rowstore tablosuna dönüştürme

Columnstore tablosunu kümelenmiş dizine sahip bir satır deposu tablosuna dönüştürmek için, DROP_EXISTING seçeneğiyle CREATE INDEX deyimini kullanın.

CREATE CLUSTERED INDEX [IDX_CL_MyFactTable]
ON dbo.[MyFactTable] ( ProductKey )
WITH ( DROP_EXISTING = ON );

F. Columnstore tablosunu rowstore yığınına dönüştürme

Bir columnstore tablosunu satır deposu yığınına dönüştürmek için kümelenmiş columnstore dizinini bırakın. Bu genellikle önerilmez, ancak bazılarının dar kullanımları olabilir. Yığınlar hakkında daha fazla bilgi için bkz. Yığınlar (kümelenmiş dizinleri olmayan tablolar).

DROP INDEX [IDX_CL_MyFactTable]
ON dbo.[MyFactTable];

G. columnstore dizinini yeniden düzenleyerek birleştirme

Kümelenmiş columnstore dizinini korumanın iki yolu vardır. SQL Server 2016(13.x) ile başlayarak REBUILD yerine kullanın ALTER INDEX...REORGANIZE . Daha fazla bilgi için bkz. Columnstore dizin satır grubu. SQL Server'ın önceki sürümlerinde CREATE CLUSTERED COLUMNSTORE INDEX komutunu DROP_EXISTING=ON veya ALTER INDEX (Transact-SQL) ve REBUILD seçeneğiyle kullanabilirsiniz. Her iki yöntem de aynı sonuçları elde etti.

içinde kümelenmiş columnstore dizin adını MyFactTablebelirleyerek başlayın.

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';

columnstore dizininde REORGANIZE gerçekleştirerek parçalanmayı kaldırın.

--Rebuild the entire index by using ALTER INDEX and the REBUILD option.
ALTER INDEX IDX_CL_MyFactTable
ON dbo.[MyFactTable]
REORGANIZE;

Kümelenmemiş columnstore dizinleri için örnekler

A. Rowstore tablosunda ikincil dizin olarak columnstore dizini oluşturma

Bu örnek, bir satır deposu tablosunda kümelenmemiş bir columnstore dizini oluşturur. Bu durumda yalnızca bir columnstore dizini oluşturulabilir. Columnstore dizini, rowstore tablosundaki verilerin bir kopyasını içerdiğinden ek depolama gerektirir. Bu örnek basit bir tablo ve bir satır deposu kümelenmiş dizini oluşturur ve ardından kümelenmemiş columnstore dizini oluşturma söz dizimini gösterir.

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. Tüm seçenekleri kullanarak temel bir kümelenmemiş columnstore dizini oluşturma

Aşağıdaki örnek, DEFAULT dosya grubunda en yüksek paralellik derecesini (MAXDOP) 2 olarak belirterek kümelenmemiş bir columnstore dizini oluşturma söz dizimini gösterir.

CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
ON SimpleTable (OrderDateKey, DueDateKey, ShipDateKey)
WITH (DROP_EXISTING =  ON,
    MAXDOP = 2)
ON "DEFAULT";
GO

C. Filtrelenmiş koşula sahip bir kümelenmemiş columnstore dizini oluşturma

Aşağıdaki örnek, örnek veritabanındaki tabloda Production.BillOfMaterials filtrelenmiş, kümelenmemiş bir columnstore dizini AdventureWorks2022 oluşturur. Filtre koşulu, filtrelenmiş dizinde anahtar sütun olmayan sütunlar içerebilir. Bu örnekteki koşul yalnızca NULL olmayan satırları EndDate seçer.

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. Kümelenmemiş columnstore dizinindeki verileri değiştirme

Şunlar için geçerlidir: SQL Server 2012 (11.x) ile SQL Server 2014 (12.x) arasında.

SQL Server 2014 (12.x) ve önceki sürümlerinde, bir tabloda kümelenmemiş bir columnstore dizini oluşturduktan sonra, bu tablodaki verileri doğrudan değiştiremezsiniz. INSERT, UPDATE, DELETE veya MERGE içeren bir sorgu başarısız olur ve bir hata iletisi döndürür. Tablodaki verileri eklemek veya değiştirmek için kullanabileceğiniz seçenekler şunlardır:

  • columnstore dizinini devre dışı bırakın veya bırakın. Ardından tablodaki verileri güncelleştirebilirsiniz. Columnstore dizinini devre dışı bırakırsanız, verileri güncelleştirmeyi bitirdiğinizde columnstore dizinini yeniden oluşturabilirsiniz. Örneğin:

    ALTER INDEX mycolumnstoreindex ON dbo.mytable DISABLE;
    
    -- update the data in mytable as necessary
    ALTER INDEX mycolumnstoreindex on dbo.mytable REBUILD;
    
  • Columnstore dizini olmayan bir hazırlama tablosuna veri yükleyin. Hazırlama tablosunda bir columnstore dizini oluşturun. Hazırlama tablosunu ana tablonun boş bir bölümüne geçin.

  • Columnstore dizini olan bir bölümü tablodan boş bir hazırlama tablosuna geçin. Hazırlama tablosunda bir columnstore dizini varsa columnstore dizinini devre dışı bırakın. Tüm güncelleştirmeleri gerçekleştirin. Columnstore dizinini derleyin (veya yeniden derleyin). Hazırlama tablosunu ana tablonun (şimdi boş) bölümüne geri getirin.

Örnekler: Azure Synapse Analytics, Analiz Platformu Sistemi (PDW)

A. Kümelenmiş dizini kümelenmiş columnstore diziniyle değiştirme

DROP_EXISTING = ON ile CREATE CLUSTERED COLUMNSTORE INDEX deyimini kullanarak şunları yapabilirsiniz:

  • Kümelenmiş dizini kümelenmiş columnstore dizini olarak değiştirin.

  • Kümelenmiş columnstore dizinini yeniden oluşturun.

Bu örnek, xDimProduct tabloyu kümelenmiş dizine sahip bir satır deposu tablosu olarak oluşturur. Daha sonra örnek, create CLUSTERED COLUMNSTORE INDEX işlevini kullanarak tabloyu bir rowstore tablosundan columnstore tablosuna dönüştürecek.

-- 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;

kullanarak sys.indexessistem meta verilerinde yeni tablo için otomatik olarak oluşturulan kümelenmiş dizinin adını arayın. Örneğin:

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';

Şimdi şunları seçebilirsiniz:

  1. Otomatik olarak oluşturulan bir adla mevcut kümelenmiş columnstore dizinini bırakın, ardından kullanıcı tanımlı bir adla yeni bir kümelenmiş columnstore dizini oluşturun.
  2. Mevcut dizini bırakın ve kümelenmiş columnstore diziniyle değiştirin ve gibi ClusteredIndex_1bd8af8797f7453182903cc68df48541sistem tarafından oluşturulan aynı adı koruyun.

Örneğin:

--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. Kümelenmiş columnstore dizinini yeniden oluşturma

Bu örnekte, önceki örnekte derlenmiş olarak adlandırılan cci_xDimProductmevcut kümelenmiş columnstore dizinini yeniden oluşturmak için CREATE CLUSTERED COLUMNSTORE INDEX kullanılmıştır.

--Rebuild the existing clustered columnstore index.
CREATE CLUSTERED COLUMNSTORE INDEX cci_xDimProduct
ON xdimProduct
WITH ( DROP_EXISTING = ON );

C. Kümelenmiş columnstore dizininin adını değiştirme

Kümelenmiş columnstore dizininin adını değiştirmek için, mevcut kümelenmiş columnstore dizinini bırakın ve dizini yeni bir adla yeniden oluşturun.

Bu işlemi küçük veya boş bir tabloyla sınırlamanızı öneririz. Büyük, kümelenmiş bir columnstore dizininin bırakılması ve farklı bir adla yeniden oluşturulması uzun zaman alır.

Bu örnek, önceki örnekteki cci_xDimProduct kümelenmiş columnstore dizinine başvurur. Bu örnek, kümelenmiş columnstore dizinini cci_xDimProduct bırakır ve ardından adlı mycci_xDimProductkümelenmiş columnstore dizinini yeniden oluşturur.

--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. Columnstore tablosunu kümelenmiş dizine sahip bir rowstore tablosuna dönüştürme

Kümelenmiş columnstore dizinini bırakmak ve kümelenmiş dizin oluşturmak istediğiniz bir durum olabilir. Kümelenmiş columnstore dizinini bıraktığınızda, tablo satır deposu biçimine değiştirilir. Bu örnek, bir columnstore tablosunu aynı ada sahip kümelenmiş dizine sahip bir rowstore tablosuna dönüştürür. Verilerin hiçbiri kaybolmaz. Tüm veriler rowstore tablosuna gider ve listelenen sütunlar kümelenmiş dizindeki anahtar sütunlar olur.

--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. Columnstore tablosunu yeniden satır deposu yığınına dönüştürme

DROP INDEX kullanarak kümelenmiş columnstore dizinini bırakın ve tabloyu bir satır deposu yığınına dönüştürün. Bu örnek, tabloyu bir satır deposu yığınına dönüştürür cci_xDimProduct . Tablo dağıtılmaya devam eder, ancak yığın olarak depolanır.

--Drop the clustered columnstore index. The table continues to be distributed, but changes to a heap.
DROP INDEX cci_xdimProduct ON xdimProduct;

F. Dizin içermeyen bir tabloda sıralı kümelenmiş columnstore dizini oluşturma

Sıralanmamış bir columnstore dizini, sütun listesi belirtmeye gerek kalmadan tüm sütunları varsayılan olarak kapsar. Sıralı columnstore dizini, sütunların sırasını belirtmenize olanak tanır. Listenin tüm sütunları içermesi gerekmez.

Daha fazla bilgi için bkz. Sıralı columnstore dizinleriyle performans ayarlama.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE);

G. Kümelenmiş columnstore dizinini sıralı kümelenmiş columnstore dizinine dönüştürme

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE)
WITH (DROP_EXISTING = ON);

H. Sıralı kümelenmiş columnstore dizininin sırasına sütun ekleme

Sütun deposu dizinindeki sütunlar için bir sıra belirtebilirsiniz. Özgün sıralı, kümelenmiş columnstore dizini yalnızca sütunda SHIPDATE sıralandı. Aşağıdaki örnek sütunu sıralamaya ekler PRODUCTKEY . Columnstore dizinlerinin erişilebilirliği için bkz. Columnstore dizinleri: Genel Bakış.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE, PRODUCTKEY)
WITH (DROP_EXISTING = ON);

Ben. Sıralı sütunların sıralısını değiştirme

Özgün sıralı, kümelenmiş columnstore dizini üzerinde SHIPDATEPRODUCTKEYsıralandı. Aşağıdaki örnek sıralamayı PRODUCTKEYolarak değiştirir. SHIPDATE Columnstore dizinlerinin erişilebilirliği için bkz. Columnstore dizinleri: Genel Bakış.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (PRODUCTKEY,SHIPDATE)
WITH (DROP_EXISTING = ON);

J. Sıralı kümelenmiş columnstore dizini oluşturma

Sıralama anahtarlarıyla kümelenmiş columnstore dizini oluşturabilirsiniz. Sıralı kümelenmiş columnstore dizini oluştururken en yüksek sıralama kalitesi ve en kısa süre için sorgu ipucunu MAXDOP = 1 uygulamanız gerekir. Columnstore dizinlerinin erişilebilirliği için bkz. Columnstore dizinleri: Genel Bakış.

CREATE CLUSTERED COLUMNSTORE INDEX [OrderedCCI] ON dbo.FactResellerSalesPartCategoryFull
ORDER (EnglishProductSubcategoryName, EnglishProductName)
WITH (MAXDOP = 1, DROP_EXISTING = ON);