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 ve SQL Veritabanı için geçerlidir.

Dizin tasarımı yönergeleri hakkında bilgi için SQL Server Dizin Tasarım Kılavuzubakı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 (13.x) ve SQL Veritabanı'dan başlayarak, 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. Görünümdeki kümelenmiş dizin benzersiz olmalıdır.

Veritabanı Altyapısı, IGNORE_DUP_KEY açık olarak ayarlanıp ayarlanmadığı fark etmeksizin, yinelenen değerler içeren sütunlarda benzersiz bir dizin oluşturulmasına izin 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. Benzersiz bir dizin oluşturulduğunda birden çok null değeri yinelenen olarak kabul edildiğinden, benzersiz bir dizinde kullanılan sütunlar NOT NULL olarak ayarlanmalıdır.

KÜMELENMİŞ

Anahtar değerlerinin mantıksal sırasının tablodaki karşılık gelen satırların fiziksel sırasını belirlediği bir dizin oluşturur. Kümelenmiş dizinin alt veya yaprak düzeyi tablonun gerçek veri satırlarını içerir. Tabloya veya görünüme tek seferde bir kümelenmiş dizine izin verilir.

Benzersiz kümelenmiş dizine sahip görünüme dizinli görünüm adı verilir. 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. Kümelenmiş dizin oluşturulduğunda tablolardaki mevcut kümelenmemiş dizinler yeniden oluşturulur.

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

Not

Kümelenmiş dizinin yaprak düzeyi ve veri sayfaları tanıma göre aynı olduğundan, kümelenmiş dizin oluşturma ve ON partition_scheme_name veya ON filegroup_name yan tümcesini kullanma, 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 Dizinleri ve Kısıtlamaları Devre Dışı Bırakma.

KÜMELENMİDİ

Bir tablonun mantıksal sıralamasını belirten bir dizin oluşturur. Kümelenmemiş dizinde, veri satırlarının fiziksel sırası dizine alınan sıralarından bağımsızdır.

Dizinlerin nasıl oluşturulduğundan bağımsız olarak her tabloda 999'a kadar kümelenmemiş dizin olabilir: örtük olarak BİRİnCİl ANAHTAR ve BENZERSİz kısıtlamalarıyla veya açıkça CREATE INDEXile.

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 görünüm tanımı, CREATE INDEX deyiminde başvurulmasa bile ntext, metinveya resim sütunlarını 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 olarak 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ı INCLUDE listesinde tekrarlanamaz ve hem anahtar hem de anahtar olmayan sütunlar olarak aynı anda kullanılamaz. Tabloda kümelenmiş dizin tanımlanmışsa, kümelenmemiş dizinler her zaman 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 (11.x) ve Azure SQL Veritabanı'dan başlayarak, belirtilen anahtar olmayan sütunlardan herhangi biri varchar(max), nvarchar(max)veya varbinary(max) veri türleriyse, dizin ÇEVRİmİÇİ seçeneği kullanılarak oluşturulabilir veya yeniden oluşturulabilir.

Belirleyici ve kesin veya kesin olmayan hesaplanan sütunlar dahil edilebilir. , ntext, metin, varchar(max), nvarchar(max)görüntüden türetilen hesaplanan sütunlar ), varbinary(max)ve xml veri türleri, hesaplanan sütun veri türleri dahil edilen sütun olarak izin verilenler sürece anahtar olmayan sütunlara eklenebilir. Daha fazla bilgi için bkz.Hesaplanan Sütunlarda 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, UDT sütununa, uzamsal veri türü sütununa veya hiyerarşiKIM veri türü sütununa başvuramaz. karşılaştırma işleçleriyle NULL değişmez değerleri kullanan 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. BENZERSİz dizinler için 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, bölümlenmiş dizinin bölümlendirileceğ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. Benzersiz bir dizin bölümlenmesi dışında temel tablodaki herhangi bir sütun belirtilebilir column_name benzersiz anahtar olarak kullanılanlar arasından 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 hakkında daha fazla bilgi için bölümlenmiş tablolar ve dizinler.

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 "varsayılan"

Tablo veya görünümle aynı dosya grubunda veya bölüm düzeninde 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 ON "default" veya ON [default]gibi sınırlandırılmalıdır. "Varsayılan" belirtilirse, geçerli oturum için QUOTED_IDENTIFIER seçeneği ON olmalıdır. Bu varsayılan ayardır. Daha fazla bilgi için bkz. set QUOTED_IDENTIFIER.

Not

"default" CREATE INDEXbağlamında veritabanı varsayılan dosya grubunu göstermez. Bu, CREATE TABLEfarklıdır; burada "varsayılan" veritabanı varsayılan dosya grubundaki tabloyu bulur.

[ 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ı.

Üzerinde dizin oluşturmak için görünümün SCHEMABINDING ile tanımlanması gerekir. Herhangi bir kümelenmemiş dizin oluşturulmadan önce görünümde benzersiz bir kümelenmiş dizin oluşturulmalıdır. Dizine alınan görünümler hakkında daha fazla bilgi için Açıklamalar bölümüne bakın.

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

Azure SQL Veritabanı, database_nameüç parçalı ad biçimini destekler. [schema_name]. database_name geçerli veritabanı olduğunda veya database_nametempdb olduğunda ve object_name # ile başladığındaobject_name.

<relational_index_option>::=

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

PAD_INDEX = { ON | KAPALI }

Dizin doldurmayı belirtir. Varsayılan ayar OFF'dir.

ÜZERİNDE
fillfactor tarafından belirtilen boş alan yüzdesi, dizinin ara düzey sayfalarına uygulanır.

OFF veya fillfactor belirtilmedi
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.

PAD_INDEX seçeneği yalnızca FILLFACTOR belirtildiğinde yararlıdır çünkü PAD_INDEX FILLFACTOR tarafından belirtilen yüzdeyi kullanır. FILLFACTOR için 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ı, fillfactordeğerinin ne 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.

Doldurma faktörü ayarını görüntülemek için, sys.indexesiçindeki fill_factor kullanın.

Önemli

100'den küçük bir FILLFACTOR ile kümelenmiş dizin oluşturmak, Veritabanı Altyapısı kümelenmiş dizini oluştururken verileri yeniden dağıttığından verilerin kapladığı depolama alanı miktarını etkiler.

Daha fazla bilgi için bkz. Diziniçin Dolgu Faktörü Belirtme.

SORT_IN_TEMPDB = { ON | KAPALI }

Geçici sıralama sonuçlarının tempdbiçinde depolanıp depolanmayacağını belirtir. Varsayılan değer Azure SQL Veritabanı Hiper Ölçek dışında OFF . Hiper Ölçek'teki tüm dizin derleme işlemleri için, devam ettirilebilir dizin yeniden oluşturma kullanılmadığı sürece belirtilen seçenek ne olursa olsun SORT_IN_TEMPDB her zaman AÇıK olur.

ÜZERİNDE
Dizini oluşturmak için kullanılan ara sıralama sonuçları tempdbiçinde depolanır. Bu, tempdb kullanıcı veritabanından farklı bir disk kümesindeyse 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 aynı miktarda ek alana sahip olmalıdır. Daha fazla bilgi için bkz. dizinleriç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 ayar OFF'dir.

Ü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 başarısız olur.

KAPALI
Benzersiz bir dizine yinelenen anahtar değerleri eklendiğinde bir hata iletisi oluşur. INSERT işleminin tamamı 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 ON olarak ayarlanamaz.

IGNORE_DUP_KEYgörüntülemek için sys.indexeskullanın.

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

STATISTICS_NORECOMPUTE = { ON | KAPALI}

Dağıtım istatistiklerinin yeniden derlenip birleştirilmeyeceğini belirtir. Varsayılan ayar OFF'dir.

Ü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 NORECOMPUTE yan tümcesi olmadan UPDATE STATISTICS yürütür.

Önemli

Dağıtım istatistiklerinin otomatik olarak yeniden derlenmesinin devre dışı bırakılması, sorgu iyileştiricisinin tabloyla ilgili sorgular için en uygun yürütme planlarını seçmesini engelleyebilir.

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

STATISTICS_INCREMENTAL = { ON | KAPALI }

için geçerlidir: SQL Server (SQL Server 2014 (12.x) ile başlayarak) ve Azure SQL Veritabanı

on, oluşturulan istatistikler bölüm istatistiklerine göredir. OFFistatistik ağacı bırakılır ve SQL Server istatistikleri yeniden hesaplar. Varsayılan ayar OFF'dir.

Bölüm başına istatistikler desteklenmiyorsa seçenek yoksayılır ve bir uyarı oluşturulur. Artımlı istatistikler aşağıdaki istatistik türleri için 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 ayar OFF'dir.

Ü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 ayar OFF'dir.

Ö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 Bir Amaç Paylaşımı (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 çok kısa bir süre için Paylaşılan (S) kilidi tutulur. İşlemin sonunda, kısa bir süre için, kümelenmemiş bir dizin oluşturulursa kaynakta bir S (Paylaşılan) kilidi alınır. Kümelenmiş dizin çevrimiçi oluşturulduğunda veya bırakıldığında ve kümelenmiş veya kümelenmemiş bir dizin yeniden oluşturulurken bir Sch-M (Şema Değişikliği) kilidi alınır. Yerel geçici tabloda bir dizin oluşturulurken ONLINE ayarı ON olarak ayarlanamaz.

Not

Çevrimiçi dizin oluşturma, seçeneklerini ayarlayabilir, bkz.çevrimiçi dizin işlemleriyle WAIT_AT_LOW_PRIORITY.

KAPALI
Tablo kilitleri dizin işlemi süresi boyunca uygulanır. Kümelenmiş dizini oluşturan, yeniden derleyen veya düşüren ya da kümelenmemiş bir dizini yeniden oluşturan veya düşüren, tabloda şema değişikliği (Sch-M) kilidi alan çevrimdışı dizin işlemi. 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, tabloda Paylaşılan (S) kilidi alır. Bu, temel tablo güncelleştirmelerini engeller, ancak SELECT deyimleri gibi okuma işlemlerine izin verir.

Daha fazla bilgi için bkz. Dizin İşlemlerini Çevrimiçi Gerçekleştirme.

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 daha eski sürümlerinde kümelenmiş columnstore dizinleri
  • SQL Server 2016 (13.x)) ve daha eski sürümlerinde 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)) ve Azure SQL Veritabanı'nda bir tabloda varchar(max) veya varbinary(max) sütunları bulunduğunda, diğer sütunları içeren kümelenmiş dizin ONLINE seçeneği kullanılarak oluşturulabilir veya 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 (SQL Server 2019 (15.x)'den başlayarak) ve Azure SQL Veritabanı

Çevrimiçi dizin işleminin devam ettirilebilir olup olmadığını belirtir.

ÜZERİNDE
Dizin işlemi devam ettirilebilir.

KAPALI
Dizin işlemi devam ettirilemez.

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

için geçerlidir: SQL Server (SQL Server 2019 (15.x)'den başlayarak) ve Azure SQL Veritabanı

Duraklatılmadan önce devam ettirilebilen çevrimiçi dizin işleminin yürütüldüğünü gösteren zamanı (dakika cinsinden belirtilen tamsayı değeri).

Önemli

Çevrimiçi olarak gerçekleştirilebilecek dizin işlemleri hakkında daha ayrıntılı bilgi için bkz. Çevrimiçi Dizin İşlemleriyönergeleri .

Not

Devam ettirilebilen çevrimiçi dizin yeniden derlemeleri columnstore dizinlerinde veya devre dışı bırakılmış dizinlerde desteklenmez.

ALLOW_ROW_LOCKS = { ON | KAPALI }

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

Ü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'dır.

Ü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 (SQL Server 2019 (15.x)'den başlayarak) ve Azure SQL Veritabanı

Son sayfa ekleme çekişmesi için iyileştirilip iyileştirilmeyeceğini belirtir. Varsayılan ayar OFF'dir. Daha fazla bilgi için sıralı anahtarlar bölümüne bakın.

MAXDOP = max_degree_of_parallelism

Dizin işlemi boyunca 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. 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 olabilir:

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

>1
Paralel dizin işleminde kullanılan işlemci sayısı üst sınırını, geçerli sistem iş yüküne göre belirtilen sayıda veya daha az işlemciyle kısıtlar.

0 (varsayılan)
Geçerli sistem iş yüküne göre gerçek işlemci sayısını veya daha azını kullanır.

Daha fazla bilgi için bkz. Paralel Dizin İş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ılmaz.

SIRA
Dizin veya belirtilen bölümler satır sıkıştırma kullanılarak sıkıştırılır.

SAYFA
Dizin veya belirtilen bölümler sayfa sıkıştırma kullanılarak sıkıştırılır.

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

XML_COMPRESSION

için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümler, 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 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şkeni 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>, to sözcüğüyle ayrı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

CREATE INDEX deyimi diğer sorgular gibi iyileştirilmiştir. G/Ç işlemlerinde kaydetmek için sorgu işlemcisi 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şlemlerini gerçekleştirmek için daha fazla işlemci kullanabilir. Daha fazla bilgi için bkz. Paralel Dizin İşlemlerini Yapılandırma.

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

Dizinler geçici bir tabloda oluşturulabilir. Tablo bırakıldığında veya oturum sona erdiğinde dizinler bırakılır.

Kümelenmiş dizin, Birincil Anahtar oluşturulduğunda bir tablo değişkeni üzerinde oluşturulabilir. Sorgu tamamlandığında veya oturum sona erdiğinde dizin 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ş Dizin oluşturma ve SQL Server Dizin Mimarisi ve Tasarım Kılavuzu.

Kümelenmemiş dizinler

SQL Server 2016'dan (13.x) başlayarak ve Azure SQL Veritabanı'nda 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 kalıcı olur. Kümelenmiş columnstore dizinini yeniden oluştururken, kümelenmemiş dizini bırakmanız da gerekmez.

Sınırlamalar ve Kısıtlamalar:

  • 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ı, ekleme işlemleri tarafından her veri eklendiğinde yinelenen değerleri denetler. Yinelenen anahtar değerleri oluşturacak ekleme işlemleri geri alınır ve Veritabanı Altyapısı bir hata iletisi görüntüler. Ekleme işlemi birçok satırı değiştirse ancak yalnızca bir yinelemeye neden olsa bile bu durum geçerlidir. Benzersiz bir dizin içeren verileri girmeye çalışılırsa ve IGNORE_DUP_KEY yan tümcesi AÇILDI olarak ayarlanırsa, yalnızca UNIQUE dizinini ihlal eden satırlar başarısız olur.

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 ve SQL Server Dizin Mimarisi ve Tasarım Kılavuzu.

SQL Server'da, bölümlenmiş dizin oluşturulduğunda veya yeniden oluşturulduğunda tablodaki tüm satırlar taranarak istatistikler oluşturulmaz. Bunun yerine, sorgu iyileştiricisi istatistikleri oluşturmak için varsayılan örnekleme algoritmasını kullanır. Tablodaki tüm satırları tarayarak bölümlenmiş dizinlerle ilgili istatistikleri almak için FULLSCAN yan tümcesiyle CREATE STATISTICS veya UPDATE STATISTICS 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

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

  • Filtrelenmiş dizin oluşturma.

  • INSERT, UPDATE, DELETE veya MERGE işlemi 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çenekleri Gerekli değer Varsayılan sunucu değeri Temerrüt

    OLE DB ve ODBC değeri
    Temerrüt

    DB-Library değeri
    ANSI_NULLS ÜZERİNDE ÜZERİNDE ÜZERİNDE KAPALI
    ANSI_PADDING ÜZERİNDE ÜZERİNDE ÜZERİNDE KAPALI
    ANSI_WARNINGS* ÜZERİNDE ÜZERİNDE ÜZERİNDE KAPALI
    ARITHABORT ÜZERİNDE ÜZERİNDE KAPALI KAPALI
    CONCAT_NULL_YIELDS_NULL ÜZERİNDE ÜZERİNDE ÜZERİNDE KAPALI
    NUMERIC_ROUNDABORT KAPALI KAPALI KAPALI KAPALI
    QUOTED_IDENTIFIER ÜZERİNDE ÜZERİNDE ÜZERİNDE KAPALI
    • veritabanı uyumluluk düzeyi 90 veya üzeri olarak ayarlandığında ANSI_WARNINGS AÇıK olarak ayarlandığında, ARITHABORT örtük olarak ON olarak ayarlanır. Veritabanı uyumluluk düzeyi 80 veya daha eski bir değere ayarlanmışsa, ARITHABORT seçeneğinin açıkça AÇIK olarak ayarlanması 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 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 eylemleri başarısız olur. Kümelenmiş dizinin dizin anahtarı, ROW_OVERFLOW_DATA ayırma biriminde var olan veriler içeren varchar sütun içeremez. Bir varchar sütununda kümelenmiş dizin oluşturulursa ve mevcut veriler IN_ROW_DATA ayırma birimindeyse, sütunda verileri satır dışına itecek sonraki ekleme veya güncelleştirme eylemleri başarısız olur.

Kümelenmemiş dizinler, dizinin yaprak düzeyinde anahtar olmayan 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. Dahil Edilen 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 PERSISTED özelliğine sahip 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 PERSISTED özelliğinin kullanılması, dizine alınabilen hesaplanabilir 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ş dizinleriçin gerekli SET Seçenekleri önceki bölümde gösterildiği gibi aşağıdaki SET seçeneklerinin ayarlanmasını gerektirir.

BENZERSIZ veya BİRİnCİl ANAHTAR kısıtlaması, 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 hatayla sonuçlandığında böyle bir hata oluşabilir. Örneğin, aşağıdaki tabloda hesaplanan sütun c aritmetik bir hataya neden olsa da INSERT deyimi çalışır.

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

Bunun yerine, tabloyu oluşturduktan sonra chesaplanan sütunda bir dizin oluşturursanız, aynı INSERT deyimi artık 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ütunlarda 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ştiricisinin dizin taramasından gerekli tüm bilgileri bulmasını sağlar; tabloya veya kümelenmiş dizin verilerine erişilir. Daha fazla bilgi için bkz. Dahil Edilen 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_nameWITH (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 bİrİnCİl ANAHTAR veya BENZERSİz 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. BİrİnCİl ANAHTAR veya BENZERSİz kısıtlamasının 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ış olan 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.

DROP_EXISTING yan tümcesi, dizin deyimi kümelenmemiş bir dizin belirtmediği ve ÇEVRİmİÇİ seçeneği KAPALI olarak ayarlanmadığı sürece, aynı dizin anahtarı sütunları aynı sırada ve aynı artan veya azalan düzende kullanılırsa verileri yeniden sıralamaz. Kümelenmiş dizin devre dışı bırakılırsa, çevrimiçi ayarı KAPALI olarak ayarlanmış CREATE INDEX WITH DROP_EXISTING işlemi gerçekleştirilmelidir. Kümelenmemiş dizin devre dışı bırakılırsa ve devre dışı bırakılmış bir kümelenmiş dizinle ilişkilendirilmemişse, çevrimiçi olarak OFF veya ON olarak ayarlanmış CREATE INDEX WITH DROP_EXISTING işlemi 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.

Ç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.
  • low_priority_lock_wait bağımsız değişken seçeneği, dizin işleminin Sch-M kilidinde engellendiğinde nasıl ilerleyebileceğine karar vermenizi sağlar.

Daha fazla bilgi için bkz. Dizin İşlemlerini Çevrimiçi Gerçekleştirme.

Kaynaklar

Devam ettirilebilen çevrimiçi dizin oluşturma işlemi için aşağıdaki kaynaklar gereklidir:

  • Dizinin duraklatıldığı zaman da dahil olmak üzere, dizinin oluşturulmaya devam etmesi 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.
  • DDL değişikliklerini engelleyen DDL durumu
  • Hayalet temizleme, hem duraklatılırken hem de işlem çalışırken işlem süresi boyunca derleme içi dizinde engellenir.

Geçerli işlevsel sınırlamalar

Devam ettirilebilen dizin oluşturma işlemleri için aşağıdaki işlevler devre dışıdır:

  • Devam ettirilebilen çevrimiçi dizin oluşturma işlemi duraklatıldıktan sonra MAXDOP'un ilk değeri değiştirilemez

  • Aşağıdakiler içeren bir dizin oluşturun:

    • Anahtar sütun olarak hesaplanan veya TIMESTAMP sütunları
    • Devam ettirilebilen dizin oluşturma için lob sütunu dahil edilen sütun
    • Filtrelenmiş dizin

Devam ettirilebilen dizin işlemleri

için geçerlidir: SQL Server (SQL Server 2019 (15.x)'den başlayarak) ve Azure SQL Veritabanı

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

  • Çevrimiçi dizin oluşturma, RESUMABLE = ON seçeneği kullanılarak devam ettirilebilir olarak belirtilir.
  • RESUMABLE seçeneği belirli bir dizinin meta verilerinde kalıcı değildir ve yalnızca geçerli bir 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.
  • MAX_DURATION seçeneği yalnızca RESUMABLE = ON seçeneği için desteklenir.
  • RESUMABLE için MAX_DURATION seçeneği, oluşturulan bir dizinin zaman aralığını belirtir. Bu süre kullanıldıktan sonra dizin derlemesi duraklatılır veya yürütmesini tamamlar. Duraklatılmış dizin için bir derlemenin ne zaman sürdürülebileceğine kullanıcı karar verir. MAX_DURATION için dakika cinsinden süre 0 dakikadan uzun ve bir haftadan kısa veya eşit olmalıdır (7 * 24 * 60 = 10080 dakika). Dizin işlemi için uzun bir duraklama olması, hem özgün hem de yeni oluşturulan dizin için disk alanı gerektirdiğinden ve DML işlemleri sırasında güncelleştirilmiş olması gerektiğinden, belirli bir tablodaki DML performansını ve veritabanı disk kapasitesini etkileyebilir. MAX_DURATION seçenek atlanırsa, dizin işlemi tamamlanıncaya kadar veya bir hata oluşana kadar devam eder.
  • Dizin işlemini hemen duraklatmak için devam eden komutu durdurabilir (Ctrl-C), ALTER INDEX PAUSE komutunu yürütebilir veya KILL <session_id> komutunu yürütebilirsiniz. Komut duraklatıldıktan sonra ALTER INDEX komutu kullanılarak sürdürülebilir.
  • Sürdürülebilir dizin için özgün CREATE INDEX deyimini yeniden yürütürken, duraklatılmış dizin oluşturma işlemi otomatik olarak sürdürülür.
  • SORT_IN_TEMPDB = ON seçeneği, devam ettirilebilen dizin için desteklenmez.
  • RESUMABLE = ON içeren DDL komutu açık bir işlem içinde yürütülemez (başlangıç TRAN ... COMMIT bloğunun parçası olamaz).
  • Dizin oluşturmayı/yeniden derlemeyi sürdürmek/durdurmak için T-SQL söz dizimini ALTER INDEX kullanın.
  • Devre dışı bırakılan dizinler desteklenmez.

Not

DDL komutu tamamlanana, duraklatılana veya başarısız olana kadar çalışır. Komutun duraklatılması durumunda işlemin duraklatıldığını ve dizin oluşturma işleminin tamamlanmadığını belirten bir hata verilir. Geçerli dizin durumu hakkında daha fazla bilgi için sys.index_resumable_operations. Bir hata durumunda olduğu gibi bir hata da verilir.

Dizin oluşturma işleminin devam ettirilebilir işlem olarak yürütüldüğünü belirtmek ve geçerli yürütme durumunu denetlemek için bkz. sys.index_resumable_operations.

Çevrimiçi dizin işlemleriyle WAIT_AT_LOW_PRIORITY

için geçerlidir: CREATE INDEX için bu söz dizimi şu anda yalnızca SQL Server 2022 (16.x), Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği için geçerlidir. ALTER INDEXiçin bu söz dizimi SQL Server (SQL Server 2014 (12.x) ile başlayarak) ve Azure SQL Veritabanı için geçerlidir. Daha fazla bilgi için bkz. ALTER INDEX.

low_priority_lock_wait söz dizimi, WAIT_AT_LOW_PRIORITY davranışın belirtilmesine olanak tanır. WAIT_AT_LOW_PRIORITY yalnızca ONLINE=ON ile kullanılabilir.

WAIT_AT_LOW_PRIORITY seçeneği, DTA'ların çevrimiçi dizin oluşturma için gereken Sch-S ve Sch-M kilitlerini yönetmesine olanak tanır ve 3 seçenekten birini belirlemelerine olanak tanır. Tüm 3 durumda, bekleme süresi MAX_DURATION = n [minutes]sırasında hiçbir engelleme etkinliği yoksa, çevrimiçi dizin yeniden oluşturma işlemi beklemeden hemen yürütülür ve DDL deyimi tamamlanır.

WAIT_AT_LOW_PRIORITY, çevrimiçi dizin oluşturma işleminin düşük öncelikli kilitleri bekleyeceğini ve çevrimiçi dizin oluşturma işlemi beklerken diğer işlemlerin devam etmelerine olanak tanıyacağını gösterir. 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 = saat [MINUTES]

Çevrimiçi dizinin kilit oluşturduğu bekleme süresi (dakika cinsinden belirtilen tamsayı değeri), DDL komutunu yürütürken düşük öncelikli olarak bekler. İşlem MAX_DURATION süreyle engellenirse, belirtilen ABORT_AFTER_WAIT eylemi yürütülür. süre her zaman dakika cinsindendir ve DAKIKA sözcüğü atlanabilir.

ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]

HİÇBİRİ Normal (normal) önceliğe sahip kilidi beklemeye devam edin.

SELF Çevrimiçi dizinden çıkın, şu anda yürütülmekte olan DDL işlemini hiçbir işlem yapmadan oluşturun. SELF seçeneği 0 ile kullanılamaz.

ENGELLEYICILER İşlemin devam edebilmesi için çevrimiçi dizin yeniden oluşturma DDL işlemini engelleyen tüm kullanıcı işlemlerini kapatın. ENGELLEYICIler seçeneği, oturum açma işleminin ALTER ANY CONNECTION iznine sahip olmasını gerektirir.

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.

Sıralı anahtarlar

için geçerlidir: SQL Server (SQL Server 2019 (15.x)'den başlayarak) ve Azure SQL Veritabanı

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, bellekteki sayfa için çekişmeye yol açar ve söz konusu sayfa için PAGELATCH_EX bekleyen birkaç iş parçacığı olarak gözlemlenebilir.

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.

Dizin bilgilerini görüntüleme

Dizinler hakkında bilgi döndürmek için katalog görünümlerini, sistem işlevlerini ve sistem saklı yordamlarını kullanabilirsiniz.

Veri sıkıştırma

Veri sıkıştırma, veri sıkıştırmakonusunda açıklanmıştır. Dikkate alınması gereken ö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.

Bölümlenmiş dizinler için aşağıdaki kısıtlamalar geçerlidir:

  • Tabloda hizalanmamış dizinler varsa tek bir bölümün sıkıştırma ayarını değiştiremezsiniz.
  • ALTER INDEX <index> ... REBUILD PARTITION ... söz dizimi dizinin belirtilen bölümünü yeniden oluşturur.
  • ALTER INDEX <index> ... REBUILD WITH ... söz dizimi dizinin tüm bölümlerini yeniden oluşturur.

Sıkıştırma durumunu değiştirmenin bir tabloyu, dizini veya bölümü nasıl etkileyeceğini değerlendirmek için saklı sp_estimate_data_compression_savings 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ırmayla ilgili dikkat edilmesi gerekenlerin çoğu XML sıkıştırması için de 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ş bir tablodaki bölümlerin XML sıkıştırma durumunu belirlemek için, sys.partitions katalog görünümünün xml_compression sütununu sorgula.

İzinler

db_ddladmin sabit veritabanı rolündeki tabloda veya görünümde veya üyelikte ALTER 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ı

SQL Veritabanı dosya grubu ve dosya akışı seçeneklerini desteklemez.

Ö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, Purchasing.ProductVendor tablosunun VendorID 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, Sales.SalesPerson tablosunun SalesQuota ve SalesYTD 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, Purchasing veritabanındaki ProductVendor tablosunun VendorID 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, AdventureWorks2022 veritabanındaki Production.UnitMeasure tablosunun Name 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, DROP_EXISTING seçeneğini kullanarak AdventureWorks2022 veritabanındaki Production.WorkOrder tablosunun ProductID 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, AdventureWorks2022 veritabanında var olan bir bölüm düzeni olan TransactionsPS1ü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 4 aracılığıyla 2 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 (SQL Server 2019 (15.x)'den başlayarak) ve Azure SQL Veritabanı

-- 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 (SQL Server 2019 (15.x)'den başlayarak) ve Azure SQL Veritabanı

-- 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, ProductVendor tablosunun VendorID 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, Purchasing veritabanındaki ProductVendor tablosunun VendorID 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, MyDB veritabanındaki T1 tablosunun c1 ve c2 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 c1 üzerinde MyOrderedCCI adlı sıralı bir kümelenmiş columnstore dizinine dönüştürür ve MyDB veritabanındaki T2 tablosunun c2 sütunlarını MyDB.

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

Ayrıca bkz.