Aracılığıyla paylaş


CREATE INDEX (Transact-SQL)

Şunlar için geçerlidir: Sql ServerAzure SQL VeritabanıAzure Synapse AnalyticsAnalytics Platform Sistemi (PDW)Azure SQL Veritabanı

Tablo veya görünümde ilişkisel dizin oluşturur. Kümelenmiş veya kümelenmemiş bir B ağacı dizini olduğundan satır deposu dizini olarak da adlandırılır. Tabloda veri olmadan önce bir satır deposu dizini oluşturabilirsiniz. Özellikle sorgular belirli sütunlardan seçim yaparken veya değerlerin belirli bir sırada sıralanması gerektiğinde sorgu performansını geliştirmek için bir rowstore dizini kullanın.

Not

Belgelerde genellikle dizinlere başvuruda B ağacı terimi kullanılır. Rowstore dizinlerinde Veritabanı Altyapısı bir B+ ağacı uygular. Bu, bellek için iyileştirilmiş tablolardaki columnstore dizinleri veya dizinleri için geçerli değildir. Daha fazla bilgi içinSQL Server ve Azure SQL dizin mimarisi ve tasarım kılavuzuna bakın.

Azure Synapse Analytics ve Analytics Platform Sistemi (PDW) şu anda benzersiz kısıtlamaları desteklememektedir. Benzersiz kısıtlamalara başvuran tüm örnekler yalnızca SQL Server, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği için geçerlidir.

Dizin tasarımı yönergeleri hakkında bilgi için SQL Server dizin tasarım kılavuzuna bakın.

Örnekleri:

  1. Tablo veya görünümde kümelenmemiş dizin oluşturma

    CREATE INDEX index1 ON schema1.table1 (column1);
    
  2. Tabloda kümelenmiş dizin oluşturma ve tablo için 3 parçalı bir ad kullanma

    CREATE CLUSTERED INDEX index1 ON database1.schema1.table1 (column1);
    
  3. Benzersiz bir kısıtlamaya sahip bir kümelenmemiş dizin oluşturma ve sıralama düzenini belirtme

    CREATE UNIQUE INDEX index1 ON schema1.table1 (column1 DESC, column2 ASC, column3 DESC);
    

Anahtar senaryosu:

SQL Server 2016'dan (13.x) başlayarak, Azure SQL Veritabanı'nda ve Azure SQL Yönetilen Örneği'nde veri ambarı sorgu performansını geliştirmek için columnstore dizininde kümelenmemiş dizin kullanabilirsiniz. Daha fazla bilgi için bkz. Columnstore dizinleri - veri ambarı.

Ek dizin türleri için bkz:

Transact-SQL söz dizimi kuralları

Sözdizimi

SQL Server, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği söz dizimi

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column [ ASC | DESC ] [ ,...n ] )
    [ INCLUDE ( column_name [ ,...n ] ) ]
    [ WHERE <filter_predicate> ]
    [ WITH ( <relational_index_option> [ ,...n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

[ ; ]

<object> ::=
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }

<relational_index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB = { ON | OFF }
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | STATISTICS_INCREMENTAL = { ON | OFF }
  | DROP_EXISTING = { ON | OFF }
  | ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }
  | RESUMABLE = { ON | OFF }
  | MAX_DURATION = <time> [MINUTES]
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE }
     [ ON PARTITIONS ( { <partition_number_expression> | <range> }
     [ , ...n ] ) ]
  | XML_COMPRESSION = { ON | OFF }
     [ ON PARTITIONS ( { <partition_number_expression> | <range> }
     [ , ...n ] ) ]
}

<filter_predicate> ::=
    <conjunct> [ AND ] [ ...n ]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant ,...n)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }

<low_priority_lock_wait>::=
{
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ] ,
                          ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}

<range> ::=
<partition_number_expression> TO <partition_number_expression>

Geriye dönük uyumlu ilişkisel dizin

Önemli

Geriye dönük uyumlu ilişkisel dizin söz dizimi yapısı, SQL Server'ın gelecekteki bir sürümünde kaldırılacaktır. Yeni geliştirme çalışmalarında bu söz dizimi yapısını kullanmaktan kaçının ve şu anda bu özelliği kullanan uygulamaları değiştirmeyi planlayın. Bunun yerine <relational_index_option>'de belirtilen söz dizimi yapısını kullanın.

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column_name [ ASC | DESC ] [ ,...n ] )
    [ WITH <backward_compatible_index_option> [ ,...n ] ]
    [ ON { filegroup_name | "default" } ]

<object> ::=
{
    [ database_name. [ owner_name ] . | owner_name. ]
    table_or_view_name
}

<backward_compatible_index_option> ::=
{
    PAD_INDEX
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB
  | IGNORE_DUP_KEY
  | STATISTICS_NORECOMPUTE
  | DROP_EXISTING
}

Azure Synapse Analytics ve Paralel Veri Ambarı söz dizimi


CREATE CLUSTERED COLUMNSTORE INDEX index_name
    ON [ database_name . [ schema ] . | schema . ] table_name
    [ORDER (column[,...n])]
    [WITH ( DROP_EXISTING = { ON | OFF } )]
[;]


CREATE [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON [ database_name . [ schema ] . | schema . ] table_name
        ( { column [ ASC | DESC ] } [ ,...n ] )
    WITH ( DROP_EXISTING = { ON | OFF } )
[;]

Bağımsız değişken

EŞSİZ

Tablo veya görünümde benzersiz bir dizin oluşturur. Benzersiz dizin, iki satırın aynı dizin anahtarı değerine sahip olmasına izin verilmeyen dizindir.

Veritabanı Altyapısı, olarak ayarlanıp ayarlanmadığı IGNORE_DUP_KEY fark etmeksizin, yinelenen değerler içeren sütunlarda benzersiz bir dizin oluşturulmasına ONizin vermez. Bu denenirse, Veritabanı Altyapısı bir hata iletisi görüntüler. Sütun veya sütunlarda benzersiz bir dizin oluşturulabilmesi için önce yinelenen değerlerin kaldırılması gerekir.

Kısıtlama UNIQUE bir değer olarak ele alır NULL . Sütun null atanabilirse ve sütunda bir UNIQUE kısıtlama varsa, en fazla bir NULL satıra izin verilir.

KÜMELENMİŞ

Dizin anahtarı sütunları için belirtilen sıralama düzeninin diskteki dizin yapısındaki sayfa düzenini belirlediği bir dizin oluşturur. Kümelenmiş dizinin alt veya yaprak düzeyindeki sayfalardaki satırlar her zaman tablonun tüm sütunlarını içerir. Dizinin üst düzeylerindeki sayfalardaki satırlar yalnızca anahtar sütunları içerir.

Bir tabloda yalnızca bir kümelenmiş dizin olabilir. Bir tabloda kümelenmiş dizin varsa, tablodaki tüm verileri içerir. Kümelenmiş dizini olmayan bir tablo yığın olarak adlandırılır.

Benzersiz kümelenmiş dizine sahip görünüme dizinli görünüm adı verilir. Dizine alınan bir görünümde yalnızca bir kümelenmiş dizin olabilir. Görünümde benzersiz bir kümelenmiş dizin oluşturmak görünümü fiziksel olarak gerçekleştirir. Diğer dizinlerin aynı görünümde tanımlanabilmesi için önce görünümde benzersiz bir kümelenmiş dizin oluşturulmalıdır. Daha fazla bilgi için bkz. Dizinli görünümler oluşturma.

Kümelenmemiş dizinler oluşturmadan önce kümelenmiş dizini oluşturun. Tablolardaki mevcut kümelenmemiş dizinler, kümelenmiş dizin oluşturulduğunda yeniden oluşturulur ve bu da tablo büyükse yoğun kaynak gerektiren bir işlemdir.

CLUSTERED belirtilmezse, kümelenmemiş bir dizin oluşturulur.

Not

Kümelenmiş dizin tablodaki tüm verileri içerdiğinden, kümelenmiş dizin oluşturma ve or ON filegroup_name yan tümcesini kullanmaON partition_scheme_name, tabloyu, tablonun oluşturulduğu dosya grubundan yeni bölüm düzenine veya dosya grubuna etkili bir şekilde taşır. Belirli dosya gruplarında tablo veya dizin oluşturmadan önce, hangi dosya gruplarının kullanılabilir olduğunu ve dizin için yeterli boş alana sahip olduklarını doğrulayın.

Bazı durumlarda, kümelenmiş dizin oluşturmak daha önce devre dışı bırakılmış dizinleri etkinleştirebilir. Daha fazla bilgi için bkz . Dizinleri ve kısıtlamaları etkinleştirme ve Dizinlerive kısıtlamaları devre dışı bırakma.

KÜMELENMİDİ

Dizin anahtarı sütunları için belirtilen sıralama düzeninin diskteki dizin yapısındaki sayfa düzenini belirlediği bir dizin oluşturur. Kümelenmiş dizinin aksine, kümelenmemiş dizinin yaprak düzeyindeki sayfalardaki satırlar yalnızca dizin anahtarı sütunlarını içerir. İsteğe bağlı olarak, anahtar olmayan sütunların bir alt kümesi yan tümcesi INCLUDE kullanılarak eklenebilir.

Dizinlerin nasıl oluşturulduğundan bağımsız olarak her tabloda 999'a kadar kümelenmemiş dizin olabilir: örtük olarak ve UNIQUE kısıtlamalarıyla PRIMARY KEY veya açıkça ile.CREATE INDEX

Dizinli görünümler için, kümelenmemiş dizinler yalnızca önceden tanımlanmış benzersiz kümelenmiş dizine sahip bir görünümde oluşturulabilir.

Aksi belirtilmediyse, varsayılan dizin türü kümelenmemiştir.

index_name

Dizinin adı. Dizin adlarının bir tablo veya görünüm içinde benzersiz olması gerekir, ancak veritabanında benzersiz olması gerekmez. Dizin adlarıtanımlayıcılarının kurallarına uymalıdır.

sütun

Dizinin temel aldığı sütun veya sütunlar. Belirtilen sütunlardaki birleştirilmiş değerlerde bileşik dizin oluşturmak için iki veya daha fazla sütun adı belirtin. bileşik dizine eklenecek sütunları sıralama önceliği düzeninde, table_or_view_namesonra parantez içinde listeleyin.

En fazla 32 sütun tek bir bileşik dizin anahtarında birleştirilebilir. Bileşik dizin anahtarındaki tüm sütunlar aynı tablo veya görünümde olmalıdır. Birleştirilmiş dizin değerlerinin izin verilen en büyük boyutu kümelenmiş dizin için 900 bayt veya kümelenmemiş dizin için 1.700'dür. Sınırlar, SQL Veritabanı ve SQL Server 2016 (13.x) öncesi sürümler için 16 sütun ve 900 bayttır.

ntext, metin, varchar(max), nvarchar(max), varbinary(max), xmlveya resim sütunlardan oluşan sütunlar dizin için anahtar sütunlar olarak belirtemez. Ayrıca, dizinli görünüm tanımı deyiminde CREATE INDEX başvurulmuyor olsa bile ntext, metin veya görüntü sütunları içeremez.

Tür ikili sıralamayı destekliyorsa CLR kullanıcı tanımlı tür sütunlarında dizinler oluşturabilirsiniz. Yöntemler belirleyici olarak işaretlendiğinden ve veri erişim işlemleri gerçekleştirmediği sürece, kullanıcı tanımlı bir tür sütunundan yöntem çağrıları olarak tanımlanan hesaplanan sütunlarda dizinler de oluşturabilirsiniz. CLR kullanıcı tanımlı tür sütunlarının dizinini oluşturma hakkında daha fazla bilgi için bkz. CLR kullanıcı tanımlı türler.

[ ASC | DESC ]

Belirli bir dizin sütunu için artan veya azalan sıralama yönünü belirler. Varsayılan değer: ASC.

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

Kümelenmemiş dizinin yaprak düzeyine eklenecek anahtar olmayan sütunları belirtir. Kümelenmemiş dizin benzersiz veya benzersiz olmayabilir.

Sütun adları listede tekrarlanamaz INCLUDE ve hem anahtar hem de anahtar olmayan sütunlar olarak aynı anda kullanılamaz. Tabloda kümelenmiş bir dizin tanımlanmışsa, kümelenmemiş dizinler her zaman örtük olarak kümelenmiş dizin sütunlarını içerir. Daha fazla bilgi için bkz. Eklenen sütunlarla dizin oluşturma.

metin, ntextve resimdışında tüm veri türlerine izin verilir. SQL Server 2012'den (11.x) başlayarak, Azure SQL Veritabanı'nda ve Azure SQL Yönetilen Örneği'nde, belirtilen anahtar olmayan sütunlardan herhangi biri varchar(max), nvarchar(max)veya varbinary(max) veri türleriyse dizin, seçeneği kullanılarak ONLINE oluşturulabilir veya yeniden oluşturulabilir.

Belirleyici ve kesin veya kesin olmayan hesaplanan sütunlar dahil edilebilir. Hesaplanmış sütun veri türü dahil edilen sütun olarak izin verebildiği sürece görüntü, ntext, metin, varchar(max), nvarchar(max), varbinary(max)ve xml veri türlerinden türetilen hesaplanan sütunlar eklenebilir. Daha fazla bilgi için bkz. Hesaplanan sütunlardaki dizinler.

XML dizini oluşturma hakkında bilgi için bkz. CREATE XML INDEX.

WHERE <filter_predicate>

Dizine hangi satırların dahilleneceğini belirterek filtrelenmiş bir dizin oluşturur. Filtrelenen dizin, tablodaki kümelenmemiş bir dizin olmalıdır. Filtrelenmiş dizindeki veri satırları için filtrelenmiş istatistikler oluşturur.

Filtre koşulu basit karşılaştırma mantığı kullanır ve hesaplanan sütuna, kullanıcı tanımlı veri türü (UDT) sütununa, uzamsal veri türü sütununa veya hierarchyid veri türü sütununa başvuramaz. Karşılaştırma işleçlerini kullanan değişmez değerlerle NULL karşılaştırmalara izin verilmez. Bunun yerine IS NULL ve IS NOT NULL işleçlerini kullanın.

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

WHERE StartDate > '20000101' AND EndDate <= '20000630'

WHERE ComponentID IN (533, 324, 753)

WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

Filtrelenmiş dizinler XML dizinlerine ve tam metin dizinlerine uygulanmaz. Dizinler için UNIQUE yalnızca seçili satırların benzersiz dizin değerleri olmalıdır. Filtrelenmiş dizinler IGNORE_DUP_KEY seçeneğine izin vermez.

ON 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 veya ALTER PARTITION SCHEMEyürüterek veritabanında bulunmalıdır. column_name dizinin bölümleme sütununu 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. Temel tablodaki herhangi bir sütun belirtilebilir, ancak benzersiz bir dizini bölümleme dışında, benzersiz anahtar olarak kullanılanlar arasından column_name seçilmelidir. Bu kısıtlama, Veritabanı Altyapısı'nın yalnızca tek bir bölümdeki anahtar değerlerinin benzersizliğini doğrulamasını sağlar.

Not

Benzersiz olmayan, kümelenmiş bir dizini bölümlediğinizde, Veritabanı Altyapısı varsayılan olarak bölümleme sütununu kümelenmiş dizin anahtarları listesine (henüz belirtilmemişse) ekler. Benzersiz olmayan, kümelenmemiş bir dizini bölümlerken, Veritabanı Altyapısı bölümleme sütununu henüz belirtilmemişse dizinin anahtar olmayan (dahil) sütunu olarak ekler.

partition_scheme_name veya dosya grubu belirtilmezse ve tablo bölümlenmişse dizin, temel alınan tabloyla aynı bölümleme sütunu kullanılarak aynı bölümleme düzenine yerleştirilir.

Not

XML dizininde bölümleme düzeni belirtemezsiniz. Temel tablo bölümlenmişse, XML dizini tabloyla aynı bölüm düzenini kullanır.

Dizinleri bölümleme, Bölümlenmiş tablolar ve dizinler hakkında daha fazla bilgi için.

ON filegroup_name

Belirtilen dosya grubunda belirtilen dizini oluşturur. Konum belirtilmezse ve tablo veya görünüm bölümlenmemişse, dizin temel tablo veya görünümle aynı dosya grubunu kullanır. Dosya grubu zaten var olmalıdır.

ON [default]

Tablo veya görünümle aynı dosya grubunda veya bölüm düzeninde belirtilen dizini oluşturur.

Bu bağlamda terimi defaultbir anahtar sözcük değildir. Tablo veya görünümün dosya grubu veya bölümlenmiş düzeni 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" , QUOTED_IDENTIFIER seçeneği geçerli oturum için olmalıdır ON . Bu varsayılan ayardır. Daha fazla bilgi için bkz. set QUOTED_IDENTIFIER.

Not

bağlamında CREATE INDEX"default" ve [default] veritabanı varsayılan dosya grubunu belirtmeyin. Temel tablo veya görünüm tarafından kullanılan dosya grubunu veya bölüm düzenini belirtir. Bu, tablosundan CREATE TABLEfarklıdır ve [default] tabloyu veritabanı varsayılan dosya grubuna yerleştirir"default".

[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

Kümelenmiş dizin oluşturulduğunda tablo için FILESTREAM verilerinin yerleşimini belirtir. FILESTREAM_ON yan tümcesi, FILESTREAM verilerinin farklı bir FILESTREAM dosya grubuna veya bölüm düzenine taşınmasını sağlar.

filestream_filegroup_name, FILESTREAM dosya grubunun adıdır. Dosya grubu, CREATE DATABASE veya ALTER DATABASE deyimi kullanılarak dosya grubu için tanımlanmış bir dosyaya sahip olmalıdır; aksi takdirde bir hata oluşur.

Tablo bölümlenmişse, FILESTREAM_ON yan tümcesi eklenmelidir ve tablonun bölüm düzeniyle aynı bölüm işlevini ve bölüm sütunlarını kullanan FILESTREAM dosya gruplarının bölüm düzenini belirtmelidir. Aksi takdirde bir hata oluşur.

Tablo bölümlenmemişse FILESTREAM sütunu bölümlenemez. Tablonun FILESTREAM verileri, FILESTREAM_ON yan tümcesinde belirtilen tek bir dosya grubunda depolanmalıdır.

FILESTREAM_ON NULL, kümelenmiş dizin oluşturulmaktaysa ve tabloda FILESTREAM sütunu yoksa CREATE INDEX deyiminde belirtilebilir.

Daha fazla bilgi için bkz. FILESTREAM (SQL Server).

nesne<>::=

Dizine eklenecek tam veya uygun olmayan nesne.

database_name

Veritabanının adı.

schema_name

Tablo veya görünümün ait olduğu şemanın adı.

table_or_view_name

Dizine eklenecek tablonun veya görünümün adı.

Görünümde dizin oluşturmak için görünümü ile SCHEMABINDINGtanımlanmalıdır. Herhangi bir kümelenmemiş dizin oluşturulmadan önce görünümde benzersiz bir kümelenmiş dizin oluşturulmalıdır. Dizinli görünümler hakkında daha fazla bilgi için bkz. Açıklamalar.

SQL Server 2016 (13.x) ile başlayarak, nesne kümelenmiş columnstore diziniyle depolanan bir tablo olabilir.

Azure SQL Veritabanı, geçerli veritabanı adı olduğunda <database_name> veya veya tempdb<database_name><object_name> ile ### başladığında üç bölümlü ad biçimini <database_name>.<schema_name>.<object_name> destekler. Şema adı ise dbo<schema_name> atlanabilir.

<relational_index_option>::=

Dizini oluştururken kullanılacak seçenekleri belirtir.

PAD_INDEX = { ON | KAPALI }

Dizin doldurmayı belirtir. Varsayılan değer: OFF.

  • ÜZERİNDE

    Doldurma faktörü tarafından belirtilen boş alan yüzdesi, dizinin ara düzey sayfalarına uygulanır. Aynı anda PAD_INDEXONbelirtilmezseFILLFACTOR, sys.indexes dosyasındaki doldurma faktörü değeri kullanılır.

  • KAPALI

    Ara düzey sayfalar, ara sayfalardaki anahtar kümesi dikkate alınarak, dizinin sahip olabileceği en büyük boyuta sahip en az bir satır için yeterli alan bırakarak yakın kapasiteye doldurulur. Bu durum, olarak ayarlandıysa ON ancak dolgu faktörü belirtilmemişse PAD_INDEX de oluşur.

seçeneği PAD_INDEX yalnızca belirtildiğinde FILLFACTOR yararlıdır, çünkü PAD_INDEX tarafından FILLFACTORbelirtilen yüzdeyi kullanır. için FILLFACTOR belirtilen yüzde bir satıra izin verecek kadar büyük değilse, Veritabanı Altyapısı en düşük değere izin vermek için yüzdeyi dahili olarak geçersiz kılar. Ara dizin sayfasındaki satır sayısı, değerinin FILLFACTORne kadar düşük olduğuna bakılmaksızın hiçbir zaman ikiden az olmaz.

Geriye dönük uyumlu söz diziminde, WITH PAD_INDEXWITH PAD_INDEX = ONeşdeğerdir.

FILLFACTOR = fillfactor

Veritabanı Altyapısı'nın dizin oluşturma veya yeniden oluşturma sırasında her dizin sayfasının yaprak düzeyini ne kadar tam yapması gerektiğini gösteren bir yüzde belirtir. Fillfactor değeri 1 ile 100 olan bir tamsayı değeri olmalıdır. 0 ve 100 dolgu faktörü değerleri her açıdan aynıdır. fillfactor 100 ise, Veritabanı Altyapısı yaprak sayfaların kapasiteye doldurulduğu dizinler oluşturur.

FILLFACTOR ayarı yalnızca dizin oluşturulduğunda veya yeniden oluşturulduğunda uygulanır. Veritabanı Altyapısı, sayfalarda belirtilen boş alan yüzdesini dinamik olarak tutmaz.

Dolgu faktörü ayarını görüntülemek için sys.indexes katalog görünümündeki sütunu kullanınfill_factor.

Önemli

100'den az olan bir FILLFACTOR dizin oluşturmak, Veritabanı Altyapısı bir dizini oluşturur veya yeniden oluştururken verileri doldurma faktörüne göre yeniden dağıttığından, verilerin kapladığı depolama alanı miktarını artırır.

Daha fazla bilgi için bkz. Dizin için dolgu faktörü belirtme.

SORT_IN_TEMPDB = { ON | KAPALI }

Geçici sıralama sonuçlarının içinde tempdbdepolanıp depolanmayacağını belirtir. Varsayılan değer Azure SQL Veritabanı Hiper Ölçek dışındadır OFF . Hiper Ölçek'teki tüm dizin derleme işlemleri için, SORT_IN_TEMPDB devam ettirilebilir bir dizin derlemesi kullanılmadığı sürece her zaman ON kullanılır. Devam ettirilebilen dizin derlemeleri SORT_IN_TEMPDB için her zaman OFFolur.

  • ÜZERİNDE

    Dizini oluşturmak için kullanılan ara sıralama sonuçları içinde tempdbdepolanır. Bu, dizin oluşturmak için gereken süreyi azaltabilir. Ancak bu, dizin derlemesi sırasında kullanılan disk alanı miktarını artırır.

  • KAPALI

    Ara sıralama sonuçları dizinle aynı veritabanında depolanır.

Kullanıcı veritabanında dizini oluşturmak için gereken alana ek olarak, tempdb ara sıralama sonuçlarını tutmak için yaklaşık olarak aynı miktarda ek alana sahip olmalıdır. Daha fazla bilgi için bkz. dizinler için SORT_IN_TEMPDB seçeneği.

Geriye dönük uyumlu söz diziminde, WITH SORT_IN_TEMPDBWITH SORT_IN_TEMPDB = ONeşdeğerdir.

IGNORE_DUP_KEY = { ON | KAPALI }

Ekleme işlemi benzersiz bir dizine yinelenen anahtar değerleri eklemeyi denediğinde hata yanıtını belirtir. IGNORE_DUP_KEY seçeneği yalnızca dizin oluşturulduktan veya yeniden oluşturulduktan sonra ekleme işlemleri için geçerlidir. SEÇENEĞIn CREATE INDEXyürütülürken, ALTER INDEXveya UPDATEhiçbir etkisi yoktur. Varsayılan değer: OFF.

  • ÜZERİNDE

    Benzersiz bir dizine yinelenen anahtar değerleri eklendiğinde bir uyarı iletisi oluşur. Yalnızca benzersizlik kısıtlamasını ihlal eden satırlar eklenmez.

  • KAPALI

    Benzersiz bir dizine yinelenen anahtar değerleri eklendiğinde hata iletisi oluşur. Deyimin tamamı INSERT geri alınır.

IGNORE_DUP_KEY görünümde oluşturulan dizinler, benzersiz olmayan dizinler, XML dizinleri, uzamsal dizinler ve filtrelenmiş dizinler için olarak ayarlanamaz ON .

Bir dizinin ayarını görüntülemek IGNORE_DUP_KEY için sys.indexes katalog görünümündeki sütunu kullanınignore_dup_key.

Geriye dönük uyumlu söz diziminde, WITH IGNORE_DUP_KEYWITH IGNORE_DUP_KEY = ONeşdeğerdir.

STATISTICS_NORECOMPUTE = { ON | KAPALI}

İstatistiklerin yeniden derlenip derlenmeyeceğini belirtir. Varsayılan değer: OFF.

  • ÜZERİNDE

    Güncel olmayan istatistikler otomatik olarak yeniden derlenmez.

  • KAPALI

    Otomatik istatistik güncelleştirme etkinleştirildi.

Otomatik istatistik güncelleştirmesini geri yüklemek için STATISTICS_NORECOMPUTE KAPALI olarak ayarlayın veya UPDATE STATISTICS yan tümcesi olmadan NORECOMPUTE yürütür.

Uyarı

ayarlayarak STATISTICS_NORECOMPUTE = ONistatistiklerin otomatik olarak yeniden derlenmesini devre dışı bırakırsanız, sorgu iyileştiricisinin tabloyla ilgili sorgular için en uygun yürütme planlarını seçmesini engelleyebilirsiniz.

ayarı STATISTICS_NORECOMPUTEON , dizin yeniden oluşturma işlemi sırasında oluşan dizin istatistiklerinin güncelleştirilmesini engellemez.

Geriye dönük uyumlu söz diziminde, WITH STATISTICS_NORECOMPUTEWITH STATISTICS_NORECOMPUTE = ONeşdeğerdir.

STATISTICS_INCREMENTAL = { ON | KAPALI }

Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

olduğunda ON, oluşturulan istatistikler bölüm istatistiklerine göredir. olduğunda OFF, istatistik ağacı bırakılır ve SQL Server istatistikleri yeniden hesaplar. Varsayılan değer: OFF.

Bölüm başına istatistikler desteklenmiyorsa seçenek yoksayılır ve bir uyarı oluşturulur. Artımlı istatistikler aşağıdaki durumlarda desteklenmez:

  • Temel tabloyla bölümle hizalanmamış dizinlerle oluşturulan istatistikler.
  • Always On okunabilir ikincil veritabanlarında oluşturulan istatistikler.
  • Salt okunur veritabanlarında oluşturulan istatistikler.
  • Filtrelenmiş dizinlerde oluşturulan istatistikler.
  • Görünümlerde oluşturulan istatistikler.
  • İç tablolarda oluşturulan istatistikler.
  • Uzamsal dizinler veya XML dizinleriyle oluşturulan istatistikler.

DROP_EXISTING = { ON | KAPALI }

Mevcut kümelenmiş veya kümelenmemiş dizini değiştirilmiş sütun belirtimleriyle bırakıp yeniden oluşturma ve dizin için aynı adı koruma seçeneğidir. Varsayılan değer: OFF.

  • ÜZERİNDE

    index_nameparametresiyle aynı ada sahip olması gereken mevcut dizinin bırakılıp yeniden oluşturulmasını belirtir.

  • KAPALI

    Mevcut dizinin bırakılmaması ve yeniden derlenmemesi için belirtir. Belirtilen dizin adı zaten varsa SQL Server bir hata görüntüler.

DROP_EXISTINGile şunları değiştirebilirsiniz:

  • Kümelenmiş bir rowstore dizinine kümelenmemiş bir satır deposu dizini.

DROP_EXISTINGile şunları değiştiremezsiniz:

  • Kümelenmiş bir satır deposu dizini, kümelenmemiş bir rowstore dizinine.
  • Herhangi bir satır deposu dizinine kümelenmiş columnstore dizini.

Geriye dönük uyumlu söz diziminde, WITH DROP_EXISTINGWITH DROP_EXISTING = ONeşdeğerdir.

ÇEVRİmİÇİ = { ON | KAPALI }

Dizin işlemi sırasında sorgular ve veri değişikliği için temel tabloların ve ilişkili dizinlerin kullanılabilir olup olmadığını belirtir. Varsayılan değer: OFF.

Önemli

Çevrimiçi 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.

  • ÜZERİNDE

    Uzun süreli tablo kilitleri dizin işlemi boyunca tutulmaz. Dizin işleminin ana aşamasında, kaynak tabloda yalnızca paylaşılan bir amaç (IS) kilidi tutulur. Bu, temel alınan tablo ve dizinlerde sorguların veya güncelleştirmelerin devam etmelerini sağlar. İşlemin başlangıcında, kaynak nesnede kısa bir süre için paylaşılan (S) bir kilit tutulur. İşlemin sonunda, kısa bir süre için, kümelenmemiş bir dizin oluşturulursa nesne üzerinde paylaşılan (S) bir kilit alınır. Kümelenmiş dizin çevrimiçi oluşturulduğunda veya bırakıldığında ve kümelenmiş veya kümelenmemiş dizin yeniden oluşturulduğunda şema değişikliği (Sch-M) kilidi alınır. ONLINE yerel geçici tabloda bir dizin oluşturulurken olarak ayarlanamaz ON .

    Not

    Çevrimiçi dizin işlemleri sırasında engellemeyi azaltmak veya önlemek için seçeneğini kullanabilirsiniz WAIT_AT_LOW_PRIORITY . Daha fazla bilgi için bkz. çevrimiçi dizin işlemleriyle WAIT_AT_LOW_PRIORITY.

  • KAPALI

    Tablo kilitleri dizin işlemi süresi boyunca uygulanır. Kümelenmiş, uzamsal veya XML dizini oluşturan, yeniden derleyen veya düşüren ya da derlenmemiş dizini yeniden oluşturan veya düşüren çevrimdışı dizin işlemi, tabloda şema değişikliği (Sch-M) kilidi alır. Bu, işlem süresi boyunca temel alınan tabloya tüm kullanıcı erişimini engeller. Kümelenmemiş dizin oluşturan çevrimdışı dizin işlemi başlangıçta tabloda paylaşılan (S) bir kilit alır. Bu, temel tablo tanımının değiştirilmesini engeller, ancak dizin derlemesi devam ederken tablodaki verilerin okunmasına ve değiştirilmesine izin verir.

Daha fazla bilgi için bkz. Çevrimiçi dizin işlemleri gerçekleştirme ve Çevrimiçi dizin işlemleri için yönergeler.

Aşağıdaki durumlar dışında, genel geçici tablolardaki dizinler de dahil olmak üzere dizinler çevrimiçi oluşturulabilir:

  • XML dizini
  • Yerel geçici tablodaki dizin
  • Görünümde ilk benzersiz kümelenmiş dizin
  • Devre dışı bırakılmış kümelenmiş dizinler
  • SQL Server 2017 (14.x)) ve eski sürümlerde kümelenmiş columnstore dizinleri
  • SQL Server 2016 (13.x)) ve eski sürümlerde kümelenmemiş columnstore dizinleri
  • Kümelenmiş dizin, temel alınan tabloda LOB veri türleri (görüntü, ntext, metin) ve uzamsal veri türleri varsa
  • varchar(max) ve varbinary(max) sütunları dizin anahtarının parçası olamaz. SQL Server'da (SQL Server 2012 (11.x) ile başlayarak), Azure SQL Veritabanı'nda ve Azure SQL Yönetilen Örneği'nde bir tablo varchar(max) veya varbinary(max) sütunları içerdiğinde, diğer sütunları içeren kümelenmiş dizin oluşturulabilir veya seçeneği kullanılarak ONLINE yeniden oluşturulabilir.
  • Kümelenmiş columnstore dizini olan bir tablodaki kümelenmemiş dizinler

Daha fazla bilgi için bkz. Çevrimiçi dizin işlemleri nasıl çalışır?

RESUMABLE = { ON | KAPALI }

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

Çevrimiçi dizin işleminin devam ettirilebilir olup olmadığını belirtir. Daha fazla bilgi için bkz. Yeniden devam ettirilebilen dizin işlemleri ve Devam ettirilebilen dizin konuları.

  • ÜZERİNDE

    Dizin işlemi devam ettirilebilir.

  • KAPALI

    Dizin işlemi devam ettirilemez.

MAX_DURATION = ile kullanılan RESUMABLE = ON [DAKİkA] (ONLINE = ONgerektirir)

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

Duraklatılmadan önce devam ettirilebilen dizin işleminin ne kadar süreyle yürütülür, dakika cinsinden belirtir.

ALLOW_ROW_LOCKS = { ON | KAPALI }

Satır kilitlerine izin verilip verilmeyeceğini belirtir. Varsayılan değer: ON.

  • ÜZERİNDE

    Dizine erişirken satır kilitlerine izin verilir. Veritabanı Altyapısı satır kilitlerinin ne zaman kullanılacağını belirler.

  • KAPALI

    Satır kilitleri kullanılmaz.

ALLOW_PAGE_LOCKS = { ON | KAPALI }

Sayfa kilitlerine izin verilip verilmeyeceğini belirtir. Varsayılan değer: ON.

  • ÜZERİNDE

    Dizine erişirken sayfa kilitlerine izin verilir. Veritabanı Altyapısı, sayfa kilitlerinin ne zaman kullanılacağını belirler.

  • KAPALI

    Sayfa kilitleri kullanılmaz.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | KAPALI }

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

Son sayfa ekleme çekişmesi önlemek için iyileştirilip iyileştirilmeyeceğini belirtir. Varsayılan değer: OFF. Daha fazla bilgi için Sıralı anahtarlar bölümüne bakın.

MAXDOP = max_degree_of_parallelism

Dizin işlemi için en yüksek paralellik derecesi yapılandırma seçeneğini geçersiz kılar. Daha fazla bilgi için bkz. En yüksek paralellik derecesini yapılandırma Sunucu Yapılandırma Seçeneği. Bir dizin derleme işlemi için paralellik derecesini ve sonuçta elde edilen kaynak tüketimini sınırlamak için kullanın MAXDOP .

max_degree_of_parallelism olabilir:

  • 1

    Paralel plan oluşturmayı bastırır.

  • >1

    Paralel dizin işleminde kullanılan en yüksek paralellik derecesini, geçerli sistem iş yüküne göre belirtilen sayıyla veya daha az değerle kısıtlar.

  • 0 (varsayılan)

    Geçerli sistem iş yüküne göre azaltılmadığı sürece sunucu, veritabanı veya iş yükü grubu düzeyinde belirtilen paralellik derecesini kullanır.

Daha fazla bilgi için bkz . Paralel dizin işlemlerini yapılandırma.

Not

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.

DATA_COMPRESSION

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

  • Hiç kimse

    Dizin veya belirtilen bölümler sıkıştırılamaz. Bu, columnstore dizinleri için geçerli değildir.

  • SIRA

    Dizin veya belirtilen bölümler satır sıkıştırma kullanılarak sıkıştırılır. Bu, columnstore dizinleri için geçerli değildir.

  • SAYFA

    Dizin veya belirtilen bölümler sayfa sıkıştırma kullanılarak sıkıştırılır. Bu, columnstore dizinleri için geçerli değildir.

  • COLUMNSTORE

    Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

    Hem kümelenmemiş columnstore hem de kümelenmiş columnstore dizinleri dahil olmak üzere yalnızca columnstore dizinleri için geçerlidir.

  • COLUMNSTORE_ARCHIVE

    Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

    Hem kümelenmemiş columnstore hem de kümelenmiş columnstore dizinleri dahil olmak üzere yalnızca columnstore dizinleri için geçerlidir. COLUMNSTORE_ARCHIVE belirtilen bölümü daha küçük bir boyuta sıkıştırır. Bu, 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 durumlar için kullanılabilir.

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

XML_COMPRESSION

Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

Belirtilen dizin için bir veya daha fazla xml veri türü sütunu içeren XML sıkıştırma seçeneğini belirtir. Seçenekler şunlardır:

  • ÜZERİNDE

    Dizin veya belirtilen bölümler XML sıkıştırması kullanılarak sıkıştırılır.

  • KAPALI

    Dizin veya belirtilen bölümler XML sıkıştırması kullanılarak sıkıştırılmaz.

ON PARTITIONS ( { <partition_number_expression> | <aralığı> } [ ,...n ] )

DATA_COMPRESSION veya XML_COMPRESSION ayarlarının uygulandığı bölümleri belirtir. Dizin bölümlenmemişse, ON PARTITIONS bağımsız değişken bir hata oluşturur. ON PARTITIONS yan tümcesi sağlanmamışsa, DATA_COMPRESSION veya XML_COMPRESSION seçeneği bölümlenmiş dizinin tüm bölümlerine uygulanır.

<partition_number_expression> aşağıdaki yollarla belirtilebilir:

  • Bölümün numarasını belirtin, örneğin: ON PARTITIONS (2).
  • Virgülle ayrılmış birkaç bölüm için bölüm numaralarını sağlayın, örneğin: ON PARTITIONS (1, 5).
  • Hem aralıkları hem de tek tek bölümleri sağlayın, örneğin: ON PARTITIONS (2, 4, 6 TO 8).

<range> , anahtar sözcüğüyle TOayrılmış bölüm numaraları olarak belirtilebilir, örneğin: ON PARTITIONS (6 TO 8).

Farklı bölümler için farklı veri sıkıştırma türleri ayarlamak için, DATA_COMPRESSION seçeneğini birden çok kez belirtin, örneğin:

REBUILD WITH
(
DATA_COMPRESSION = NONE ON PARTITIONS (1),
DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);

XML_COMPRESSION seçeneğini birden çok kez de belirtebilirsiniz, örneğin:

REBUILD WITH
(
XML_COMPRESSION = OFF ON PARTITIONS (1),
XML_COMPRESSION = ON ON PARTITIONS (2, 4, 6 TO 8),
XML_COMPRESSION = OFF ON PARTITIONS (3, 5)
);

Açıklamalar

Deyimi için CREATE INDEX sorgu planını oluştururken, sorgu iyileştiricisi tablo taraması yapmak yerine başka bir dizini taramayı seçebilir. Sıralama işlemi bazı durumlarda ortadan kaldırılabilir. Çok işlemcili bilgisayarlarda, CREATE INDEX diğer sorgularla aynı şekilde, dizini oluşturmayla ilişkili tarama ve sıralama işlemleri için paralellik kullanabilir. Daha fazla bilgi için bkz . Paralel dizin işlemlerini yapılandırma.

CREATE INDEX Veritabanı kurtarma modeli toplu olarak günlüğe kaydedilmiş veya basit olarak ayarlanmışsa işlem minimum düzeyde günlüğe kaydedilebilir.

Dizinler geçici bir tabloda oluşturulabilir. Tablo bırakıldığında veya kapsam dışına çıktığında dizinler bırakılır.

Birincil anahtar kısıtlaması eklendiğinde kümelenmiş dizin bir tablo değişkeni üzerinde oluşturulur. Benzer şekilde, benzersiz bir kısıtlama eklendiğinde bir tablo değişkeni üzerinde derlenmemiş dizin oluşturulur. Tablo değişkeni kapsam dışına çıktığında dizinler bırakılır.

Dizinler genişletilmiş özellikleri destekler.

CREATE INDEX Microsoft Fabric'te desteklenmez.

Kümelenmiş

Tablo (yığın) üzerinde kümelenmiş dizin oluşturma veya mevcut kümelenmiş dizini bırakma ve yeniden oluşturma, veri sıralamasını ve özgün tablonun veya mevcut kümelenmiş dizin verilerinin geçici bir kopyasını barındırmak için veritabanında ek çalışma alanının kullanılabilir olmasını gerektirir. Kümelenmiş dizinler hakkında daha fazla bilgi için bkz. Kümelenmiş dizinler oluşturma ve SQL Server dizin mimarisi ve tasarım kılavuzu.

Kümelenmemiş dizinler

SQL Server 2016'dan (13.x) başlayarak, Azure SQL Veritabanı'nda ve Azure SQL Yönetilen Örneği'nde kümelenmiş columnstore dizini olarak depolanan bir tabloda kümelenmemiş dizin oluşturabilirsiniz. Önce yığın veya kümelenmiş dizin olarak depolanan bir tabloda kümelenmemiş dizin oluşturursanız, tabloyu daha sonra kümelenmiş columnstore dizinine dönüştürürseniz dizin devam eder. Kümelenmiş columnstore dizinini yeniden oluştururken, kümelenmemiş dizini bırakmanız da gerekmez.

kümelenmiş columnstore dizini olarak depolanan bir tabloda kümelenmemiş dizin oluşturduğunuzda FILESTREAM_ON seçeneği geçerli değildir.

Benzersiz dizinler

Benzersiz bir dizin mevcut olduğunda, Veritabanı Altyapısı her veri eklendiğinde veya değiştirildiğinde yinelenen değerleri denetler. Yinelenen anahtar değerleri oluşturacak işlemler geri alınır ve Veritabanı Altyapısı bir hata iletisi döndürür. Veri ekleme veya değiştirme işlemi birçok satırı değiştirse ancak yalnızca bir yinelemeye neden olsa bile bu durum geçerlidir. seçeneği olarak ayarlanmış ONbenzersiz bir dizin IGNORE_DUP_KEY olduğunda satır ekleme girişiminde bulunulduğunda, benzersiz dizini ihlal eden satırlar yoksayılır.

Bölümlenmiş dizinler

Bölümlenmiş dizinler bölümlenmiş tablolara benzer şekilde oluşturulur ve korunur, ancak sıradan dizinler gibi ayrı veritabanı nesneleri olarak işlenir. Bölümlenmemiş bir tabloda bölümlenmiş dizininiz olabilir ve bölümlenmiş bir tabloda bölümlenmemiş bir dizininiz olabilir.

Bölümlenmiş bir tabloda dizin oluşturuyorsanız ve dizinin yerleştirildiği bir dosya grubu belirtmezseniz, dizin temel tabloyla aynı şekilde bölümlenir. Bunun nedeni dizinlerin varsayılan olarak temel tablolarıyla aynı dosya gruplarına ve aynı bölümleme sütunlarını kullanan bölümlenmiş bir tabloya yerleştirilmesidir. Dizin, tabloyla aynı bölümleme düzenini ve bölümleme sütununu kullandığında, dizin tabloyla hizalanır.

Uyarı

1.000'den fazla bölümü olan bir tabloda hizalanmamış dizinler oluşturmak ve yeniden oluşturmak mümkündür, ancak desteklenmez. Bunun yapılması, bu işlemler sırasında performansın düşmesine veya aşırı bellek tüketimine neden olabilir. Yalnızca bölüm sayısı 1.000'i aştığında hizalanmış dizinler kullanmanızı öneririz.

Benzersiz olmayan, kümelenmiş bir dizini bölümlerken, Veritabanı Altyapısı varsayılan olarak kümelenmiş dizin anahtarları listesine önceden belirtilmemişse tüm bölümleme sütunlarını ekler.

Dizinli görünümler, bölümlenmiş tablolarda, tablolardaki dizinler gibi oluşturulabilir. Bölümlenmiş dizinler hakkında daha fazla bilgi için bkz . Bölümlenmiş tablolar ve dizinler ile SQL Server dizin mimarisi ve tasarım kılavuzu.

Bir dizin oluşturulduğunda veya yeniden oluşturulduğunda, sorgu dizindeki güncelleştirme istatistiklerini iyileştirir. Bölümlenmiş dizin için sorgu iyileştiricisi tablodaki tüm satırları bölümlenmemiş dizin için taramak yerine varsayılan örnekleme algoritmasını kullanır. Tablodaki tüm satırları tarayarak bölümlenmiş dizinlerle ilgili istatistikleri almak için CREATE STATISTICS yan tümcesiyle UPDATE STATISTICS veya FULLSCAN kullanın.

Filtrelenmiş dizinler

Filtrelenmiş dizin, tablodaki satırların küçük bir yüzdesini seçen sorgular için uygun, iyileştirilmiş bir kümelenmemiş 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

SET Aşağıdaki koşullardan herhangi biri gerçekleştiğinde Gerekli değer sütunundaki seçenekler gereklidir:

  • Filtrelenmiş bir dizin oluşturursunuz.

  • , INSERTUPDATE, DELETEveya MERGE deyimi filtrelenmiş dizindeki verileri değiştirir.

  • Filtrelenmiş dizin, sorgu planını oluşturmak için sorgu iyileştiricisi tarafından kullanılır.

    SET seçenek Gerekli değer Varsayılan sunucu değeri Varsayılan OLE DB ve ODBC değeri Varsayılan DB-Library değeri
    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 Veritabanı ANSI_WARNINGSON uyumluluk düzeyi 90 veya daha yüksek olduğunda örtük olarak ARITHABORTON olarak ayarlanacağı ayar. Veritabanı uyumluluk düzeyi 80 veya daha eski olarak ayarlandıysa, ARITHABORT seçeneği açıkça olarak ONolarak ayarlanmalıdır.

SET Seçenekler yanlışsa aşağıdaki koşullar oluşabilir:

  • Filtrelenmiş dizin oluşturulamıyor.
  • Veritabanı Altyapısı bir hata oluşturur ve dizindeki INSERTverileri değiştiren , UPDATE, DELETEveya MERGE deyimini 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 ve SQL Server dizin mimarisi ve tasarım kılavuzu.

Uzamsal dizinler

Uzamsal dizinler hakkında bilgi için bkz . CREATE SPATIAL INDEX ve Spatial indexes overview.

XML dizinleri

XML dizinleri hakkında bilgi için bkz. CREATE XML INDEX ve XML Dizinleri (SQL Server).

Dizin anahtarı boyutu

Bir dizin anahtarının en büyük boyutu kümelenmiş dizin için 900 bayt ve kümelenmemiş dizin için 1.700 bayttır. (SQL Veritabanı ve SQL Server 2016 (13.x) öncesinde sınır her zaman 900 bayttı.) Varchar sütunlarında bayt sınırını aşan dizinler, dizin oluşturulurken sütunlardaki mevcut veriler sınırı aşmazsa oluşturulabilir; ancak, sütunlarda toplam boyutun sınırdan büyük olmasına neden olan sonraki ekleme veya güncelleştirme işlemleri başarısız olur. Kümelenmiş dizinin dizin anahtarı, ayırma biriminde var olan veriler ROW_OVERFLOW_DATA içeren varchar sütunları içeremez. Bir varchar sütununda kümelenmiş dizin oluşturulursa ve mevcut veriler ayırma birimindeyseIN_ROW_DATA, verileri satır dışına gönderebilecek sonraki ekleme veya güncelleştirme işlemleri başarısız olur.

Kümelenmemiş dizinler, dizinin yaprak düzeyinde anahtar olmayan (dahil) sütunlar içerebilir. Dizin anahtarı boyutu hesaplanırken bu sütunlar Veritabanı Altyapısı tarafından dikkate alınmaz. Daha fazla bilgi için bkz. Eklenen sütunlarla dizin oluşturma ve SQL Server dizin mimarisi ve tasarım kılavuzu.

Not

Tablolar bölümlendiğinde, bölümleme anahtarı sütunları benzersiz olmayan bir kümelenmiş dizinde mevcut değilse, Veritabanı Altyapısı tarafından dizine eklenir. Dizine alınan sütunların birleşik boyutu (dahil edilen sütunları saymama), artı olarak eklenen bölümleme sütunları benzersiz olmayan bir kümelenmiş dizinde 1800 baytı aşamaz.

Hesaplanan sütunlar

Dizinler hesaplanan sütunlarda oluşturulabilir. Ayrıca, hesaplanan sütunlar özelliğine PERSISTEDsahip olabilir. Bu, Veritabanı Altyapısı'nın hesaplanan değerleri tabloda depoladığı ve hesaplanan sütunun bağımlı olduğu diğer sütunlar güncelleştirildiğinde bunları güncelleştirdiği anlamına gelir. Veritabanı Altyapısı, sütunda dizin oluştururken ve bir sorguda dizine başvurulduğunda bu kalıcı değerleri kullanır.

Hesaplanan sütunu dizine almak için hesaplanan sütunun belirleyici ve kesin olması gerekir. Ancak özelliğinin PERSISTED kullanılması, dizine alınabilen hesaplanan sütunların türünü şunları içerecek şekilde genişletir:

  • Transact-SQL ve CLR işlevlerine ve kullanıcı tarafından belirlenici olarak işaretlenen CLR kullanıcı tanımlı tür yöntemlerine göre hesaplanan sütunlar.
  • Veritabanı Altyapısı tarafından tanımlanan ancak kesin olmayan ifadeleri temel alan hesaplanan sütunlar.

Kalıcı hesaplanan sütunlar, filtrelenmiş dizinler için gerekli SET seçenekleri bölümünde gösterildiği gibi aşağıdaki SET seçeneklerin ayarlanmasını gerektirir.

veya PRIMARY KEY kısıtlamasıUNIQUE, dizin oluşturma için tüm koşulları karşıladıkça hesaplanan bir sütun içerebilir. Özellikle, hesaplanan sütun belirleyici, kesin veya belirleyici olmalı ve kalıcı olmalıdır. Determinizm hakkında daha fazla bilgi için bkz. Deterministic ve Nondeterministic Functions.

görüntütüretilen hesaplanan sütunlar ntext, metin, varchar(max), nvarchar(max), varbinary(max)ve xml veri türleri, hesaplanan sütun veri türü bir dizin anahtarı sütunu veya anahtar olmayan sütun olarak izin verebildiği sürece anahtar olarak dizine eklenebilir veya anahtar olmayan sütun olarak eklenebilir. Örneğin, hesaplanan xml sütununda birincil XML dizini oluşturamazsınız. Dizin anahtarı boyutu 900 baytı aşarsa bir uyarı iletisi görüntülenir.

Hesaplanan sütunda dizin oluşturmak, daha önce çalışan bir ekleme veya güncelleştirme işleminin başarısız olmasına neden olabilir. Hesaplanan sütun aritmetik bir hatayla sonuçlandığında böyle bir hata oluşabilir.

Örneğin, aşağıdaki tabloda hesaplanan sütunun c ifadesi satır eklendiğinde aritmetik bir hatayla sonuçlanmış gibi görünse de deyimi INSERT çalışır.

CREATE TABLE t1 (a INT, b INT, c AS a/b);
INSERT INTO t1 VALUES (1, 0);

Ancak hesaplanan sütunda cbir dizin oluşturursanız, aynı INSERT deyim başarısız olur.

CREATE TABLE t1 (a INT, b INT, c AS a/b);
CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1(c);
INSERT INTO t1 VALUES (1, 0);

Daha fazla bilgi için bkz. Hesaplanan sütunlardaki dizinler.

Dizinlere eklenen sütunlar

Dahil edilen sütunlar olarak adlandırılan anahtar olmayan sütunlar, sorguyu kapsayan sorgu performansını geliştirmek için kümelenmemiş dizinin yaprak düzeyine eklenebilir. Diğer bir ifadeyle, sorguda başvurulan tüm sütunlar anahtar veya anahtar olmayan sütunlar olarak dizine eklenir. Bu, sorgu iyileştiricinin kümelenmemiş dizin taramasından veya aramasından gerekli tüm bilgileri almasını sağlar; tabloya veya kümelenmiş dizin verilerine erişilir. Daha fazla bilgi için bkz. Eklenen sütunlarla dizin oluşturma ve SQL Server dizin mimarisi ve tasarım kılavuzu.

Dizin seçeneklerini belirtme

SQL Server 2005 (9.x) yeni dizin seçeneklerini kullanıma sunar ve ayrıca seçeneklerin belirtilma şeklini değiştirir. Geriye dönük uyumlu söz diziminde, WITH option_name ile WITH (option_name = ON)eşdeğerdir. Dizin seçeneklerini ayarladığınızda aşağıdaki kurallar uygulanır:

  • Yeni dizin seçenekleri yalnızca WITH (<option_name> = <ON | OFF>)kullanılarak belirtilebilir.
  • Seçenekler, aynı deyimde hem geriye dönük uyumlu hem de yeni söz dizimi kullanılarak belirtilemiyor. Örneğin, WITH (DROP_EXISTING, ONLINE = ON) belirtilmesi deyiminin başarısız olmasına neden olur.
  • XML dizini oluşturduğunuzda, seçenekler WITH (<option_name> = <ON | OFF>)kullanılarak belirtilmelidir.

DROP_EXISTING yan tümcesi

dizini yeniden oluşturmak, sütunları eklemek veya bırakmak, seçenekleri değiştirmek, sütun sıralama düzenini değiştirmek veya bölüm düzenini veya dosya grubunu değiştirmek için DROP_EXISTING yan tümcesini kullanabilirsiniz.

Dizin bir PRIMARY KEY veya UNIQUE kısıtlaması uygularsa ve dizin tanımı herhangi bir şekilde değiştirilmezse, dizin bırakılır ve mevcut kısıtlama korunarak yeniden oluşturulur. Ancak, dizin tanımı değiştirilirse deyimi başarısız olur. Veya UNIQUE kısıtlamasının PRIMARY KEY tanımını değiştirmek için kısıtlamayı bırakın ve yeni tanım ile bir kısıtlama ekleyin.

DROP_EXISTING, aynı veya farklı anahtar kümesiyle kümelenmiş dizini, aynı zamanda kümelenmemiş dizinleri olan bir tabloda yeniden oluşturduğunuzda performansı artırır. DROP_EXISTING, eski kümelenmiş dizinde bir DROP INDEX deyiminin yürütülmesini ve ardından yeni kümelenmiş dizin için bir CREATE INDEX deyiminin yürütülmesini değiştirir. Kümelenmemiş dizinler bir kez yeniden oluşturulur ve yalnızca dizin tanımı değiştiyse. dizin tanımı özgün dizinle aynı dizin adı, anahtar ve bölüm sütunları, benzersizlik özniteliği ve sıralama düzenine sahip olduğunda, DROP_EXISTING yan tümcesi kümelenmemiş dizinleri yeniden oluşturmaz.

Toplanmamış dizinler yeniden derlenmiş olsun veya olmasın, her zaman özgün dosya gruplarında veya bölüm şemalarında kalır ve özgün bölüm işlevlerini kullanır. Kümelenmiş dizin farklı bir dosya grubuna veya bölüm düzenine yeniden oluşturulursa, kümelenmemiş dizinler kümelenmiş dizinin yeni konumuna denk gelecek şekilde taşınmaz. Bu nedenle, daha önce kümelenmiş dizinle hizalanmış kümelenmemiş dizinler bile artık kümelenmiş dizinle hizalanamayabilir. Bölümlenmiş dizin hizalaması hakkında daha fazla bilgi için bkz . Bölümlenmiş tablolar ve dizinler.

Yan DROP_EXISTING tümcesi, dizin deyimi bir kümelenmemiş dizin belirtmediği ve seçeneği olarak ayarlanmadığı OFFsürece, aynı dizin anahtarı sütunları aynı sırada ve ONLINE aynı artan veya azalan düzende kullanılıyorsa verileri yeniden sıralamaz. Kümelenmiş dizin devre dışı bırakılırsa, CREATE INDEX WITH DROP_EXISTING işlemi olarak ayarlanmış OFFolarak ONLINE gerçekleştirilmelidir. Kümelenmemiş bir dizin devre dışıysa ve devre dışı bırakılmış bir kümelenmiş dizinle ilişkilendirilmemişse, CREATE INDEX WITH DROP_EXISTING işlem veya ONolarak ayarlanmış OFF olarak ONLINE gerçekleştirilebilir.

Not

128 veya daha fazla uzantıya sahip dizinler bırakıldığında veya yeniden oluşturulduğunda, Veritabanı Altyapısı işlem işlemeden sonraya kadar gerçek sayfa ayırmalarını ve ilişkili kilitlerini geçersiz kılır. Daha fazla bilgi için bkz. Ertelenen serbest bırakma.

ÇEVRİmİÇİ seçeneği

Dizin işlemlerini çevrimiçi gerçekleştirmek için aşağıdaki yönergeler geçerlidir:

  • Temel alınan tablo, çevrimiçi dizin işlemi devam ederken değiştirilemez, kırpılamaz veya bırakılamaz.
  • Dizin işlemi sırasında ek geçici disk alanı gerekir.
  • Çevrimiçi işlemler, kalıcı hesaplanan sütunlar veya dahil edilen sütunlar içeren bölümlenmiş dizinler ve dizinler üzerinde gerçekleştirilebilir.
  • WAIT_AT_LOW_PRIORITY Bağımsız değişken seçeneği, dizin işleminin kilit Sch-M beklediğinde nasıl ilerleyeceğine karar vermenizi sağlar. Daha fazla bilgi için bkz. WAIT_AT_LOW_PRIORITY

Daha fazla bilgi için bkz. Dizin işlemlerini çevrimiçigerçekleştirme.

Devam ettirilebilen dizin işlemleri

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

Çevrimiçi dizin oluşturma işleminin devam ettirilebilir olmasını sağlayabilirsiniz. Bu, dizin derlemesinin durdurulabileceği ve daha sonra durdurulduğu noktadan yeniden başlatılabildiği anlamına gelir. Dizin derlemesini devam ettirilebilir olarak çalıştırmak için seçeneğini belirtin RESUMABLE = ON .

Devam ettirilebilen dizin işlemleri için aşağıdaki yönergeler geçerlidir:

  • Seçeneği kullanmak RESUMABLE için seçeneğini de kullanmanız ONLINE gerekir.
  • Bu RESUMABLE seçenek, belirli bir dizinin meta verilerinde kalıcı değildir ve yalnızca geçerli DDL deyiminin süresine uygulanır. Bu nedenle, RESUMABLE = ON yan tümcesi, sürdürülebilirliği etkinleştirmek için açıkça belirtilmelidir.
  • seçeneği MAX_DURATION iki bağlamda belirtilebilir:
    • MAX_DURATION seçeneği, RESUMABLE yeniden derlenen bir dizinin zaman aralığını belirtir. Bu süre geçtikten sonra ve dizin yeniden derlemesi hala çalışıyorsa duraklatılır. Duraklatılmış dizin için yeniden oluşturma işleminin ne zaman sürdürülebileceğine siz karar verirsiniz. dakika MAX_DURATION cinsinden süre 0 dakikadan uzun ve bir haftadan küçük veya buna eşit olmalıdır (7 * 24 * 60 = 10080 dakika). Dizin işlemindeki uzun bir duraklama, hem özgün dizin hem de yeni oluşturulan dizin için disk alanı gerektiğinden ve DML işlemleri tarafından güncelleştirildiğinden, belirli bir tablodaki DML performansını ve veritabanı disk kapasitesini önemli ölçüde etkileyebilir. Seçenek belirtilmezse MAX_DURATION , dizin işlemi tamamlanmadan veya hata oluşana kadar devam eder.
    • MAX_DURATION WAIT_AT_LOW_PRIORITY seçeneği, eylem gerçekleştirmeden önce dizin işlemi engellenirse düşük öncelikli kilitler kullanılarak beklenecek süreyi belirtir. Daha fazla bilgi için bkz. çevrimiçi dizin işlemleriyle WAIT_AT_LOW_PRIORITY.
  • Dizin işlemini hemen duraklatmak için komutunu yürütebilir ALTER INDEX PAUSE veya komutunu yürütebilirsiniz KILL <session_id> .
  • Özgün CREATE INDEX deyimi aynı parametrelerle yeniden yürütmek, duraklatılmış dizin derleme işlemini sürdürür. Deyimini yürüterek ALTER INDEX RESUME duraklatılmış dizin derleme işlemini de sürdürebilirsiniz.
  • komutu, ABORT bir dizin derlemesi çalıştıran oturumu öldürür ve dizin işlemini iptal eder. Durdurulmuş bir dizin işlemini sürdüremezsiniz.

Devam ettirilebilen dizin işlemi tamamlanana, duraklatana veya başarısız olana kadar çalışır. İşlemin duraklatılması durumunda, işlemin duraklatıldığını ve dizin oluşturma işleminin tamamlanmadığını belirten bir hata verilir. İşlemin başarısız olması durumunda da bir hata verilir.

Dizin işleminin devam ettirilebilir bir işlem olarak yürütülip yürütülmediğini görmek ve geçerli yürütme durumunu denetlemek için sys.index_resumable_operations katalog görünümünü kullanın.

Kaynaklar

Devam ettirilebilen dizin işlemleri için aşağıdaki kaynaklar gereklidir:

  • Derlemenin duraklatıldığı zaman da dahil olmak üzere dizinin derlenmesini sağlamak için gereken ek alan.
  • Sıralama aşamasında ek günlük aktarım hızı. Devam ettirilebilen dizin için genel günlük alanı kullanımı, normal çevrimiçi dizin oluşturma işlemiyle karşılaştırıldığında daha azdır ve bu işlem sırasında günlük kesilmesine izin verir.
  • Dizin işlemi duraklatılırken oluşturulan dizinle ilişkili tabloyu değiştirmeye çalışan DDL deyimlerine izin verilmez.
  • Hayalet temizleme, hem duraklatılırken hem de işlem çalışırken işlem süresi boyunca derleme içi dizinde engellenir.
  • Tabloda LOB sütunları varsa, devam ettirilebilen kümelenmiş dizin derlemesi, işlemin başlangıcında şema değişikliği (Sch-M) kilidi gerektirir.

Geçerli işlevsel sınırlamalar

Devam ettirilebilen dizin oluşturma işlemleri aşağıdaki sınırlamalara sahiptir:

  • Devam ettirilebilen çevrimiçi dizin oluşturma işlemi duraklatıldıktan sonra ilk değeri MAXDOP değiştirilemez.
  • Bu SORT_IN_TEMPDB = ON seçenek, devam ettirilebilen dizin işlemleri için desteklenmez.
  • ile RESUMABLE = ON DDL komutu, açık bir işlem içinde yürütülemez.
  • Aşağıdakiler içeren bir devam ettirilebilir dizin oluşturamazsınız:
    • Anahtar sütun olarak hesaplanan veya timestamp (rowversion) sütunlar.
    • LoB sütununu dahil edilen sütun olarak belirleyin.
  • Devam ettirilebilen dizin işlemleri şu işlemler için desteklenmez:
    • ALTER INDEX REBUILD ALL komutu
    • ALTER TABLE REBUILD komutu
    • Columnstore dizinleri
    • Filtrelenmiş dizinler
    • Devre dışı bırakılmış dizinler

Çevrimiçi dizin işlemleriyle WAIT_AT_LOW_PRIORITY

Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

seçeneğini kullanmadığınızda, dizin oluşturma işleminin WAIT_AT_LOW_PRIORITY başlaması ve tamamlanması için tablo veya dizinde kilitleri tutan tüm etkin engelleme işlemlerinin tamamlanması gerekir. Çevrimiçi dizin işlemi başladığında ve tamamlanmadan önce, tabloda paylaşılan (S) veya şema değişikliği (Sch-M) kilidi alması ve bunu kısa bir süre boyunca tutması gerekir. Kilit yalnızca kısa bir süre tutulsa da iş yükü aktarım hızını önemli ölçüde etkileyebilir, sorgu gecikme süresini artırabilir veya yürütme zaman aşımlarına neden olabilir.

Bu sorunları önlemek için seçeneği, WAIT_AT_LOW_PRIORITY çevrimiçi dizin işleminin S başlatılıp tamamlanması için gereken veya Sch-M kilitlerin davranışını yönetmenize olanak tanır ve üç seçenekten birini belirleyebilirsiniz. Her durumda, tarafından MAX_DURATION = n [minutes] belirtilen bekleme süresi boyunca dizin işlemini içeren bir engelleme yoksa, dizin işlemi hemen devam eder.

WAIT_AT_LOW_PRIORITY çevrimiçi dizin işlemini düşük öncelikli kilitler kullanarak bekleterek normal öncelik kilitlerini kullanan diğer işlemlerin bu arada devam etmelerini sağlar. WAIT_AT_LOW_PRIORITY seçeneğinin atlanması, WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE)eşdeğerdir.

MAX_DURATION = time [MINUTES]

Çevrimiçi dizin işleminin düşük öncelikli kilitler kullanarak beklediği bekleme süresi (dakika cinsinden belirtilen tamsayı değeri). İşlem bu süre boyunca MAX_DURATION engellenirse, belirtilen ABORT_AFTER_WAIT eylem yürütülür. MAX_DURATION zaman her zaman dakika cinsindendir ve sözcük MINUTES atlanabilir.

ABORT_AFTER_WAIT= [NONE | | SELFBLOCKERS ]

  • NONE: Normal öncelikli kilidi beklemeye devam edin.
  • SELF: Hiçbir işlem yapmadan yürütülmekte olan çevrimiçi dizin işleminden çıkın. Seçenek SELF 0 olduğunda MAX_DURATION kullanılamaz.
  • BLOCKERS: İşlemin devam edebilmesi için çevrimiçi dizin işlemini engelleyen tüm kullanıcı işlemlerini kapatın. BLOCKERS seçeneği, veya ALTER INDEX deyimini yürüten sorumlunun CREATE INDEX izne sahip ALTER ANY CONNECTION olmasını gerektirir.

Düşük öncelikli kilitleri bekleyen dizin işlemlerini izlemek için aşağıdaki genişletilmiş olayları kullanabilirsiniz:

  • lock_request_priority_state
  • process_killed_by_abort_blockers
  • ddl_with_wait_at_low_priority

Satır ve sayfa kilitleme seçenekleri

ALLOW_ROW_LOCKS = ON ve ALLOW_PAGE_LOCK = ONdizine erişirken satır, sayfa ve tablo düzeyinde kilitlere izin verilir. Veritabanı Altyapısı uygun kilidi seçer ve kilidi bir satırdan veya sayfa kilidinden tablo kilidine yükseltebilir.

ALLOW_ROW_LOCKS = OFF ve ALLOW_PAGE_LOCK = OFF, dizine erişirken yalnızca tablo düzeyinde bir kilide izin verilir.

Uyarı

Dizinde satır veya sayfa kilitlerinin devre dışı bırakılması önerilmez. Eşzamanlılık ile ilgili sorunlar oluşabilir ve belirli işlevler kullanılamayabilir. Örneğin, bir dizin olarak ayarlandığında OFFyeniden düzenlenemezALLOW_PAGE_LOCKS.

Sıralı anahtarlar

Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri, Azure SQL Veritabanı'nda ve Azure SQL Yönetilen Örneği'nde.

Son sayfa ekleme çekişmesi, çok sayıda eşzamanlı iş parçacığı sıralı anahtarla dizine satır eklemeye çalıştığında oluşan yaygın bir performans sorunudur. Öndeki anahtar sütunu, kimlik sütunu veya varsayılan olarak geçerli tarih/saat olan bir tarih gibi her zaman artan (veya azalan) değerler içerdiğinde dizin sıralı olarak kabul edilir. Eklenen anahtarlar sıralı olduğundan, tüm yeni satırlar dizin yapısının sonuna ( başka bir deyişle, aynı sayfaya) eklenir. Bu, bellekte sayfa için çekişmeye yol açar ve söz konusu sayfa için bir mandal elde etmek için bekleyen birkaç iş parçacığı olarak gözlemlenebilir. Karşılık gelen bekleme türü şeklindedir PAGELATCH_EX.

OPTIMIZE_FOR_SEQUENTIAL_KEY dizin seçeneğinin etkinleştirilmesi, veritabanı altyapısında dizine yüksek eşzamanlılık eklemeleri için aktarım hızını iyileştirmeye yardımcı olan bir iyileştirme sağlar. Sıralı anahtara sahip olan ve bu nedenle son sayfa ekleme çekişmesi eğilimli dizinlere yöneliktir, ancak B-Tree dizin yapısının diğer alanlarında etkin noktalara sahip dizinlerde de yardımcı olabilir.

Not

Belgelerde genellikle dizinlere başvuruda B ağacı terimi kullanılır. Rowstore dizinlerinde Veritabanı Altyapısı bir B+ ağacı uygular. Bu, bellek için iyileştirilmiş tablolardaki columnstore dizinleri veya dizinleri için geçerli değildir. Daha fazla bilgi içinSQL Server ve Azure SQL dizin mimarisi ve tasarım kılavuzuna bakın.

Veri sıkıştırma

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

Veri sıkıştırma kullanıldığında dizin derleme işlemleri bağlamında dikkate alınacak önemli noktalar şunlardır:

  • Sıkıştırma, sayfada daha fazla satırın depolanmasına izin verebilir, ancak en büyük satır boyutunu değiştirmez.
  • Bir dizinin yaprak olmayan sayfaları sayfa sıkıştırılmaz, ancak satır sıkıştırılabilir.
  • Her bir kümelenmemiş dizinin ayrı bir sıkıştırma ayarı vardır ve temel alınan tablonun sıkıştırma ayarını devralmaz.
  • Kümelenmiş dizin bir yığında oluşturulduğunda, kümelenmiş dizin, alternatif bir sıkıştırma durumu belirtilmediği sürece yığının sıkıştırma durumunu devralır.

Sıkıştırma durumunu değiştirmenin bir tablo, dizin veya bölüm tarafından alan kullanımını nasıl etkilediğini değerlendirmek için sp_estimate_data_compression_savings saklı yordamını kullanın.

XML sıkıştırma

için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümler, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği.

Veri sıkıştırma konusunda dikkat edilmesi gerekenlerin çoğu XML sıkıştırma için geçerlidir. Aşağıdaki noktaları da bilmeniz gerekir:

  • Bölümlerin listesi belirtildiğinde, XML sıkıştırması tek tek bölümlerde etkinleştirilebilir. Bölüm listesi belirtilmezse, tüm bölümler XML sıkıştırması kullanacak şekilde ayarlanır. Tablo veya dizin oluşturulduğunda, aksi belirtilmedikçe XML veri sıkıştırma devre dışı bırakılır. Bir tablo değiştirildiğinde, aksi belirtilmedikçe mevcut sıkıştırma korunur.
  • Bölümlerin listesini veya aralık dışında olan bir bölümü belirtirseniz bir hata oluşturulur.
  • Bir yığında kümelenmiş dizin oluşturulduğunda, alternatif bir sıkıştırma seçeneği belirtilmediği sürece kümelenmiş dizin yığının XML sıkıştırma durumunu devralır.
  • Bir yığının XML sıkıştırma ayarının değiştirilmesi, yığındaki yeni satır konumlarına yönelik işaretçilere sahip olmaları için tablodaki tüm kümelenmemiş dizinlerin yeniden oluşturulmasını gerektirir.
  • XML sıkıştırmasını çevrimiçi veya çevrimdışı olarak etkinleştirebilir veya devre dışı bırakabilirsiniz. Bir yığında sıkıştırmayı etkinleştirmek, çevrimiçi bir işlem için tek iş parçacıklı bir işlemdir.
  • Bölümlenmiş tablodaki bölümlerin XML sıkıştırma durumunu belirlemek için katalog görünümünün sütununu sys.partitions kullanınxml_compression.

Dizin istatistikleri

Bir rowstore dizini oluşturulduğunda, Veritabanı Altyapısı da dizinin anahtar sütunları üzerinde istatistikler oluşturur. sys.stats katalog görünümündeki istatistik nesnesinin adı dizinin adıyla eşleşir. Bölümlenmemiş bir dizin için istatistikler, verilerin tam taraması kullanılarak oluşturulur. Bölümlenmiş dizin için istatistikler varsayılan örnekleme algoritması kullanılarak oluşturulur.

Bir columnstore dizini oluşturulduğunda, Veritabanı Altyapısı sys.stats içinde de bir istatistik nesnesi oluşturur. Bu istatistik nesnesi histogram ve yoğunluk vektörü gibi istatistik verileri içermez. Veritabanı betiği oluşturularak veritabanı kopyası oluşturulurken kullanılır. Bu sırada ve UPDATE STATISTICS ... WITH STATS_STREAM komutları segment, DBCC SHOW_STATISTICS sözlük ve delta deposu boyutu gibi columnstore meta verilerini almak ve bunu columnstore dizinindeki istatistiklere eklemek için kullanılır. Bu meta veriler, normal bir veritabanı için sorgu derleme zamanında dinamik olarak alınır, ancak veritabanı kopyası için istatistik nesnesi tarafından sağlanır. UPDATE STATISTICS komutu, başka bir senaryoda columnstore dizinindeki istatistik nesnesi için desteklenmez.

İzinler

ALTER Tablo veya görünüm veya sabit veritabanı rolü üyeliği üzerinde db_ddladmin izin gerektirir.

Sınırlamalar ve kısıtlamalar

Azure Synapse Analytics ve Analytics Platform Sistemi'nde (PDW) şunları oluşturamazsınız:

  • Bir columnstore dizini zaten mevcut olduğunda veri ambarı tablosunda kümelenmiş veya kümelenmemiş satır deposu dizini. Bu davranış, hem satır deposu hem de columnstore dizinlerinin aynı tabloda birlikte var olmasını sağlayan SMP SQL Server'dan farklıdır.
  • Görünümde dizin oluşturamazsınız.

Meta veriler

Mevcut dizinler hakkındaki bilgileri görüntülemek için sys.indexes katalog görünümünü sorgulayabilirsiniz.

Sürüm notları

  • Azure SQL Veritabanı dışında PRIMARYdosya gruplarını desteklemez.
  • Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği seçenekleri desteklemez FILESTREAM .
  • Columnstore dizinleri SQL Server 2012 (11.x) öncesinde kullanılamaz.
  • Devam ettirilebilen dizin işlemleri SQL Server 2017 (14.x) ile başlayarak, Azure SQL Veritabanı'nda ve Azure SQL Yönetilen Örneği'nde kullanılabilir.

Örnekler: Tüm sürümler. AdventureWorks veritabanını kullanır

A. Basit bir kümelenmemiş satır deposu dizini oluşturma

Aşağıdaki örnekler, VendorID tablosunun Purchasing.ProductVendor sütununda kümelenmemiş bir dizin oluşturur.

CREATE INDEX IX_VendorID ON ProductVendor (VendorID);
CREATE INDEX IX_VendorID ON dbo.ProductVendor (VendorID DESC, Name ASC, Address DESC);
CREATE INDEX IX_VendorID ON Purchasing..ProductVendor (VendorID);

B. Basit bir kümelenmemiş satır deposu bileşik dizini oluşturma

Aşağıdaki örnek, SalesQuota tablosunun SalesYTD ve Sales.SalesPerson sütunlarında kümelenmemiş bileşik dizin oluşturur.

CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD);

C. Başka bir veritabanındaki tabloda dizin oluşturma

Aşağıdaki örnek, VendorID veritabanındaki ProductVendor tablosunun Purchasing sütununda kümelenmiş bir dizin oluşturur.

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID ON Purchasing..ProductVendor (VendorID);

D. Dizine sütun ekleme

Aşağıdaki örnek, dbo'dan iki sütun içeren dizin IX_FF oluşturur. FactFinance tablosu. Sonraki deyim, dizini bir sütun daha ile yeniden oluşturur ve mevcut adı korur.

CREATE INDEX IX_FF ON dbo.FactFinance (FinanceKey ASC, DateKey ASC);

-- Rebuild and add the OrganizationKey
CREATE INDEX IX_FF ON dbo.FactFinance (FinanceKey, DateKey, OrganizationKey DESC)
  WITH (DROP_EXISTING = ON);

Örnekler: SQL Server, Azure SQL Veritabanı

E. Benzersiz bir kümelenmemiş dizin oluşturma

Aşağıdaki örnek, Name veritabanındaki Production.UnitMeasure tablosunun AdventureWorks2022 sütununda benzersiz bir kümelenmemiş dizin oluşturur. Dizin, Name sütununa eklenen veriler üzerinde benzersizliği zorlar.

CREATE UNIQUE INDEX AK_UnitMeasure_Name
  ON Production.UnitMeasure(Name);

Aşağıdaki sorgu, var olan bir satıra aynı değere sahip bir satır eklemeyi deneyerek benzersizlik kısıtlamasını test ediyor.

-- Verify the existing value.
SELECT Name FROM Production.UnitMeasure WHERE Name = N'Ounces';
GO

INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate)
  VALUES ('OC', 'Ounces', GETDATE());

Sonuçta elde edilen hata iletisi:

Server: Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'UnitMeasure' with unique index 'AK_UnitMeasure_Name'. The statement has been terminated.

F. IGNORE_DUP_KEY seçeneğini kullanma

Aşağıdaki örnekte, geçici bir tabloya ilk olarak birden çok satır ekleyerek IGNORE_DUP_KEY seçeneğinin etkisini gösterir ve seçenek ON olarak ayarlanır ve seçenek OFFolarak ayarlanır. #Test tablosuna, ikinci çok satırlı INSERT deyimi yürütülürken kasıtlı olarak yinelenen bir değere neden olacak tek bir satır eklenir. Tablodaki satır sayısı, eklenen satır sayısını döndürür.

CREATE TABLE #Test (C1 NVARCHAR(10), C2 NVARCHAR(50), C3 DATETIME);
GO

CREATE UNIQUE INDEX AK_Index ON #Test (C2)
  WITH (IGNORE_DUP_KEY = ON);
GO

INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO

SELECT COUNT(*) AS [Number of rows] FROM #Test;
GO

DROP TABLE #Test;
GO

İkinci INSERT deyiminin sonuçları aşağıdadır.

Server: Msg 3604, Level 16, State 1, Line 5 Duplicate key was ignored.

Number of rows
--------------
38

Production.UnitMeasure tablosundan eklenen ve benzersizlik kısıtlamasını ihlal etmeyen satırların başarıyla eklendiğine dikkat edin. Bir uyarı verildi ve yinelenen satır yoksayıldı, ancak işlemin tamamı geri alınmadı.

Aynı deyimler yeniden yürütülür, ancak IGNORE_DUP_KEYOFFolarak ayarlanır.

CREATE TABLE #Test (C1 NVARCHAR(10), C2 NVARCHAR(50), C3 DATETIME);
GO

CREATE UNIQUE INDEX AK_Index ON #Test (C2)
  WITH (IGNORE_DUP_KEY = OFF);
GO

INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO

SELECT COUNT(*) AS [Number of rows] FROM #Test;
GO

DROP TABLE #Test;
GO

İkinci INSERT deyiminin sonuçları aşağıdadır.

Server: Msg 2601, Level 14, State 1, Line 5
Cannot insert duplicate key row in object '#Test' with unique index
'AK_Index'. The statement has been terminated.

Number of rows
--------------
1

Production.UnitMeasure tablosundaki yalnızca bir satır UNIQUE dizin kısıtlamasını ihlal etse bile tabloya hiçbir satır eklenmediğini unutmayın.

G. Dizini bırakmak ve yeniden oluşturmak için DROP_EXISTING kullanma

Aşağıdaki örnek, ProductID seçeneğini kullanarak Production.WorkOrder veritabanındaki AdventureWorks2022 tablosunun DROP_EXISTING sütununda var olan bir dizini bırakır ve yeniden oluşturur. FILLFACTOR ve PAD_INDEX seçenekleri de ayarlanır.

CREATE NONCLUSTERED INDEX IX_WorkOrder_ProductID
  ON Production.WorkOrder(ProductID)
    WITH (FILLFACTOR = 80,
      PAD_INDEX = ON,
      DROP_EXISTING = ON);
GO

H. Görünümde dizin oluşturma

Aşağıdaki örnek, bu görünümde bir görünüm ve dizin oluşturur. Dizinli görünümü kullanan iki sorgu eklenir.

-- Set the options to support indexed views
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
  QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO

-- Create view with schemabinding
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL
  DROP VIEW Sales.vOrders;
GO

CREATE VIEW Sales.vOrders
  WITH SCHEMABINDING
AS
  SELECT SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Revenue,
    OrderDate, ProductID, COUNT_BIG(*) AS COUNT
  FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o
  WHERE od.SalesOrderID = o.SalesOrderID
  GROUP BY OrderDate, ProductID;
GO

-- Create an index on the view
CREATE UNIQUE CLUSTERED INDEX IDX_V1
  ON Sales.vOrders (OrderDate, ProductID);
GO

-- This query can use the indexed view even though the view is
-- not specified in the FROM clause.
SELECT SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Rev,
  OrderDate, ProductID
FROM Sales.SalesOrderDetail AS od
  JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID = o.SalesOrderID
    AND ProductID BETWEEN 700 AND 800
    AND OrderDate >= CONVERT(DATETIME, '05/01/2002', 101)
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC;
GO

-- This query can use the above indexed view
SELECT OrderDate, SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Rev
FROM Sales.SalesOrderDetail AS od
  JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID = o.SalesOrderID
    AND DATEPART(mm, OrderDate) = 3
  AND DATEPART(yy, OrderDate) = 2002
GROUP BY OrderDate
ORDER BY OrderDate ASC;
GO

Ben. Dahil edilen (anahtar olmayan) sütunlarla dizin oluşturma

Aşağıdaki örnek, bir anahtar sütunu (PostalCode) ve dört anahtar olmayan sütun (AddressLine1, AddressLine2, City, StateProvinceID) ile kümelenmemiş bir dizin oluşturur. Dizinin kapsadığı sorgu aşağıdaki gibidir. Sorgu iyileştiricisi tarafından seçilen dizini görüntülemek için, SQL Server Management Studio'daki Sorgu menüsünde sorguyu yürütmeden önce Gerçek Yürütme Planını Görüntüle seçin.

CREATE NONCLUSTERED INDEX IX_Address_PostalCode
  ON Person.Address (PostalCode)
  INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN N'98000' and N'99999';
GO

J. Bölümlenmiş dizin oluşturma

Aşağıdaki örnek, TransactionsPS1 veritabanında var olan bir bölüm düzeni olan AdventureWorks2022üzerinde kümelenmemiş bölümlenmiş dizin oluşturur. Bu örnekte bölümlenmiş dizin örneğinin yüklendiği varsayılır.

CREATE NONCLUSTERED INDEX IX_TransactionHistory_ReferenceOrderID
  ON Production.TransactionHistory (ReferenceOrderID)
  ON TransactionsPS1 (TransactionDate);
GO

K. Filtrelenmiş dizin oluşturma

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

CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithEndDate"
  ON Production.BillOfMaterials (ComponentID, StartDate)
  WHERE EndDate IS NOT NULL;

L. Sıkıştırılmış dizin oluşturma

Aşağıdaki örnek, satır sıkıştırma kullanarak bölümlenmemiş bir tabloda dizin oluşturur.

CREATE NONCLUSTERED INDEX IX_INDEX_1
  ON T1 (C2)
  WITH (DATA_COMPRESSION = ROW);
GO

Aşağıdaki örnek, dizinin tüm bölümlerinde satır sıkıştırma kullanarak bölümlenmiş bir tabloda dizin oluşturur.

CREATE CLUSTERED INDEX IX_PartTab2Col1
  ON PartitionTable1 (Col1)
  WITH (DATA_COMPRESSION = ROW);
GO

Aşağıdaki örnek, dizinin bölüm 1 sayfa sıkıştırma ve dizinin 2 aracılığıyla 4 bölümlerde satır sıkıştırma kullanarak bölümlenmiş tabloda bir dizin oluşturur.

CREATE CLUSTERED INDEX IX_PartTab2Col1
  ON PartitionTable1 (Col1)
  WITH (
    DATA_COMPRESSION = PAGE ON PARTITIONS(1),
    DATA_COMPRESSION = ROW ON PARTITIONS (2 TO 4)
  );
GO

M. XML sıkıştırması ile dizin oluşturma

için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümler, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği.

Aşağıdaki örnek, XML sıkıştırması kullanarak bölümlenmemiş bir tabloda dizin oluşturur. Dizindeki en az bir sütun xml veri türü olmalıdır.

CREATE NONCLUSTERED INDEX IX_INDEX_1
  ON T1 (C2)
  WITH (XML_COMPRESSION = ON);
GO

Aşağıdaki örnek, dizinin tüm bölümlerinde XML sıkıştırması kullanarak bölümlenmiş tabloda bir dizin oluşturur.

CREATE CLUSTERED INDEX IX_PartTab2Col1
  ON PartitionTable1 (Col1)
  WITH (XML_COMPRESSION = ON);
GO

N. Sürdürülebilir dizin işlemleri oluşturma, sürdürme, duraklatma ve durdurma

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx1 ON test_table (col1) WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);

-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.

-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx2 ON test_table (col2) WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);

-- Pause a running resumable online index creation
ALTER INDEX test_idx1 ON test_table PAUSE;
ALTER INDEX test_idx2 ON test_table PAUSE;

-- Resume a paused online index creation
ALTER INDEX test_idx1 ON test_table RESUME;
ALTER INDEX test_idx2 ON test_table RESUME;

-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx1 ON test_table ABORT;
ALTER INDEX test_idx2 ON test_table ABORT;

O. Farklı düşük öncelikli kilit seçenekleriyle CREATE INDEX

Aşağıdaki örneklerde, engellemeyle ilgilenmek için farklı stratejiler belirtmek için WAIT_AT_LOW_PRIORITY seçeneği kullanılır.

--Kill this session after waiting 5 minutes
CREATE CLUSTERED INDEX idx_1 ON dbo.T2 (a) WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 5 MINUTES, ABORT_AFTER_WAIT = SELF)));
GO
--Kill blocker sessions
CREATE CLUSTERED INDEX idx_1 ON dbo.T2 (a) WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 5 MINUTES, ABORT_AFTER_WAIT = BLOCKERS)));
GO

Aşağıdaki örnek hem RESUMABLE seçeneğini kullanır hem de iki MAX_DURATION değeri belirtir; birincisi ABORT_AFTER_WAIT seçeneği için, ikincisi RESUMABLE seçeneği için geçerlidir.

--With resumable option; default locking behavior 
CREATE CLUSTERED INDEX idx_1 ON dbo.T2 (a) WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 5 MINUTES, ABORT_AFTER_WAIT = NONE)), RESUMABLE = ON, MAX_DURATION = 240 MINUTES);

Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)

P. Temel söz dizimi

Sürdürülebilir dizin işlemleri oluşturma, sürdürme, duraklatma ve durdurma

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx ON test_table WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);

-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.

-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx ON test_table WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);

-- Pause a running resumable online index creation
ALTER INDEX test_idx ON test_table PAUSE;

-- Resume a paused online index creation
ALTER INDEX test_idx ON test_table RESUME;

-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx ON test_table ABORT;

Q. Geçerli veritabanındaki bir tabloda kümelenmemiş dizin oluşturma

Aşağıdaki örnek, VendorID tablosunun ProductVendor sütununda kümelenmemiş bir dizin oluşturur.

CREATE INDEX IX_ProductVendor_VendorID
  ON ProductVendor (VendorID);

R. Başka bir veritabanındaki tabloda kümelenmiş dizin oluşturma

Aşağıdaki örnek, VendorID veritabanındaki ProductVendor tablosunun Purchasing sütununda kümelenmemiş bir dizin oluşturur.

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID
  ON Purchasing..ProductVendor (VendorID);

S. Tabloda sıralı kümelenmiş dizin oluşturma

Aşağıdaki örnek, c1 veritabanındaki c2 tablosunun T1 ve MyDB sütunlarında sıralı bir kümelenmiş dizin oluşturur.

CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON MyDB.dbo.T1 
ORDER (c1, c2);

T. CCI'yi tablodaki sıralı kümelenmiş dizine dönüştürme

Aşağıdaki örnek, mevcut kümelenmiş columnstore dizinini MyOrderedCCI üzerinde c1 adlı sıralı bir kümelenmiş columnstore dizinine dönüştürür ve c2 veritabanındaki T2 tablosunun MyDB sütunlarını c2.

CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON MyDB.dbo.T2
ORDER (c1, c2)
WITH (DROP_EXISTING = ON);