Aracılığıyla paylaş


ALTER İNDEKSİ (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitik Platform Sistemi (PDW)Microsoft Fabric'te SQL veritabanı

Varolan bir tabloyu veya görünüm dizinini (rowstore, columnstore veya XML) devre dışı bırakarak, yeniden oluşturarak veya yeniden düzenleyerek değiştirir; veya dizindeki seçenekleri ayarlayarak.

Transact-SQL söz dizimi kuralları

Syntax

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

ALTER INDEX { index_name | ALL } ON <object>
{
      REBUILD {
            [ PARTITION = ALL [ WITH ( <rebuild_index_option> [ , ...n ] ) ] ]
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> [ , ...n ] ) ] ]
      }
    | DISABLE
    | REORGANIZE  [ PARTITION = partition_number ] [ WITH ( <reorganize_option>  ) ]
    | SET ( <set_index_option> [ , ...n ] )
    | RESUME [ WITH (<resumable_index_option> [ , ...n ] ) ]
    | PAUSE
    | ABORT
}
[ ; ]

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

<rebuild_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 }
    | ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }
    | RESUMABLE = { ON | OFF }
    | MAX_DURATION = <time> [ MINUTES ]
    | ALLOW_ROW_LOCKS = { ON | OFF }
    | ALLOW_PAGE_LOCKS = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ]
    | XML_COMPRESSION = { ON | OFF }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ] }

<single_partition_rebuild_index_option> ::=
{
      SORT_IN_TEMPDB = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | RESUMABLE = { ON | OFF }
    | MAX_DURATION = <time> [ MINUTES ]
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
    | XML_COMPRESSION = { ON | OFF }
    | ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }
}

<reorganize_option> ::=
{
       LOB_COMPACTION = { ON | OFF }
    |  COMPRESS_ALL_ROW_GROUPS =  { ON | OFF }
}

<set_index_option> ::=
{
      ALLOW_ROW_LOCKS = { ON | OFF }
    | ALLOW_PAGE_LOCKS = { ON | OFF }
    | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
    | IGNORE_DUP_KEY = { ON | OFF }
    | STATISTICS_NORECOMPUTE = { ON | OFF }
    | COMPRESSION_DELAY = { 0 | delay [ Minutes ] }
}

<resumable_index_option> ::=
 {
    MAXDOP = max_degree_of_parallelism
    | MAX_DURATION = <time> [ MINUTES ]
    | <low_priority_lock_wait>
 }

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

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

ALTER INDEX { index_name | ALL }
    ON [ schema_name. ] table_name
{
      REBUILD {
            [ PARTITION = ALL [ WITH ( <rebuild_index_option> ) ] ]
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> ) ] ]
      }
    | DISABLE
    | REORGANIZE [ PARTITION = partition_number ]
}
[ ; ]

<rebuild_index_option> ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ]
    | XML_COMPRESSION = { ON | OFF }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ]
}

<single_partition_rebuild_index_option> ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
    | XML_COMPRESSION = { ON | OFF }
}

Arguments

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 kurallarına uymalıdır.

ALL

Dizin türünden bağımsız olarak tablo veya görünümle ilişkili tüm dizinleri belirtir. Belirtilmesi ALL , bir veya daha fazla dizin çevrimdışı veya salt okunur bir dosya grubundaysa veya belirtilen işleme bir veya daha fazla dizin türünde izin verilmiyorsa deyiminin başarısız olmasına neden olur. Aşağıdaki tabloda dizin işlemleri ve izin verilmeyen dizin türleri listelenmiştir.

Bu işlemle anahtar sözcüğünü ALL kullanma Tabloda bir veya daha fazla varsa başarısız oluyor
REBUILD WITH ONLINE = ON XML dizini

Uzamsal dizin

Yalnızca SQL Server 2017 (14.x) ve eski sürümlerde Columnstore dizini. Sonraki sürümler columnstore dizinlerinin çevrimiçi yeniden oluşturulmasını destekler.
REBUILD PARTITION = <partition_number> Bölümlenmemiş dizin, XML dizini, uzamsal dizin veya devre dışı bırakılmış dizin
REORGANIZE Olarak ayarlanmış dizinler ALLOW_PAGE_LOCKSOFF
REORGANIZE PARTITION = <partition_number> Bölümlenmemiş dizin, XML dizini, uzamsal dizin veya devre dışı bırakılmış dizin
IGNORE_DUP_KEY = ON XML dizini

Uzamsal dizin

Columnstore dizini
ONLINE = ON XML dizini

Uzamsal dizin

Columnstore dizini
RESUMABLE = ON Anahtar sözcüğüyle desteklenmeyen ALL devam ettirilebilen dizinler

ile ALLbelirtilirsePARTITION = <partition_number>, tüm dizinler hizalanmalıdır. Bu, eşdeğer bölüm işlevlerine göre bölümlendikleri anlamına gelir. ALL ile kullanmakPARTITION, aynı <partition_number> olan tüm dizin bölümlerinin yeniden oluşturulmasına veya yeniden düzenlenmesine neden olur. Bölümlenmiş dizinler hakkında daha fazla bilgi için bkz . Bölümlenmiş tablolar ve dizinler.

Çevrimiçi dizin işlemleri hakkında daha fazla bilgi için bkz. Çevrimiçi dizin işlemleri için yönergeler.

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

Dizinle ilişkili tablonun veya görünümün adı. Tablo veya görünümün dizin ayrıntılarını görüntülemek için sys.indexes katalog görünümünü kullanın.

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

YENIDEN INŞA ET [ ILE ( <rebuild_index_option> [ ,... n ] ) ] ]

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

Dizinin aynı sütunlar, dizin türü, benzersizlik özniteliği ve sıralama düzeni kullanılarak yeniden oluşturulduğunu belirtir. REBUILD devre dışı bırakılmış bir dizini etkinleştirir. Kümelenmiş bir dizinin yeniden oluşturulması, anahtar sözcük ALL belirtilmediği sürece ilişkili kümelenmemiş dizinleri yeniden oluşturmaz. Dizin seçenekleri belirtilmezse sys.indexes dosyasındaki mevcut dizin seçeneği değerleri uygulanır. değeri içinde sys.indexesgörünmeyen herhangi bir dizin seçeneği için, seçeneğin bağımsız değişken tanımında belirtilen varsayılan değer uygulanır.

Belirtilirse ALL ve temel alınan tablo bir yığınsa, yeniden oluşturma işleminin yığın üzerinde hiçbir etkisi yoktur. Tabloyla ilişkili tüm kümelenmemiş dizinler yeniden oluşturulur.

REBUILD Veritabanı kurtarma modeli toplu olarak günlüğe kaydedildiyse veya basitse işlem en düşük düzeyde günlüğe kaydedilebilir.

Birincil XML dizinini yeniden oluştururken, temel alınan kullanıcı tablosu dizin işlemi boyunca kullanılamaz.

columnstore dizinleri için yeniden oluşturma işlemi:

  • Tüm verileri columnstore'a yeniden sıkıştırın. Yeniden oluşturma işlemi devam ederken columnstore dizininin iki kopyası vardır. Yeniden derleme tamamlandığında Veritabanı Altyapısı özgün columnstore dizinini siler.
  • Varsa sıralama düzenini korumaz. Columnstore dizinini yeniden oluşturmak ve sıralama düzenini korumak veya tanıtmak için deyimini CREATE [CLUSTERED] COLUMNSTORE INDEX ... ORDER (...) ... WITH (DROP_EXISTING = ON) kullanın.

Daha fazla bilgi için bkz. Sorgu performansını geliştirmek ve kaynak tüketimini azaltmak için dizin bakımını iyileştirme.

PARTITION

Dizinin yalnızca bir bölümünün yeniden derlendiğini veya yeniden düzenlendiğini belirtir. PARTITION bölümlenmiş dizin index_name belirtilemiyor.

PARTITION = ALL tüm bölümleri yeniden oluşturur.

Warning

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

  • partition_number

    Yeniden oluşturulacak veya yeniden düzenlenecek bölümlenmiş dizinin bölüm numarası. partition_number , değişkenlere başvurabilen sabit bir ifadedir. Bunlar kullanıcı tanımlı tür değişkenlerini veya işlevlerini ve kullanıcı tanımlı işlevleri içerir, ancak Transact-SQL deyimine başvuramaz. partition_number var olması gerekir veya deyimi başarısız olur.

  • ILE ( <single_partition_rebuild_index_option> )

    SORT_IN_TEMPDB, MAXDOP, DATA_COMPRESSIONve XML_COMPRESSION söz dizimini kullanarak (PARTITION = partition_number) tek bir bölümü yeniden oluştururken belirtilebilen seçeneklerdir. XML dizinleri tek bir bölüm yeniden oluşturma işleminde belirtilemiyor.

DISABLE

Dizini devre dışı olarak işaretler ve Veritabanı Altyapısı tarafından kullanılamaz. Tüm dizinler devre dışı bırakılabilir. Devre dışı bırakılmış bir dizinin dizin tanımı, temel alınan dizin verileri olmadan sistem kataloğunda kalır. Kümelenmiş dizini devre dışı bırakmak, temel alınan tablo verilerine kullanıcı erişimini engeller. Dizini etkinleştirmek için veya ALTER INDEX REBUILDkullanınCREATE INDEX WITH DROP_EXISTING. Daha fazla bilgi için bkz. Dizinleri ve kısıtlamaları devre dışı bırakma ve Dizinleri ve kısıtlamaları etkinleştirme.

Satır deposu dizinini YENIDEN DÜZENLEME

Rowstore dizinleri için dizin REORGANIZE yaprak düzeyinin yeniden düzenlenmesini belirtir. İşlem REORGANIZE şöyledir:

  • Her zaman çevrimiçi gerçekleştirilir. Bu, uzun süreli engelleme tablosu kilitlerinin tutulmaz ve işlem sırasında ALTER INDEX REORGANIZE temel tablodaki veriler için sorgular veya güncelleştirmeler devam edebilir.
  • Devre dışı bırakılmış dizin için izin verilmiyor.
  • olarak ayarlandığında ALLOW_PAGE_LOCKSizin verilmezOFF.
  • bir işlem içinde gerçekleştirildiğinde geri alınmaz ve işlem geri alınır.

Note

ALTER INDEX REORGANIZE Varsayılan örtük işlem modu yerine açık işlemleri (örneğin, ALTER INDEX bir BEGIN TRAN ... COMMIT/ROLLBACKiçinde) kullandığında, kilitleme davranışı REORGANIZE daha kısıtlayıcı hale gelir ve engellemeye neden olabilir. Örtük işlemler hakkında daha fazla bilgi için bkz . SET IMPLICIT_TRANSACTIONS.

Daha fazla bilgi için bkz. Sorgu performansını geliştirmek ve kaynak tüketimini azaltmak için dizin bakımını iyileştirme.

YENİDEN DÜZENLE ( LOB_COMPACTION = { ON | OFF } )

Satır deposu dizinleri için geçerlidir.

  • ON

    • Görüntü, metin, ntext, varchar(max), nvarchar(max), varbinary(max)ve xml gibi büyük nesne (LOB) veri türlerinin verilerini içeren tüm sayfaları sıkıştırmayı belirtir. Bu verilerin sıkıştırılması disk üzerindeki veri boyutunu azaltabilir.
    • Kümelenmiş dizin için bu, tabloda yer alan tüm LOB sütunlarını sıkıştırır.
    • Kümelenmemiş bir dizin için bu, dizinde anahtar olmayan (dahil) sütunlar olan tüm LOB sütunlarını sıkıştırır.
    • REORGANIZE ALL tüm dizinlerde LOB sıkıştırması gerçekleştirir. Bu, her dizin için kümelenmiş dizindeki, temel tablodaki veya kümelenmemiş dizindeki dahil edilen tüm LOB sütunlarını sıkıştırır.
  • OFF

    • Büyük nesne verileri içeren sayfalar sıkıştırılamaz.
    • KAPALI'nın yığın üzerinde hiçbir etkisi yoktur.

Columnstore dizinini YENIDEN DÜZENLEME

columnstore dizinleri için, REORGANIZE kapatılan her delta satır grubunu sıkıştırılmış bir satır grubu olarak columnstore'da sıkıştırır. İşlem REORGANIZE her zaman çevrimiçi gerçekleştirilir. Başka bir deyişle uzun süreli engelleme tablosu kilitleri tutulmaz ve işlem sırasında ALTER INDEX REORGANIZE temel tablodaki sorgular veya güncelleştirmeler devam edebilir.

Daha fazla bilgi için bkz. Sorgu performansını geliştirmek ve kaynak tüketimini azaltmak için dizin bakımını iyileştirme.

  • REORGANIZE kapatılan delta satır gruplarını sıkıştırılmış satır gruplarına taşımak için gerekli değildir. Arka plan tanımlama grubu taşıma (TM) işlemi, kapalı delta satır gruplarını sıkıştırmak için düzenli aralıklarla uyanır. Tanımlama grubu taşıyıcısı geride kalırken kullanmanızı REORGANIZE öneririz. REORGANIZE satır gruplarını daha agresif bir şekilde sıkıştırabilir.
  • Tüm açık ve kapalı satır gruplarını sıkıştırmak için bkz. REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS).

SQL Server 2016 (13.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği'ndeki columnstore dizinleri için, REORGANIZE çevrimiçi olarak aşağıdaki ek birleştirme iyileştirmelerini gerçekleştirir:

  • 10% veya daha fazla satır mantıksal olarak silindiğinde, silinen satırları bir satır grubundan fiziksel olarak kaldırır. Silinen baytlar fiziksel medyada geri kazanılır. Örneğin, 1 milyon satırlık sıkıştırılmış bir satır grubunda 100.000 satır silinmişse, Veritabanı Altyapısı silinen satırları kaldırır ve 900.000 satırla satır grubunu yeniden sıkıştırır.

  • Satır grubu başına satırları en fazla 1.048.576 satıra kadar artırmak için bir veya daha fazla sıkıştırılmış satır grubunu birleştirir. Örneğin, 102.400 satırlık 5 toplu işlemi toplu içeri aktarırsanız, 5 sıkıştırılmış satır grubu elde edersiniz. çalıştırırsanız REORGANIZE, bu satır grupları 512.000 satırı olan 1 sıkıştırılmış satır grubuyla birleştirilir. Bu, sözlük boyutu veya bellek sınırlamaları olmadığını varsayar.

  • 10% veya daha fazla satırın mantıksal olarak silindiği satır grupları için, Veritabanı Altyapısı bu satır grubunu bir veya daha fazla satır grubuyla birleştirmeye çalışır. Örneğin, satır grubu 1 500.000 satırla sıkıştırılır ve satır grubu 21 en fazla 1.048.576 satırla sıkıştırılır. Satır grubu 21'de silinen satırların 60% vardır ve bu da 409.830 satır bırakır. Veritabanı Altyapısı, 909.830 satırı olan yeni bir satır grubunu sıkıştırmak için bu iki satır grubunu birleştirmeyi tercih eder.

YENİDEN DÜZENLE ( COMPRESS_ALL_ROW_GROUPS = { ON | OFF } )

Columnstore dizinleri için geçerlidir.

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

COMPRESS_ALL_ROW_GROUPS , açık veya kapalı delta satır gruplarını columnstore'a zorlamak için bir yol sağlar. Bu seçenekle, delta satır gruplarını boşaltmak için columnstore dizininin yeniden oluşturulması gerekmez. Diğer kaldırma ve birleştirme birleştirme özellikleriyle birlikte bu, çoğu durumda bir columnstore dizinini yeniden derlemeyi artık gerekli hale getirir.

  • ON

    Boyut ve durum ne olursa olsun (kapalı veya açık) tüm satır gruplarını columnstore'na zorlar.

  • OFF

    Tüm kapalı satır gruplarını columnstore'a zorlar.

Daha fazla bilgi için bkz. Sorgu performansını geliştirmek ve kaynak tüketimini azaltmak için dizin bakımını iyileştirme.

SET ( <set_index seçeneği> [ ,... n ] )

Dizini yeniden derlemeden veya yeniden düzenlemeden dizin seçeneklerini değiştirir. SET devre dışı bırakılmış bir dizin için belirtilemiyor.

PAD_INDEX = { ON | KAPALI }

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

  • ON

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

  • OFF

    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 PAD_INDEX ancak dolgu faktörü belirtilmemişse ON de oluşur.

Daha fazla bilgi için bkz. CREATE INDEX.

FILLFACTOR = FILLFACTOR

Veritabanı Altyapısı'nın dizin oluşturma veya değiştirme 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. Varsayılan değer 0'dır. 0 ve 100 dolgu faktörü değerleri her açıdan aynıdır.

Açık FILLFACTOR bir ayar yalnızca dizin ilk oluşturulduğunda veya yeniden oluşturulduğunda uygulanır. Veritabanı Altyapısı, sayfalarda belirtilen boş alan yüzdesini dinamik olarak tutmaz. Daha fazla bilgi için bkz. CREATE INDEX.

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

Important

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.

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.

  • ON

    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.

  • OFF

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

Sıralama işlemi gerekli değilse veya sıralama bellekte gerçekleştirilebiliyorsa, SORT_IN_TEMPDB seçenek yoksayılır.

Daha fazla bilgi için bkz. dizinler için SORT_IN_TEMPDB seçeneği.

IGNORE_DUP_KEY = { ON | KAPALI }

Ekleme işlemi benzersiz bir dizine yinelenen anahtar değerleri eklemeyi denediğinde hata yanıtını belirtir. seçeneği IGNORE_DUP_KEY yalnızca dizin oluşturulduktan veya yeniden oluşturulduktan sonra ekleme işlemleri için geçerlidir. Varsayılan değer: OFF.

  • ON

    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.

  • OFF

    Benzersiz bir dizine yinelenen anahtar değerleri eklendiğinde hata iletisi oluşur. İşlemin 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 ignore_dup_key katalog görünümündeki sütunu kullanın.

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

STATISTICS_NORECOMPUTE = { ON | KAPALI }

Dizindeki istatistikler için otomatik istatistik güncelleştirme seçeneğini AUTO_STATISTICS_UPDATEdevre dışı bırakın veya etkinleştirin. Varsayılan değer: OFF.

  • ON

    Dizin yeniden oluşturulduğunda otomatik istatistik güncelleştirmeleri devre dışı bırakılır.

  • OFF

    Dizin yeniden oluşturulduğunda otomatik istatistik güncelleştirmeleri etkinleştirilir.

Otomatik istatistik güncelleştirmesini geri yüklemek için öğesini olarak ayarlayın veya yan tümcesi olmadan yürütür STATISTICS_NORECOMPUTEOFF.UPDATE STATISTICSNORECOMPUTE

Warning

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.

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, dizinde oluşturulan istatistikler bölüm istatistiklerine göredir. olduğunda OFF, mevcut istatistikler bırakılır ve Veritabanı Altyapısı istatistikleri yeniden derler. 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
  • Kullanılabilirlik grubu 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

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

XML dizini veya uzamsal dizin için yalnızca ONLINE = OFF desteklenir ve hata olarak ONLINE ayarlanırsa ON oluşturulur.

Important

Ç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. SQL Server 2022'nin sürümleri ve desteklenen özellikleri.

  • ON

    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 .

    Note

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

  • OFF

    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.

Genel geçici tablolardaki dizinler de dahil olmak üzere dizinler, aşağıdaki durumlar dışında çevrimiçi olarak yeniden 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 önceki sürümlerde kümelenmiş columnstore dizinleri
  • SQL Server 2016 (13.x)) ve önceki 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.

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

RESUMABLE = { ON | KAPALI}

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

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

  • ON

    Dizin işlemi devam ettirilebilir.

  • OFF

    Dizin işlemi devam ettirilemez.

MAX_DURATION = saat [ DAKİkA ] ile RESUMABLE = ON kullanılır (gerektirir ONLINE = ON)

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

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

ALLOW_ROW_LOCKS = { ON | KAPALI }

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

  • ON

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

  • OFF

    Satır kilitleri kullanılmaz.

ALLOW_PAGE_LOCKS = { ON | KAPALI }

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

  • ON

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

  • OFF

    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 bkz. Sıralı anahtarlar.

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 .

Seçenek tüm XML dizinleri ve uzamsal dizinler için sağlam bir şekilde destekleniyor olsa MAXDOP da, ALTER INDEX şu anda yalnızca tek bir işlemci kullanıyor.

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.

Note

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

COMPRESSION_DELAY = { 0 | Süre [ dakika ] }

Şunlar için geçerlidir: SQL Server (SQL Server 2016 (13.x) ile başlayarak), Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

Columnstore dizini olan disk tabanlı bir tablo için, Veritabanı Altyapısı'nın onu sıkıştırılmış bir satır grubuna sıkıştırabilmesi için kapalı durumdaki bir delta satır grubunun delta deposunda kalması gereken en az dakika sayısını belirtir. Disk tabanlı tablolar tek tek satırlarda ekleme ve güncelleştirme sürelerini izlemediğinden, Veritabanı Altyapısı bu gecikmeyi yalnızca kapalı durumdaki değişiklik deposu satır gruplarına uygular.

Varsayılan değer 0 dakikadır.

'nin ne zaman kullanılacağına COMPRESSION_DELAYilişkin öneriler için bkz. Gerçek zamanlı operasyonel analiz için columnstore kullanmaya başlama.

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:

  • NONE

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

  • ROW

    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.

  • PAGE

    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. belirtilmesi COLUMNSTORE , dahil olmak üzere COLUMNSTORE_ARCHIVEdiğer tüm veri sıkıştırmalarını kaldırır.

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

  • ON

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

  • OFF

    Dizin veya belirtilen bölümler sıkıştırılamaz.

BÖLÜMLERE ( { <partition_number_expression> | <range> } [ ,... 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: ON PARTITIONS (2, 4, 6 TO 8).

<range> , 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)
);

RESUME

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

Maksimum süreye ulaşıldığı için veya bir hata nedeniyle el ile duraklatılan bir dizin işlemini sürdürür.

  • MAX_DURATION

    Yeniden duraklatılmadan önce sürdürüldükten sonra sürdürülebilir dizin işleminin tamsayı dakika cinsinden ne kadar süreyle yürütülmesini belirtir.

  • WAIT_AT_LOW_PRIORITY

    Bir duraklamadan sonra dizin derleme işleminin devam ettirilmesi için gerekli kilitlerin alınması gerekir. WAIT_AT_LOW_PRIORITY dizin derleme işleminin düşük öncelikli kilitler aldığını ve dizin derleme işlemi beklerken diğer işlemlerin 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. Daha fazla bilgi için bkz. WAIT_AT_LOW_PRIORITY.

PAUSE

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

Devam ettirilebilen dizin derleme işlemini duraklatır.

ABORT

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

Devam ettirilebilir olarak başlatılan çalışan veya duraklatılmış dizin derleme işlemini durdurur. Devam ettirilebilen dizin derleme işlemini sonlandırmak için açıkça bir ABORT komut yürütmeniz gerekir. Devam ettirilebilen dizin işlemindeki bir hata veya duraklama, yürütülmesini sonlandırmaz; bunun yerine, işlemi süresiz bir duraklatma durumunda bırakır.

Remarks

ALTER INDEX bir dizini yeniden bölümlemek veya farklı bir dosya grubuna taşımak için kullanılamaz. Bu deyim, sütun ekleme veya silme ya da sütun sırasını değiştirme gibi dizin tanımını değiştirmek için kullanılamaz. Bu işlemleri gerçekleştirmek için yan tümcesiyle kullanın CREATE INDEXDROP_EXISTING .

Bir seçenek açıkça belirtilmediğinde geçerli ayar uygulanır. Örneğin, yan tümcesinde FILLFACTOR bir REBUILD ayar belirtilmezse, yeniden oluşturma işlemi sırasında sistem kataloğunda depolanan doldurma faktörü değeri kullanılır. Geçerli dizin seçeneği ayarlarını görüntülemek için sys.indexes kullanın.

, ONLINEve MAXDOP değerleri SORT_IN_TEMPDBsistem kataloğunda depolanmaz. Dizin deyiminde belirtilmediği sürece, seçenek için varsayılan değer kullanılır.

Çok işlemcili bilgisayarlarda, diğer sorgularda olduğu gibi, ALTER INDEX REBUILD dizini değiştirmekle ilişkili tarama ve sıralama işlemlerini gerçekleştirmek için otomatik olarak daha fazla işlemci kullanır. Buna karşılık, ALTER INDEX REORGANIZE tek bir iş parçacıklı işlemdir. Daha fazla bilgi için bkz . Paralel dizin işlemlerini yapılandırma.

Microsoft Fabric'teki SQL veritabanında ALTER INDEX ALL desteklenmiyor ama ALTER INDEX <index name> destekleniyor.

Dizinleri yeniden oluşturma

Dizini yeniden derlemek, dizini iptal eder ve yeniden oluşturur. Bu işlem parçalanmayı kaldırır, sayfaları belirtilen veya var olan doldurma faktörü ayarına göre sıkıştırarak disk alanını geri alır ve bitişik sayfalardaki dizin satırlarını yeniden sıralar. Belirtildiğinde ALL , tablodaki tüm dizinler tek bir işlemde bırakılır ve yeniden oluşturulur. Yabancı anahtar kısıtlamalarının önceden bırakılması gerekmez. 128 veya daha fazla uzantıya sahip dizinler yeniden oluşturulduğunda, Veritabanı Altyapısı işlem işlemeden sonraya kadar gerçek sayfa ayırmalarını ve ilişkili kilitlerini saptırır. Daha fazla bilgi için bkz. Ertelenen serbest bırakma.

Daha fazla bilgi için bkz. Sorgu performansını geliştirmek ve kaynak tüketimini azaltmak için dizin bakımını iyileştirme.

İndeksleri yeniden düzenle

Dizini yeniden düzenlemek en az sistem kaynağını kullanır. Yaprak düğümlerinin mantıksal, soldan sağa sırasıyla eşleşecek şekilde yaprak düzeyi sayfaları fiziksel olarak yeniden sıralayarak tablo ve görünümlerdeki kümelenmiş ve kümelenmemiş dizinlerin yaprak düzeyini bir arada kullanır. Yeniden düzenleme, dizin sayfalarını da sıkıştırıyor. Sıkıştırma, mevcut doldurma faktörü değerini temel alır.

Belirtildiğinde ALL , hem kümelenmiş hem de kümelenmemiş ilişkisel dizinler ve tablodaki XML dizinleri yeniden düzenlenmiştir. belirtilirken bazı ALL uygulanır.

Daha fazla bilgi için bkz. Sorgu performansını geliştirmek ve kaynak tüketimini azaltmak için dizin bakımını iyileştirme.

Note

Sıralı columnstore dizini olan bir tablo için ALTER INDEX REORGANIZE verileri yeniden sıralamaz. Verilere başvurmak için kullanın CREATE [CLUSTERED] COLUMNSTORE INDEX ... ORDER (...) ... WITH (DROP_EXISTING = ON).

İndeksleri devre dışı bırak

Dizini devre dışı bırakmak, kullanıcının dizine ve kümelenmiş dizinler için temel tablo verilerine erişimini engeller. Dizin tanımı sistem kataloğunda kalır. Bir görünümde kümelenmemiş dizini veya kümelenmiş dizini devre dışı bırakmak dizin verilerini fiziksel olarak siler. Kümelenmiş dizini devre dışı bırakmak verilere erişimi engeller, ancak dizin bırakılana veya yeniden oluşturulduğundaya kadar veriler B ağacında etkilenmemiş olarak kalır. Bir dizinin devre dışı bırakılıp bırakılmadiğini görmek için katalog görünümündeki is_disabled sütunu kullanınsys.indexes.

Note

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

Tablo bir işlem çoğaltma yayınındaysa, birincil anahtar kısıtlamasıyla ilişkili bir dizini devre dışı bırakamazsınız. Bu dizinler çoğaltma için gereklidir. Böyle bir dizini devre dışı bırakmak için önce tabloyu yayından bırakmanız gerekir. Daha fazla bilgi için bkz . Veri ve veritabanı nesnelerini yayımlama.

Deyimini ALTER INDEX REBUILD veya deyimini CREATE INDEX WITH DROP_EXISTING kullanarak dizini etkinleştirin. Devre dışı bırakılmış kümelenmiş dizini yeniden oluşturma seçeneği olarak ONLINEayarlandığında gerçekleştirilemezON. Daha fazla bilgi için bkz. Dizinleri ve kısıtlamaları devre dışı bırakma.

Seçenekleri ayarlama

Bu dizini yeniden derlemeden veya yeniden düzenlemeden belirtilen dizin için , ALLOW_ROW_LOCKSALLOW_PAGE_LOCKS, , OPTIMIZE_FOR_SEQUENTIAL_KEYve IGNORE_DUP_KEY seçeneklerini STATISTICS_NORECOMPUTEayarlayabilirsiniz. Değiştirilen değerler dizine hemen uygulanır. Bu ayarları görüntülemek için kullanın sys.indexes. Daha fazla bilgi için bkz. Dizin seçeneklerini ayarlama.

Satır ve sayfa kilitleme seçenekleri

Dizine eriştiğiniz zaman ALLOW_ROW_LOCKS = ON ve ALLOW_PAGE_LOCK = ON, satır düzeyi, sayfa düzeyi ve tablo düzeyi kilitlerine izin verilir. Veritabanı Altyapısı uygun kilidi seçer ve kilidi bir satırdan veya sayfa kilidinden tablo kilidine yükseltebilir.

ve ALLOW_ROW_LOCKS = OFFolduğundaALLOW_PAGE_LOCK = OFF, dizine eriştiğiniz zaman yalnızca tablo düzeyinde bir kilide izin verilir.

Satır veya sayfa kilidi seçenekleri ayarlandığında belirtilirse ALL , ayarlar tüm dizinlere uygulanır. Temel alınan tablo bir yığın olduğunda, ayarlar aşağıdaki yollarla uygulanır:

Option Şunlar için geçerlidir:
ALLOW_ROW_LOCKS = ON veya OFF Yığın ve ilişkili tüm kümelenmemiş dizinler.
ALLOW_PAGE_LOCKS = ON Yığın ve ilişkili tüm kümelenmemiş dizinler.
ALLOW_PAGE_LOCKS = OFF Tüm sayfa kilitlerine izin verilmeyen, kümelenmemiş dizinler. Yığın için yalnızca paylaşılan (S), güncelleştirme (U) ve özel (X) sayfa kilitlerine izin verilmez. Veritabanı Altyapısı, iç amaçlar için amaç sayfa kilitleri (IS, IUveya IX) almaya devam edebilir.

Warning

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 ALLOW_PAGE_LOCKSyeniden düzenlenemezOFF.

Çevrimiçi dizin işlemleri

Bir dizini yeniden oluştururken ve ONLINE seçeneği olarak ayarlanırken ON, sorgular ve değişiklikler için dizindeki veriler, ilişkili tablosu ve aynı tablodaki diğer dizinler kullanılabilir. Ayrıca, tek bir bölümde bulunan bir dizinin bir bölümünü çevrimiçi olarak yeniden oluşturabilirsiniz. Özel tablo kilitleri, dizin yeniden oluşturma işleminin sonunda yalnızca kısa bir süre tutulur.

Dizini yeniden düzenleme işlemi her zaman çevrimiçi gerçekleştirilir. İşlem yalnızca kısa süreler için kilitler tutar ve sorguları veya güncelleştirmeleri engelleme olasılığı düşüktür.

Aynı tablo veya tablo bölümünde yalnızca aşağıdaki işlemleri yaparken eşzamanlı çevrimiçi dizin işlemleri gerçekleştirebilirsiniz:

  • Birden çok kümelenmemiş dizin oluşturma.
  • Aynı tabloda farklı dizinleri yeniden düzenleme.
  • Aynı tablodaki örtüşemeyen dizinleri yeniden oluştururken farklı dizinleri yeniden düzenleme.

Aynı anda gerçekleştirilen diğer tüm çevrimiçi dizin işlemleri başarısız olur. Örneğin, aynı tablodaki iki veya daha fazla dizini eşzamanlı olarak yeniden oluşturamaz veya aynı tablodaki mevcut bir dizini yeniden oluştururken yeni bir dizin oluşturamazsınız.

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

Devam ettirilebilen dizin işlemleri

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

Çevrimiçi dizin yeniden derlemesini devam ettirebilirsiniz. Bu, dizin yeniden oluşturma işleminin durdurulabileceği ve daha sonra durdurulduğu noktadan yeniden başlatılabildiği anlamına gelir. Dizin yeniden 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 derlenen bir dizinin zaman aralığını belirtir. Bu süre geçtikten sonra ve dizin derlemesi hala çalışıyorsa duraklatılır. Duraklatılmış dizin için derlemenin ne zaman sürdürülebileceğine siz karar verirsiniz. dakika cinsinden MAX_DURATION 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 ALTER INDEX REBUILD deyimi aynı parametrelerle yeniden yürütmek, duraklatılmış dizin yeniden oluşturma işlemini sürdürür. Deyimini yürüterek ALTER INDEX RESUME duraklatılmış dizin yeniden oluşturma 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.
  • Duraklatılmış bir dizin yeniden oluşturma işlemini devam ettirirken, değeri yeni bir değerle MAXDOP değiştirebilirsiniz. Duraklatılan bir dizin işlemi sürdürülürken belirtilmezse MAXDOP , MAXDOP son özgeçmiş için kullanılan değer kullanılır. MAXDOP Dizin yeniden oluşturma işlemi için seçenek hiç belirtilmezse, varsayılan değer kullanılır.

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 yeniden derlemesinin 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.

Resources

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 yeniden derlemesine kıyasla daha azdır ve bu işlem sırasında günlük kesilmesine izin verir.
  • Dizin işlemi duraklatılırken yeniden derlenen bir dizini veya ilişkili tablosunu 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 yeniden oluşturma işlemleri aşağıdaki sınırlamalara sahiptir:

  • 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ütunları olarak hesaplanan veya zaman damgası/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 2014 (12.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

seçeneğini kullanmadığınızda, dizin yeniden 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 = zaman [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 | SELF | BLOCKERS ]

  • 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 CREATE INDEX deyimini yürüten sorumlunun ALTER 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

Uzamsal dizin kısıtlamaları

Uzamsal dizini yeniden oluştururken, dizin işlemi sırasında temel alınan kullanıcı tablosu kullanılamaz.

PRIMARY KEY Kullanıcı tablosundaki kısıtlama, bu tablonun bir sütununda uzamsal dizin tanımlanırken değiştirilemez. Kısıtlamayı PRIMARY KEY değiştirmek için önce tablonun her uzamsal dizinini bırakın. Kısıtlamayı PRIMARY KEY değiştirdikten sonra uzamsal dizinlerin her birini yeniden oluşturabilirsiniz.

Tek bir bölüm yeniden oluşturma işleminde uzamsal dizin belirtemezsiniz. Ancak, tablo yeniden derlemesinde uzamsal dizinler belirtebilirsiniz.

veya BOUNDING_BOXgibi GRID uzamsal bir dizine özgü seçenekleri değiştirmek için, öğesini belirten CREATE SPATIAL INDEXbir DROP_EXISTING = ON deyim kullanabilir veya uzamsal dizini bırakıp yeni bir tane oluşturabilirsiniz. Örnek için bkz . CREATE SPATIAL INDEX.

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.

Bölümlenmiş dizinlerin yeniden oluşturulması için aşağıdaki önemli noktalar geçerlidir:

  • Tabloda hizalanmamış dizinler varsa tek bir bölümün sıkıştırma ayarını değiştiremezsiniz.
  • Söz ALTER INDEX <index> ... REBUILD PARTITION ... WITH DATA_COMPRESSION = ... dizimi, belirtilen sıkıştırma seçeneğiyle dizinin belirtilen bölümünü yeniden oluşturur. WITH DATA_COMPRESSION Yan tümcesi atlanırsa, mevcut sıkıştırma seçeneği kullanılır.
  • Söz ALTER INDEX <index> ... REBUILD PARTITION = ALL dizimi, mevcut sıkıştırma seçeneklerini kullanarak dizinin tüm bölümlerini yeniden oluşturur.
  • ALTER INDEX <index> ... REBUILD PARTITION = ALL (WITH ...) söz dizimi dizinin tüm bölümlerini yeniden oluşturur. Yan tümcesini DATA_COMPRESSION = ... ON PARTITIONS ( ...) kullanarak farklı bölümler için farklı sıkıştırma seçebilirsiniz.

Değiştirme PAGE ve ROW sıkıştırmanın bir tabloyu, dizini veya bölümü nasıl etkilediğini değerlendirmek için saklı sp_estimate_data_compression_savings yordamını kullanın.

Statistics

Bir dizini yeniden derlediğinizde, dizindeki istatistikler bölümlenmemiş dizinler için tam tarama ve bölümlenmiş dizinler için varsayılan örnekleme oranıyla güncelleştirilir. Tablodaki diğer istatistikler dizin yeniden oluşturma işleminin bir parçası olarak güncelleştirilmez.

Permissions

ALTER Tablo veya görünümde izin gereklidir.

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) ve sonraki sürümlerde, Azure SQL Veritabanı'nda ve Azure SQL Yönetilen Örneği'nde kullanılabilir.

Temel söz dizimi örneği

ALTER INDEX index1 ON table1 REBUILD;
ALTER INDEX ALL ON table1 REBUILD;
ALTER INDEX ALL ON dbo.table1 REBUILD;

Örnekler: Columnstore dizinleri

Bu örnekler columnstore dizinleri için geçerlidir.

A. REORGANIZE demosu

Bu örnekte komutun ALTER INDEX REORGANIZE nasıl çalıştığı gösterilmektedir. Birden çok satır grubu içeren bir tablo oluşturur ve ardından satır gruplarının nasıl REORGANIZE birleştirildiğini gösterir.

-- Create a database
CREATE DATABASE [columnstore];
GO

-- Create a rowstore staging table
CREATE TABLE [staging] (
    AccountKey INT NOT NULL,
    AccountDescription NVARCHAR(50),
    AccountType NVARCHAR(50),
    AccountCodeAlternateKey INT
);

-- Insert 10 million rows into the staging table.
DECLARE @loop INT;
DECLARE @AccountDescription VARCHAR(50);
DECLARE @AccountKey INT;
DECLARE @AccountType VARCHAR(50);
DECLARE @AccountCode INT;

SELECT @loop = 0

BEGIN TRANSACTION

WHILE (@loop < 300000)
BEGIN
    SELECT @AccountKey = CAST(RAND() * 10000000 AS INT);
    SELECT @AccountDescription = 'accountdesc ' + CONVERT(VARCHAR(20), @AccountKey);
    SELECT @AccountType = 'AccountType ' + CONVERT(VARCHAR(20), @AccountKey);
    SELECT @AccountCode = CAST(RAND() * 10000000 AS INT);

    INSERT INTO staging
    VALUES (
        @AccountKey,
        @AccountDescription,
        @AccountType,
        @AccountCode
     );

    SELECT @loop = @loop + 1;
END

COMMIT

-- Create a table for the clustered columnstore index
CREATE TABLE cci_target (
    AccountKey INT NOT NULL,
    AccountDescription NVARCHAR(50),
    AccountType NVARCHAR(50),
    AccountCodeAlternateKey INT
);

-- Convert the table to a clustered columnstore index named inxcci_cci_target;
CREATE CLUSTERED COLUMNSTORE INDEX idxcci_cci_target ON cci_target;

Satırları paralel olarak eklemek için TABLOCK seçeneğini kullanın. SQL Server 2016 (13.x) INSERT INTO ile başlayarak, işlem kullanıldığında paralel TABLOCK olarak çalıştırılabilir.

INSERT INTO cci_target WITH (TABLOCK)
SELECT TOP 300000 * FROM staging;

Delta satır gruplarını görmek OPEN için bu komutu çalıştırın. Satır gruplarının sayısı paralellik derecesine bağlıdır.

SELECT *
FROM sys.dm_db_column_store_row_group_physical_stats
WHERE object_id  = object_id('cci_target');

Tüm CLOSED ve OPEN satır gruplarını columnstore içine zorlamak için bu komutu çalıştırın.

ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

Bu komutu yeniden çalıştırdığınızda daha küçük satır gruplarının sıkıştırılmış bir satır grubuyla birleştirildiğini görürsünüz.

ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

B. CLOSED delta satır gruplarını columnstore'da sıkıştırın

Bu örnekte, her REORGANIZE delta satır grubunu sıkıştırılmış satır grubu olarak columnstore içine sıkıştırma seçeneği kullanılırCLOSED. Bu gerekli değildir, ancak tanımlama grubu taşıyıcısı satır gruplarını yeterince hızlı sıkıştırmıyorsa CLOSED kullanışlıdır.

Her iki örneği de AdventureWorksDW2025 örnek veritabanında çalıştırabilirsiniz.

Bu örnek tüm bölümlerde çalışır REORGANIZE .

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;

Bu örnek belirli bir bölümde çalışır REORGANIZE .

-- REORGANIZE a specific partition
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0;

C. Tüm OPEN VE CLOSED delta satır gruplarını columnstore'da sıkıştırın

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

komutu REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON) , her OPEN bir ve CLOSED delta satır grubunu sıkıştırılmış bir satır grubu olarak columnstore'da sıkıştırır. Bu işlem deltastore'yı boşaltır ve tüm satırları columnstore'da sıkıştırılması için zorlar. Bu işlemler satırları bir veya daha fazla delta satır grubunda depoladığından, özellikle çok sayıda ekleme işlemi gerçekleştirdikten sonra kullanışlıdır.

REORGANIZE satır gruplarını bir araya getirerek satır gruplarını en fazla satır <sayısı = 1.024.576'ya kadar doldurur. Bu nedenle, tümünü OPEN ve CLOSED satır gruplarını sıkıştırdığınızda, içinde yalnızca birkaç satır bulunan çok sayıda sıkıştırılmış satır grubuyla sonuçlanmamış olursunuz. Sıkıştırılmış boyutu azaltmak ve sorgu performansını geliştirmek için satır gruplarının mümkün olduğunca dolu olmasını istiyorsunuz.

Aşağıdaki örneklerde AdventureWorksDW2025 veritabanı kullanılır.

Bu örnek, tüm OPEN ve CLOSED delta satır gruplarını columnstore dizinine taşır.

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

Bu örnek, tüm OPEN ve CLOSED delta satır gruplarını belirli bir bölüm için columnstore dizinine taşır.

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0 WITH (COMPRESS_ALL_ROW_GROUPS = ON);

D. Columnstore dizinini çevrimiçi birleştirme

Geçerli değildir: SQL Server 2012 (11.x) ve SQL Server 2014 (12.x).

SQL Server 2016'dan (13.x) REORGANIZE başlayarak, delta satır gruplarını columnstore'da sıkıştırmaktan daha fazlasını yapar. Ayrıca çevrimiçi birleştirme gerçekleştirir. İlk olarak, bir satır grubundaki 10% veya daha fazla satır silindiğinde silinen satırları fiziksel olarak kaldırarak sütun deposunun boyutunu küçültür. Ardından, satır gruplarını bir araya getirerek satır grupları başına en fazla 1.024.576 satıra kadar olan daha büyük satır grupları oluşturur. Değiştirilen tüm satır grupları yeniden sıkıştırılır.

Note

SQL Server 2016'dan (13.x) başlayarak, silinen satırları fiziksel olarak kaldırdığından ve satır gruplarını birleştirdiğinden REORGANIZE columnstore dizinini yeniden oluşturmak artık çoğu durumda gerekli değildir. seçeneği COMPRESS_ALL_ROW_GROUPS , tüm OPEN veya CLOSED delta satır gruplarını sütun deposuna zorlar ve bu daha önce yalnızca yeniden derleme ile yapılabilirdi. REORGANIZE çevrimiçidir ve işlem gerçekleşirken sorguların devam edebilmesi için arka planda gerçekleşir.

Aşağıdaki örnek, tablodan mantıksal olarak silinmiş satırları fiziksel olarak kaldırarak ve satır gruplarını birleştirerek dizini birleştirmek için bir REORGANIZE gerçekleştirir.

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;

E. Kümelenmiş columnstore dizinini çevrimdışı yeniden oluşturma

Şunlar için geçerlidir: SQL Server, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği

Tip

SQL Server 2016 'dan (13.x) başlayarak ve Azure SQL Veritabanı'nda columnstore dizinleri yerine ALTER INDEX REORGANIZE kullanmanızı ALTER INDEX REBUILD öneririz.

Note

SQL Server 2012 (11.x) ve SQL Server 2014'te (12.x), REORGANIZE yalnızca satır gruplarını columnstore'da sıkıştırmak CLOSED için kullanılır. Birleştirme işlemlerini gerçekleştirmenin ve tüm delta satır gruplarını columnstore'a zorlamanın tek yolu dizini yeniden oluşturmaktır.

Bu örnekte, kümelenmiş columnstore dizininin nasıl yeniden oluşturulup tüm delta satır gruplarının columnstore'a nasıl zorlandığı gösterilmektedir. Bu ilk adım, kümelenmiş columnstore diziniyle veritabanında bir tablo FactInternetSales2AdventureWorksDW2025 hazırlar ve ilk dört sütundan veri ekler.

CREATE TABLE dbo.FactInternetSales2 (
    ProductKey [int] NOT NULL,
    OrderDateKey [int] NOT NULL,
    DueDateKey [int] NOT NULL,
    ShipDateKey [int] NOT NULL);

CREATE CLUSTERED COLUMNSTORE INDEX cci_FactInternetSales2
ON dbo.FactInternetSales2;

INSERT INTO dbo.FactInternetSales2
SELECT ProductKey, OrderDateKey, DueDateKey, ShipDateKey
FROM dbo.FactInternetSales;

SELECT * FROM sys.column_store_row_groups;

Sonuçlarda bir OPEN satır grubu gösterilir; bu da SQL Server'ın satır grubunu kapatmadan ve verileri columnstore'ya taşımadan önce daha fazla satır eklenmesini beklediği anlamına gelir. Bu sonraki deyim, tüm satırları columnstore'ya zorlayan kümelenmiş columnstore dizinini yeniden oluşturur.

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REBUILD;
SELECT * FROM sys.column_store_row_groups;

deyiminin SELECT sonuçları satır grubunun olduğunu COMPRESSEDgösterir. Bu, satır grubunun sütun kesimlerinin artık sıkıştırıldığı ve columnstore'da depolandığı anlamına gelir.

F. Kümelenmiş columnstore dizininin bir bölümünü çevrimdışı yeniden oluşturma

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

Büyük bir kümelenmiş columnstore dizininin bölümünü yeniden oluşturmak için bölüm seçeneğiyle kullanın ALTER INDEX REBUILD . Bu örnek 12. bölümü yeniden oluşturur. SQL Server 2016 (13.x) ile başlayarak yerine öğesinin kullanılması REBUILDREORGANIZEönerilir.

ALTER INDEX cci_fact3
ON fact3
REBUILD PARTITION = 12;

G. Arşiv sıkıştırmayı kullanmak için kümelenmiş columnstore dizinini değiştirme

Geçerli değildir: SQL Server 2012 (11.x)

Veri sıkıştırma seçeneğini kullanarak kümelenmiş columnstore dizininin boyutunu daha da küçültmeyi COLUMNSTORE_ARCHIVE seçebilirsiniz. Bu, daha ucuz depolamada tutmak istediğiniz eski veriler için pratiktir. Sıkıştırmayı açma işlemi normal COLUMNSTORE sıkıştırmaya göre daha yavaş olduğundan, bunu yalnızca sık erişilmeyecek verilerde kullanmanızı öneririz.

Aşağıdaki örnek, arşiv sıkıştırmayı kullanmak için kümelenmiş columnstore dizinini yeniden oluşturur ve ardından arşiv sıkıştırmasının nasıl kaldırılacağını gösterir. Sonuç yalnızca columnstore sıkıştırmasını kullanır.

İlk olarak, kümelenmiş columnstore diziniyle bir tablo oluşturarak örneği hazırlayın. Ardından, arşiv sıkıştırmayı kullanarak tabloyu daha fazla sıkıştırın.

--Prepare the example by creating a table with a clustered columnstore index.
CREATE TABLE SimpleTable (
    ProductKey [int] NOT NULL,
    OrderDateKey [int] NOT NULL,
    DueDateKey [int] NOT NULL,
    ShipDateKey [int] NOT NULL
);

CREATE CLUSTERED INDEX cci_SimpleTable ON SimpleTable (ProductKey);

CREATE CLUSTERED COLUMNSTORE INDEX cci_SimpleTable
ON SimpleTable
WITH (DROP_EXISTING = ON);

--Compress the table further by using archival compression.
ALTER INDEX cci_SimpleTable ON SimpleTable
REBUILD
WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
GO

Bu örnek arşiv sıkıştırmasını kaldırır ve yalnızca columnstore sıkıştırmasını kullanır.

ALTER INDEX cci_SimpleTable ON SimpleTable
REBUILD
WITH (DATA_COMPRESSION = COLUMNSTORE);
GO

Örnekler: Rowstore dizinleri

A. Dizini yeniden oluşturma

Aşağıdaki örnek, Employee veritabanındaki AdventureWorks2025 tablosundaki tek bir dizini yeniden oluşturur.

ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee REBUILD;

B. Tablodaki tüm dizinleri yeniden oluşturma ve seçenekleri belirtme

Aşağıdaki örnek anahtar sözcüğünü ALLbelirtir. Bu, veritabanındaki tabloyla Production.ProductAdventureWorks2025 ilişkili tüm dizinleri yeniden oluşturur. Üç seçenek belirtilir.

ALTER INDEX ALL ON Production.Product
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);

Aşağıdaki örnek, düşük öncelikli kilit seçeneğini içeren ÇEVRİmİÇİ seçeneğini ve satır sıkıştırma seçeneğini ekler.

Ş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

ALTER INDEX ALL ON Production.Product
REBUILD WITH
(
    FILLFACTOR = 80,
    SORT_IN_TEMPDB = ON,
    STATISTICS_NORECOMPUTE = ON,
    ONLINE = ON ( WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 4 MINUTES, ABORT_AFTER_WAIT = BLOCKERS ) ),
    DATA_COMPRESSION = ROW
);

C. LOB sıkıştırma ile dizini yeniden düzenleme

Aşağıdaki örnek, veritabanındaki tek bir kümelenmiş dizini AdventureWorks2025 yeniden düzenler. Dizin yaprak düzeyinde bir LOB veri türü içerdiğinden, deyimi büyük nesne verilerini içeren tüm sayfaları da sıkıştırıyor. WITH (LOB_COMPACTION = ON) Varsayılan değer ON olduğundan seçeneği belirtmek gerekli değildir.

ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto REORGANIZE WITH (LOB_COMPACTION = ON);

D. Dizinde seçenekleri ayarlama

Aşağıdaki örnek, veritabanındaki dizinde AK_SalesOrderHeader_SalesOrderNumberAdventureWorks2025 çeşitli seçenekler ayarlar.

ALTER INDEX AK_SalesOrderHeader_SalesOrderNumber ON
    Sales.SalesOrderHeader
SET (
    STATISTICS_NORECOMPUTE = ON,
    IGNORE_DUP_KEY = ON,
    ALLOW_PAGE_LOCKS = ON
    ) ;
GO

E. Dizini devre dışı bırakma

Aşağıdaki örnek, veritabanındaki Employee tabloda AdventureWorks2025 kümelenmemiş bir dizini devre dışı bırakır.

ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee DISABLE;

F. Kısıtlamaları devre dışı bırak

Aşağıdaki örnek, veritabanındaki dizini devre dışı bırakarak kısıtlamayı PRIMARY KEYPRIMARY KEYAdventureWorks2025 devre dışı bırakır. FOREIGN KEY Temel tablodaki kısıtlama otomatik olarak devre dışı bırakılır ve uyarı iletisi görüntülenir.

ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department DISABLE;

Sonuç kümesi bu uyarı iletisini döndürür.

Warning: Foreign key 'FK_EmployeeDepartmentHistory_Department_DepartmentID'
on table 'EmployeeDepartmentHistory' referencing table 'Department'
was disabled as a result of disabling the index 'PK_Department_DepartmentID'.

G. Kısıtlamaları etkinleştir

Aşağıdaki örnek, Örnek F'de PRIMARY KEY devre dışı bırakılan ve FOREIGN KEY kısıtlamalarını etkinleştirir.

Kısıtlama PRIMARY KEY , dizini yeniden oluşturarak PRIMARY KEY etkinleştirilir.

ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department REBUILD;

Kısıtlama FOREIGN KEY daha sonra etkinleştirilir.

ALTER TABLE HumanResources.EmployeeDepartmentHistory
CHECK CONSTRAINT FK_EmployeeDepartmentHistory_Department_DepartmentID;
GO

H. Bölümlenmiş dizini yeniden oluşturma

Aşağıdaki örnek, veritabanındaki bölümlenmiş dizinin 5IX_TransactionHistory_TransactionDate bölüm numarası AdventureWorks2025olan tek bir bölümü yeniden oluşturur. Bölüm 5 ile ONLINE=ON yeniden oluşturulur ve düşük öncelikli kilit için 10 dakika bekleme süresi dizin yeniden oluşturma işlemi tarafından alınan her kilit için ayrı olarak uygulanır. Bu süre boyunca dizin yeniden derlemesini tamamlamak için kilit alınamazsa, yeniden oluşturma işlemi deyiminin kendisi nedeniyle ABORT_AFTER_WAIT = SELFdurduruldu.

Ş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

-- Verify the partitioned indexes.
SELECT *
FROM sys.dm_db_index_physical_stats (DB_ID(),OBJECT_ID(N'Production.TransactionHistory'), NULL , NULL, NULL);
GO
--Rebuild only partition 5.
ALTER INDEX IX_TransactionHistory_TransactionDate
ON Production.TransactionHistory
REBUILD Partition = 5
   WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 10 minutes, ABORT_AFTER_WAIT = SELF)));
GO

I. Dizinin sıkıştırma ayarını değiştirme

Aşağıdaki örnek bölümlenmemiş bir rowstore tablosundaki dizini yeniden oluşturur.

ALTER INDEX IX_INDEX1
ON T1
REBUILD
WITH (DATA_COMPRESSION = PAGE);
GO

J. XML sıkıştırması ile dizin ayarını değiştirme

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 bölümlenmemiş bir rowstore tablosundaki dizini yeniden oluşturur.

ALTER INDEX IX_INDEX1
ON T1
REBUILD
WITH (XML_COMPRESSION = ON);
GO

Daha fazla veri sıkıştırma örneği için bkz. Veri sıkıştırma.

K. Çevrimiçi devam ettirilebilen dizin yeniden oluşturma

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

Aşağıdaki örneklerde çevrimiçi olarak devam ettirilebilen dizin yeniden derlemesinin nasıl kullanılacağı gösterilmektedir.

ile MAXDOP = 1çevrimiçi dizin yeniden derleme işlemini devam ettirilebilir işlem olarak yürütebilirsiniz. Dizin işlemi duraklatıldıktan sonra aynı komutun yeniden yürütülmesi, dizin yeniden oluşturma işlemini otomatik olarak sürdürür.

ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);

240 dakikaya ayarlanmış bir çevrimiçi dizin yeniden derlemesini devam ettirilebilir işlem MAX_DURATION olarak yürütebilirsiniz.

ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);

Çalışan bir devam ettirilebilen çevrimiçi dizin yeniden derlemeyi duraklatma.

ALTER INDEX test_idx on test_table PAUSE;

4 olarak ayarlanmış yeni bir değer belirterek sürdürülebilir işlem olarak yürütülen bir dizin yeniden derlemesi için MAXDOP çevrimiçi dizin yeniden derlemesini sürdürebilirsiniz.

ALTER INDEX test_idx on test_table RESUME WITH (MAXDOP = 4);

Sürdürülebilir olarak yürütülen bir çevrimiçi dizin yeniden derleme işlemi için çevrimiçi dizin yeniden oluşturma işlemini sürdürebilirsiniz. 2 olarak ayarlayın MAXDOP , çalıştırılmakta olan dizinin yürütme süresini 240 dakika olarak ayarlayın ve kilitte bir dizin engelleniyorsa 10 dakika bekleyin ve bu işlemden sonra tüm engelleyiciler sonlandırılır.

ALTER INDEX test_idx on test_table
    RESUME WITH (MAXDOP = 2, MAX_DURATION = 240 MINUTES,
    WAIT_AT_LOW_PRIORITY (MAX_DURATION = 10, ABORT_AFTER_WAIT = BLOCKERS));

Çalışan veya duraklatılan devam ettirilebilir dizin yeniden oluşturma işlemini durdurun.

ALTER INDEX test_idx on test_table ABORT;