ALTER INDEX (Transact-SQL)

Var olan bir tablo veya görünüm dizinini (ilişkisel veya XML), dizini devre dışı bırakarak, yeniden oluşturarak veya yeniden düzenleyerek ya da dizinde seçenekler ayarlayarak değiştirir.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

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 ( LOB_COMPACTION = { ON | OFF } ) ]
  | SET ( <set_index_option> [ ,...n ] ) 
    }
[ ; ]

<object> ::=
{
    [ database_name. [ schema_name ] . | schema_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 }
  | ONLINE = { ON | OFF } 
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE } 
     [ ON PARTITIONS ( { <partition_number_expression> | <range> } 
     [ , ...n ] ) ]
}
<range> ::= 
<partition_number_expression> TO <partition_number_expression>
}

<single_partition_rebuild_index_option> ::=
{
    SORT_IN_TEMPDB = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE } }
}

<set_index_option>::=
{
    ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
}

Bağımsız değişkenler

  • index_name
    Dizinin adıdır. Dizin adları bir tablo veya görünüm içinde benzersiz olmalıdır, ancak bir veritabanı içinde benzersiz olmaları gerekmez. Dizin adları tanımlayıcı kurallarına uymalıdır.

  • ALL
    Dizin türünden bağımsız olarak tablo veya görünümün ilişkili tüm dizinlerini belirtir. Dizinlerden biri veya birkaçı çevrimdışı veya salt okunur bir dosya grubundaysa veya belirtilen işlem bir veya daha fazla dizin türünde kullanılamıyorsa, ALL seçeneğini belirtmek deyimin hata vermesine neden olur. Aşağıdaki tabloda dizin işlemlerini ve kullanılamayan dizin türlerini listelemektedir.

    Bu işlem ile ALL seçeneğini belirtmek

    Tabloda şunlardan biri veya birkaçı varsa hata verir

    REBUILD WITH ONLINE = ON

    XML dizini

    Uzamsal dizin

    Büyük nesne veri türü sütunları: image, text, ntext, varchar(max), nvarchar(max), varbinary(max) ve xml

    REBUILD PARTITION = partition_number

    Bölümlenmemiş dizin, XML dizini, uzamsal dizin veya devre dışı bırakılmış dizin

    REORGANIZE

    ALLOW_PAGE_LOCKS ayarı OFF olan dizinler

    REORGANIZE PARTITION = partition_number

    Bölümlenmemiş dizin, XML dizini, uzamsal dizin veya devre dışı bırakılmış dizin

    IGNORE_DUP_KEY = ON

    Uzamsal dizin

    XML dizini

    ONLINE = ON

    Uzamsal dizin

    XML dizini

    PARTITION = partition_number ile ALL belirtilirse, tüm dizinlerin hizalanması gerekir. Bu, denk bölümleme işlevlerine göre bölümlendikleri anlamına gelir. PARTITION ile ALL seçeneğini kullanmak, aynı partition_number değerine sahip tüm dizin bölümlerinin yeniden oluşturulup yeniden düzenlenmelerine neden olur. Bölümlenen dizinler hakkında daha fazla bilgi için, bkz. Bölümlenmiş tablolar ve dizinler.

  • database_name
    Veritabanının adıdır.

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

  • table_or_view_name
    Dizin ile ilişkili tablo veya görünümün adıdır. Bir nesnedeki dizinlerin bir raporunu görüntülemek için, sys.indexes katalog görünümünü kullanın.

  • REBUILD [ WITH (<yeniden_oluşturma_dizin_seçeneği> [ ,... n]) ]
    Dizinin aynı sütunlar, dizin türü, benzersizlik özniteliği ve sıralama düzeni kullanılarak yeniden oluşturulacağını belirtir. Bu yan tümce DBCC DBREINDEX yan tümcesine denktir. REBUILD devre dışı bırakılmış bir dizini etkinleştirir. Kümelenmiş bir dizinini yeniden oluşturmak, ALL anahtar sözcüğü belirtilmedikçe ilişkili kümelenmemiş dizinleri yeniden oluşturmaz. Dizin seçenekleri belirtilmezse, sys.indexes içindeki var olan dizin seçenek değerleri uygulanır. Değeri sys.indexes içinde depolanmamış herhangi bir dizin seçeneği için, seçeneğin bağımsız değişken tanımında gösterilen varsayılan uygulanır.

    Bir XML dizinini veya uzamsal bir dizini yeniden oluşturduğunuzda, ONLINE = ON ve IGNORE_DUP_KEY = ON seçenekleri geçerli değildir.

    ALL belirtilirse ve alttaki tablo bir yığınsa, yeniden oluşturma işleminin tablo üzerinde hiçbir etkisi olmaz. Tablo ile ilişkili tüm kümelenmemiş dizinler yeniden oluşturulur.

    Veritabanı kurtarma modeli toplu günlük veya basit olarak ayarlanmışsa, yeniden oluşturma işlemi en alt düzeyde günlüğe yazılabilir.

    [!NOT]

    Birincil bir XML dizinini yeniden oluşturduğunuzda, alttaki kullanıcı tablosu dizin işlemi boyunca kullanılamaz.

  • PARTITION
    Bir dizinin yalnızca bir bölümlemesinin yeniden oluşturulacağını veya yeniden düzenleneceğini belirtir. index_name bölümlenmiş bir dizin değilse, PARTITION belirtilemez.

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

    Dikkat notuDikkat

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

  • partition_number
    Yeniden oluşturulacak veya düzenlenecek bölümlenmiş bir dizinin bölüm numarasıdır. partition_number, değişkenlere başvurabilen sabit bir ifadedir. Bunlar kullanıcı tanımlı tür değişkenlerini veya işlevleri ve kullanıcı tanımlı işlevleri içerebilir, ancak bir Transact-SQL deyimine başvuramaz. partition_number var olmalıdır, yoksa deyim hata verir.

  • WITH (<tek_bölüm_yeniden_oluşturma_dizin_seçeneği>)
    SORT_IN_TEMPDB, MAXDOP ve DATA_COMPRESSION, tek bir bölümü (PARTITION = n) yeniden oluşturduğunuzda belirtilebilecek seçeneklerdir. XML dizinleri tek bölüm yeniden oluşturma işleminde belirtilemez.

    Bölümlenmiş bir dizini yeniden oluşturma çevrimiçi gerçekleştirilemez. Tüm tablo, bu işlem sırasında kilitlenir.

  • DISABLE
    Dizini devre dışı bırakılmış ve Veritabanı Altyapısı tarafından kullanılamaz olarak işaretler. Tüm dizinler devre dışı bırakılabilir. Devre dışı bir dizinin dizin tanımı temelini oluşturan veriler olmaksızın sistem kataloğunda kalır. Kümelenmiş bir dizini devre dışı bırakmak, alttaki tablo verilerine kullanıcı erişimini engeller. Bir dizini etkinleştirmek için, ALTER INDEX REBUILD veya CREATE INDEX WITH DROP_EXISTING kullanın. Daha fazla bilgi için, bkz. Dizinler ve kısıtlamalar devre dışı bırakma.

  • REORGANIZE
    Dizin yaprak düzeyinin yeniden düzenleneceğini belirtir. ALTER INDEX REORGANIZE deyimi her zaman çevrimiçi gerçekleştirilir. Bu, tabloyu uzun süre engelleyen kilitlerin tutulmadığı ve alttaki tabloda yapılan sorgu ve güncelleştirmelerin ALTER INDEX REORGANIZE işlemi sırasında devam edebileceği anlamına gelir. REORGANIZE, devre dışı bırakılmış veya ALLOW_PAGE_LOCKS ayarı OFF olan bir dizinde belirtilemez.

  • WITH ( LOB_COMPACTION = { ON | OFF } )
    Büyük nesne (LOB) verileri içeren tüm sayfaların sıkıştırılacağını belirtir. LOB veri türleri: image, text, ntext, varchar(max), nvarchar(max), varbinary(max) ve xml. Bu verileri sıkıştırmak disk alanı kullanımını iyileştirebilir. ON varsayılan değerdir.

    • ON
      Büyük nesne verisi içeren tüm sayfalar sıkıştırılır.

      Belirtilen kümelenmiş bir dizini yeniden düzenlemek, kümelenmiş dizinde içerilen tüm LOB sütunlarını sıkıştırır. Kümelenmemiş bir dizini yeniden düzenlemek, dizindeki anahtar olmayan (içerilen) tüm LOB sütunlarını sıkıştırır.

      ALL belirtildiğinde, belirtilen tablo veya görünüm ile ilişkili tüm dizinler yeniden düzenlenir ve kümelenmiş dizin, alttaki tablo veya dizinde içerilen kümelenmemiş dizin ile ilişkili tüm LOB sütunları sıkıştırılır.

    • OFF
      Büyük nesne verisi içeren sayfalar sıkıştırılmaz.

      OFF seçeneğinin yığın üzerinde bir etkisi yoktur.

    LOB sütunları yoksa, LOB_COMPACTION yan tümcesi yoksayılır.

  • SET ( <dizin_ayarla seçeneği> [ ,... n] )
    Dizini yeniden oluşturmadan veya yeniden düzenlemeden dizin seçeneklerini belirtir. SET devre dışı bırakılmış bir dizinde belirtilemez.

  • PAD_INDEX = { ON | OFF }
    Dizin dolgusunu belirtir. Varsayılan değer OFF'tur.

    • ON
      FILLFACTOR tarafından belirtilen boş alan yüzdesi, dizinin ara düzey sayfalarına uygulanır. PAD_INDEX ON olarak ayarlandığında FILLFACTOR belirtilmezse, sys.indexes içinde depolanan doldurma faktörü değeri kullanılır.

    • OFF veya fillfactor belirtilmez
      Ara düzey sayfalar kapasitenin tamamına yakın doldurulur. Bu, dizinin, ara sayfaların anahtarlarının kümesi temel alındığında ulaşabileceği en büyük boyuttaki en az bir satır için yeterli yer bırakır.

    Daha fazla bilgi için, bkz. Index (Transact-sql) oluştur.

  • FILLFACTOR = fillfactor
    Veritabanı Altyapısı uygulamasının dizin oluşturma veya değiştirme sırasında her dizin sayfasının yaprak düzeyini ne kadar dolu yapması gerektiğini gösteren bir yüzde belirtir. fillfactor, 1 ile 100 arasında bir tamsayı olmalıdır. Varsayılan 0'dır.

    [!NOT]

    Doldurma faktörü değerleri 0 ve 100 her açıdan aynıdır.

    Açık bir FILLFACTOR ayarı, yalnızca dizin ilk oluşturulduğunda veya yeniden oluşturulduğunda uygulanır. Veritabanı Altyapısı, belirtilen yüzdedeki boş alanı sayfalarda dinamik olarak korumaz. Daha fazla bilgi için, bkz. Index (Transact-sql) oluştur.

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

    Önemli notÖnemli

    Bir FILLFACTOR değeri ile kümelenmiş bir dizin oluşturmak veya bu dizini değiştirmek, Veritabanı Altyapısı kümelenmiş dizini oluştururken verileri yeniden dağıttığından verinin kapladığı depolama alanı miktarını etkiler.

  • SORT_IN_TEMPDB = { ON | OFF }
    Sıralama sonuçlarının tempdb'de depolanıp depolanmayacağını belirtir. Varsayılan değer OFF'tur.

    • ON
      Dizinleri oluşturmak için ara sıralama sonuçları tempdb'de depolanır. tempdb kullanıcı veritabanından farklı bir disk kümesindeyse, bu, dizin oluşturmak için gereken süreyi azaltabilir. Ancak, dizinin oluşturulması sırasında kullanılan disk alanı miktarını da artırır.

    • OFF
      Ara sıralama sonuçları, dizin ile aynı veritabanında depolanır.

    Bir sıralama işlemi gerekmiyorsa veya sıralama bellekte gerçekleştirilebilirse, SORT_IN_TEMPDB seçeneği yoksayılır.

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

  • IGNORE_DUP_KEY = { ON | OFF }
    Bir ekleme işlemi benzersiz bir dizine yinelenen anahtar değerleri eklemeye çalıştığında verilecek hata yanıtını belirtir. IGNORE_DUP_KEY seçeneği yalnızca dizin oluşturulduktan veya yeniden oluşturulduktan sonraki ekleme işlemlerine uygulanır. Varsayılan değer OFF'tur.

    • 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 hata verir.

    • OFF
      Benzersiz dizine yinelenen anahtar değerleri eklendiğinde bir hata iletisi oluşur. Tüm INSERT işlemi geri alınır.

    Bir görünümde oluşturulan dizinlerde, benzersiz olmayan dizinlerde, XML dizinlerinde, uzamsal dizinlerde ve filtrelenmiş dizinlerde IGNORE_DUP_KEY ayarı ON olamaz.

    IGNORE_DUP_KEY değerini görüntülemek için, sys.indexes'i kullanın.

    WITH IGNORE_DUP_KEY, geriye doğru uyumluluk dizininde WITH IGNORE_DUP_KEY = ON ayarına denktir.

  • STATISTICS_NORECOMPUTE = { ON | OFF }
    Dağılım istatistiklerinin hesaplanıp hesaplanmayacağını belirtir. Varsayılan değer OFF'tur.

    • ON
      Güncelliğini yitirmiş istatistikler otomatik olarak yeniden hesaplanmaz.

    • OFF
      İstatistiklerin otomatik güncelleştirilmesi etkinleştirilir.

    Otomatik istatistik güncelleştirmeyi geri yüklemek için, STATISTICS_NORECOMPUTE ayarını OFF yapın veya UPDATE STATISTICS deyimini NORECOMPUTE yan tümcesi olmadan yürütün.

    Önemli notÖnemli

    Dağılım istatistiklerinin otomatik yeniden hesaplanmasını devre dışı bırakmak, sorgu iyileştiricinin tabloyu ilgilendiren sorgular için iyi yürütme planları seçmesini engelleyebilir.

  • ONLINE = { ON | OFF }
    Alttaki tabloların ve ilişkili dizinlerin dizin işlemi sırasında sorgularda ve veri değiştirmede kullanılıp kullanılamayacağını belirtir. Varsayılan değer OFF'tur.

    Bir XML dizini veya uzamsal bir dizin için yalnızca ONLINE = OFF desteklenir ve ONLINE ayarı ON yapılırsa bir hata oluşur.

    [!NOT]

    Çevrimiçi dizin işlemleri her Microsoft SQL Server sürümünde bulunmaz. SQL Server sürümleri tarafından desteklenen özelliklerin bir listesi için, bkz. SQL Server 2012 Sürümleri Tarafından Desteklenen Özellikler.

    • ON
      Uzun dönemli tablo kilitleri, dizin işlemi süresince tutulmaz. Dizin işlemini ana aşaması sırasında kaynak tabloda yalnızca bir Amaç Paylaşımı (IS) kilidi tutulur. Bu, alttaki tabloda ve dizinlerde sorgu ve güncelleştirmelerin sürmesine izin verir. İşlemin başlangıcında, kaynak nesne üzerinde çok kısa bir süre Paylaşılan (S) bir kilit tutulur. İşlemin sonunda, kümelenmemiş bir dizin oluşturuluyorsa kaynak üzerinde çok kısa bir süre bir S kilidi tutulur veya kümelenmiş bir dizin çevrimiçi olarak oluşturduğu veya bırakıldığında ya da kümelenmiş veya kümelenmemiş bir dizin yeniden oluşturulduğunda bir SCH-M (Şema Değiştirme) kilidi alınır. Yerel geçici bir tabloda bir dizin oluşturulurken ONLINE ayarı ON yapılamaz.

    • OFF
      Dizin işlemi süresinde tablo kilitleri uygulanır. Kümelenmiş, uzamsal veya XML bir dizin oluşturan, yeniden oluşturan veya bırakan ya da kümelenmemiş bir dizini bırakan çevrimdışı bir dizin işlemi, tabloda bir Şema değiştirme (Sch-M) kilidir alır. Bu, işlem süresi boyunca alttaki tabloya tüm kullanıcı erişimini engeller. Kümelenmemiş bir dizin oluşturan çevrimdışı bir dizi işlemi tabloda Paylaşılan (S) bir kilit alır. Bu, alttaki tabloda güncelleştirme yapılmasını engeller ancak SELECT deyimleri gibi okuma işlemlerine izin verir.

    Daha fazla bilgi için, bkz. Nasıl çevrimiçi dizin işlemleri çalışma.

    Küresel geçici tablolar üzerindeki dizinler dahil dizinler, aşağıdaki kural dışı durumlar dışında çevrimiçi olarak yeniden oluşturulabilir:

    • XML dizinleri

    • Yerel geçici tablolardaki dizinler

    • Bölümlenmiş bir dizinin bir alt kümesi (Bölümlenmiş bir dizinin tamamı çevrimiçi oluşturulabilir.)

    • Alttaki tablo LOB veri türlerini içeriyorsa kümelenmiş dizinler

    • image, ntext ve text veri türü sütunları ile tanımlanan kümelenmemiş dizinler

    Tablo LOB veri türleri içeriyorsa, ancak bu sütunlardan hiçbiri dizin tanımında anahtar veya anahtar olmayan sütun olarak kullanılmıyorsa, kümelenmemiş dizinler çevrimiçi olarak oluşturulabilir.

  • ALLOW_ROW_LOCKS = { ON | OFF }
    Satır kilidi kullanılıp kullanılamadığını belirtir. ON varsayılan değerdir.

    • ON
      Dizine erişilirken satır kilitleri kullanılabilir. Satır kilitlerinin ne zaman kullanıldığını Veritabanı Altyapısı belirler.

    • OFF
      Satır kilitleri kullanılmaz.

  • ALLOW_PAGE_LOCKS = { ON | OFF }
    Sayfa kilidi kullanılıp kullanılamadığını belirtir. ON varsayılan değerdir.

    • ON
      Sayfa kilitlerini dizine eriştiğinizde kullanabilirsiniz. Sayfa kilitlerinin ne zaman kullanıldığını Veritabanı Altyapısı belirler.

    • OFF
      Sayfa kilitleri kullanılmaz.

    [!NOT]

    ALLOW_PAGE_LOCKS ayarı OFF olduğunda bir dizin yeniden düzenlenemez.

  • MAXDOP **=**max_degree_of_parallelism
    En yüksek paralel işlem derecesi yapılandırma seçeneğini, dizin işleminin süresi boyunca geçersiz kılar. Daha fazla bilgi için, bkz. Maksimum ölçüde parallelism sunucu yapılandırma seçeneği yapılandırmak. Paralel plan yürütmede kullanılan işlemci sayısını sınırlamak için MAXDOP kullanın. En fazla değer 64 işlemcidir.

    Önemli notÖnemli

    MAXDOP seçeneği tüm XML dizinlerinde sözdizimi olarak desteklenirse de uzamsal bir dizinde veya birincil bir XML dizininde ALTER INDEX halen yalnızca bir işlemci kullanmaktadır.

    max_degree_of_parallelism şunlar olabilir:

    • 1
      Paralel plan üretimini baskılar.

    • >1
      Paralel bir dizin işleminde kullanılan en yüksek işlemci sayısını belirtilen sayı ile sınırlar.

    • 0 (varsayılan)
      Geçerli sistem iş yüküne bağlı olarak gerçek işlemci sayısını veya daha azını kullanır.

    Daha fazla bilgi için, bkz. Parallel ındex işlemi yapılandırma.

    [!NOT]

    Paralel dizin işlemleri her Microsoft SQL Server sürümünde bulunmaz. SQL Server sürümleri tarafından desteklenen özelliklerin bir listesi için, bkz. SQL Server 2012 Sürümleri Tarafından Desteklenen Özellikler.

  • DATA_COMPRESSION
    Belirtilen dizin, bölümleme numarası veya bölümleme aralığı için veri sıkıştırma seçeneğini belirtir. Seçenekler aşağıdaki gibidir:

    • NONE
      Dizin veya belirtilen bölümler sıkıştırılmaz.

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

    • PAGE
      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.

  • ON PARTITIONS ( { <bölümleme_numarası_ifadesi> | <aralık> } [,...n] )
    DATA_COMPRESSION ayarının uygulandığı bölümleri belirtir. Dizin bölümlenmemişse, ON PARTITIONS bağımsız değişkeni bir hata üretir. ON PARTITIONS yan tümcesi sağlanmazsa, DATA_COMPRESSION seçeneği bölümlenmiş bir dizinin tüm bölümlerine uygulanır.

    <bölümleme_numarası_ifadesi> aşağıdaki biçimlerde belirtilebilir:

    • Bir bölümün numarasını sağlayın; örneğin: ON PARTITIONS (2).

    • Birkaç ayrı bölümlemenin bölüm numaralarını, virgüllerle ayırarak sağlayın; örneğin: ON PARTITIONS (1, 5).

    • Hem aralıkları, hem ayrı ayrı bölümleri sağlayın: ON PARTITIONS (2, 4, 6 TO 8).

    <aralık> TO sözcüğü ile ayrılmış bölüm numaraları olarak belirtilebilir; örneğin: ON PARTITIONS (6 TO 8).

    Farklı bölümlerde 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)
    )
    
    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)
    )
    

Açıklamalar

ALTER INDEX bir dizini yeniden bölümlemek veya farklı bir dosya grubuna taşımak için kullanılamaz. Bu deyim, dizin tanımını değiştirmek; örneğin sütun ekleyip silmek veya sütun sırasını değiştirmek için kullanılamaz. Bu işlemleri gerçekleştirmek için DROP_EXISTING yan tümcesiyle CREATE INDEX kullanın.

Bir seçenek açık olarak belirtilmediğinde, geçerli ayar uygulanır. Örneğin, REBUILD yan tümcesinde bir FILLFACTOR ayarı belirtilmezse, yeniden oluşturma sürecinde 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'i kullanın.

[!NOT]

ONLINE, MAXDOP ve SORT_IN_TEMPDB değerleri sistem kataloğunda depolanmaz. Dizin deyiminde belirtilmedikçe seçeneğin varsayılan değeri kullanılır.

Çok işlemcili bilgisayarlarda, diğer sorgular gibi ALTER INDEX REBUILD da dizini değiştirme ile ilgili tarama ve sıralama işlemlerini gerçekleştirmek için otomatik olarak daha fazla işlemci kullanır. LOB_COMPACTION seçeneği ile veya bu seçenek olmadan ALTER INDEX REORGANIZE deyimini yürüttüğünüzde, en yüksek paralel işlem düzeyi değeri tek iş parçacıklı bir işlemdir. Daha fazla bilgi için, bkz. Parallel ındex işlemi yapılandırma.

İçinde durduğu dosya grubu çevrimdışıysa veya salt okunur olarak ayarlıysa, dizin yeniden düzenlenemez ve oluşturulamaz. ALL anahtar sözcüğü belirtildiğinde ve bir veya daha fazla dizin çevrimdışı veya salt okunur bir dosya grubunda olduğunda, deyim hata verir.

Dizinleri Yeniden Oluşturma

Bir dizini yeniden oluşturmak, dizini bırakıp yeniden oluşturur. Bu, parçalanmayı ortadan kaldırır, sayfaları belirtilen veya var olan doldurma faktörü ayarına göre sıkıştırarak disk alanı kazandırır ve dizin satırlarını art arda sayfalar olarak yeniden sıralar. ALL belirtildiğinde, tablodaki tüm dizinler, tek bir işlemde bırakılır ve yeniden oluşturulur. FOREIGN KEY kısıtlamalarının önceden bırakılması gerekmez. 128 veya daha fazla uzantılı dizinler yeniden oluşturulduğunda, Veritabanı Altyapısı, gerçek sayfaların ayrılmış alanlarını ve ilişkili kilitlerini geri almayı işlemin yürütülmesinden sonraya erteler.

Küçük dizinleri yeniden oluşturmak ve yeniden düzenlemek, sıklıkla parçalanmayı azaltmaz. Küçük dizinlerin sayfaları karışık uzantılarda depolanır. Karışık uzantılar sekiz adede kadar nesne tarafından paylaşılır, bu yüzden küçük bir dizindeki parçalanma, yeniden düzenleme veya oluşturmadan sonra azaltılamayabilir.

SQL Server 2012'da istatistikler, bölümlenmiş bir dizin oluşturulduğunda veya yeniden oluşturulduğunda tabloda tüm satırlar taranarak oluşturulmaz. Bunun yerine sorgu iyileştirici, istatistikleri üretmek için varsayılan örnekleme algoritmasını kullanır. Tablodaki tüm satırları tarayarak bölümlenmiş dizinler hakkında istatistik elde etmek için, CREATE STATISTICS veya UPDATE STATISTICS deyimini FULLSCAN yan tümcesiyle kullanın.

Daha önceki SQL Server sürümlerinde, donanım arızalarının neden olduğu tutarsızlıkları düzeltmek için bazen kümelenmemiş bir dizin yeniden oluşturulabiliyordu. SQL Server 2008 ve sonraki sürümlerinde, dizin ve kümelenmiş dizin arasındaki bu tür tutarsızlıkları, kümelenmemiş bir dizini çevrimdışı olarak yeniden oluşturarak hala onarabilirsiniz. Ancak, kümelenmemiş dizin tutarsızlıklarını dizini çevrimiçi olarak yeniden oluşturarak onaramazsınız çünkü çevrimiçi yeniden oluşturma düzeneği var olan kümelenmemiş dizini yeniden oluşturmada temel alır ve bu yüzden tutarsızlıklar kalır. Buna karşın dizini çevrimdışı olarak yeniden oluşturmak, kümelenmiş dizinde (veya yığında) bir tarama zorlar ve dolayısıyla tutarsızlığı ortadan kaldırır. Önceki sürümlerde olduğu gibi etkilenen verileri bir yedekten geri yükleyerek tutarsızlıkları gidermenizi öneririz; ancak, dizin tutarsızlıklarını, kümelenmemiş dizini çevrimdışı yeniden oluşturarak onarabilirsiniz. Daha fazla bilgi için, bkz. DBCC CHECKDB (Transact-SQL).

Dizinleri Yeniden Düzenleme

Bir dizini yeniden düzenleme, çok az sistem kaynağı kullanır. Yaprak düzeyi sayfaları yaprak düğümlerinin mantıksal, soldan sağa sıralamasını fiziksel olarak yeniden yaparak tablo ve görünümlerdeki kümelenmiş ve kümelenmemiş dizinleri birleştirir. Yeniden düzenleme ayrıca dizin sayfalarını da sıkıştırır. Sıkıştırma var olan doldurma faktörü değerine dayanır. Doldurma faktörü ayarını görüntülemek için, sys.indexes'i kullanın.

ALL belirtildiğinde, tablodaki ilişkisel dizinlerin hem kümelenmiş hem kümelenmemiş olanları ve XML dizinleri yeniden düzenlenir. ALL belirtilirken bazı kısıtlamalar geçerlidir; Bağımsız Değişkenler kısmındaki ALL tanımına bakın.

Daha fazla bilgi için, bkz. Yeniden düzenleme ve dizinler yeniden oluşturma.

Dizinleri Devre Dışı Bırakma

Bir dizini devre dışı bırakmak, kullanıcının dizine ve kümelenmiş dizinlerde alttaki tablo verilerine erişimini engeller. Dizin tanımı sistem kataloğunda kalır. Bir görünümün kümelenmiş veya kümelenmemiş bir dizinini devre dışı bırakmak, dizin verilerini fiziksel olarak siler. Kümelenmiş bir dizini devre dışı bırakmak verilere erişimi engeller, ancak dizin bırakılana veya yeniden oluşturulana kadar veriler B ağacında sürdürülmeden kalır. Etkinleştirilmiş veya devre dışı bırakılmış bir dizinin durumunu görüntülemek için, sys.indexes katalog görünümündeki is_disabled sütununu sorgulayın.

Bir tablo işlemsel çoğaltma yayımlama durumundaysa, birincil anahtar sütunlarıyla ilişkili dizinlerden hiçbirini devre dışı bırakamazsınız. Bu dizinler çoğaltma için gereklidir. Bir dizini devre dışı bırakmak için, önce tabloyu yayımlamadan bırakmanız gerekir. Daha fazla bilgi için, bkz. Verileri ve veritabanı nesnelerini Yayımla.

Dizini etkinleştirmek için ALTER INDEX REBUILD deyimini veya CREATE INDEX WITH DROP_EXISTING deyimini kullanın. Devre dışı bırakılmış kümelenmiş bir dizini yeniden oluşturma, ONLINE ayarı ON olarak gerçekleştirilemez. Daha fazla bilgi için, bkz. Dizinler ve kısıtlamalar devre dışı bırakma.

Ayar Seçenekleri

Belirli bir dizini yeniden oluşturmadan veya yeniden düzenlemeden o dizin için ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, IGNORE_DUP_KEY ve STATISTICS_NORECOMPUTE seçeneklerini belirleyebilirsiniz. Değiştirilen değerler hemen dizine uygulanır. Bu seçenekleri görüntülemek için, sys.indexes'i kullanın. Daha fazla bilgi için, bkz. Dizin seçeneklerini ayarlama.

Satır ve Sayfa Kilitleme Seçenekleri

ALLOW_ROW_LOCKS = ON ve ALLOW_PAGE_LOCK = ON seçenekleri belirlendiğinde, dizine eriştiğinizde satır düzeyi, sayfa düzeyi ve tablo düzeyi kilitlere izin verilir. Veritabanı Altyapısı uygun kilidi seçer ve kilidi satır veya sayfa kilidinden bir tablo kilidine yükseltebilir.

ALLOW_ROW_LOCKS = OFF ve ALLOW_PAGE_LOCK = OFF seçenekleri belirlendiğinde, dizine eriştiğinizde yalnızca tablo düzeyi bir kilide izin verilir.

Satır veya sayfa kilidi seçenekleri belirlendiğinde ALL belirtilirse, ayarlar tüm dizinlere uygulanır. Alttaki tablo bir yığın olduğunda, ayarlar aşağıdaki şekillerde uygulanır:

ALLOW_ROW_LOCKS = ON veya OFF

Yığına ve ilişkili kümelenmemiş dizinlere.

ALLOW_PAGE_LOCKS = ON

Yığına ve ilişkili kümelenmemiş dizinlere.

ALLOW_PAGE_LOCKS = OFF

Kümelenmemiş dizinlere tam olarak. Bu, kümelenmemiş dizinlerde tüm sayfa kilitlerine izin verildiği anlamına gelir. Yığında yalnızca sayfa için paylaşılan (S), güncelleştirme (U) ve özel kullanım (X) kilitlerine izin verilir. Veritabanı Altyapısı, dahili kullanım için yine de bir kullanım amacı sayfa kilidi (IS, IU veya IX) alabilir.

Çevrimiçi Dizin İşlemleri

Bir dizini yeniden oluştururken ve ONLINE seçeneği ON olarak ayarlandığında, alttaki nesneler, tablolar ve ilişkili dizinler sorgular ve veri değiştirme için kullanılabilir. Özel kullanım amaçlı tablo kilitleri, değiştirme süreci boyunca yalnızca çok kısa bir süre tutulur.

Bir dizini yeniden düzenleme her zaman çevrimiçi gerçekleştirilir. Süreç kilitleri uzun süre tutmaz ve dolayısıyla çalışmakta olan sorgu ve güncelleştirmeleri engellemez.

Aynı tablo üzerinde eşzamanlı çevrimiçi dizin işlemlerini yalnızca aşağıdakileri yaparken gerçekleştirebilirsiniz:

  • Birden çok kümelenmemiş dizin oluşturma.

  • Aynı tablodaki farklı dizinleri yeniden düzenleme.

  • Aynı tabloda örtüşmeyen dizinleri yeniden oluştururken farklı dizinleri yeniden düzenleme.

Aynı anda gerçekleştirilen tüm diğer çevrimiçi dizin işlemleri hata verir. Örneğin, aynı tabloda eşzamanlı olarak iki veya daha fazla oluşturamazsınız veya var olan bir dizini yeniden oluştururken yeni bir dizin oluşturamazsınız.

Daha fazla bilgi için, bkz. Çevrimiçi dizin işlemleri gerçekleştirme.

Uzamsal Dizin Kısıtlamaları

Uzamsal bir dizini yeniden oluşturduğunuzda, uzamsal dizin bir şema kilidi tuttuğundan dizin işlemi süresince alttaki kullanıcı tablosu kullanılamaz.

Kullanıcı tablosundaki PRIMARY KEY kısıtlaması, o tablonun bir sütununda uzamsal bir dizin tanımlanırken değiştirilemez. PRIMARY KEY kısıtlamasını değiştirmek için, önce tablodaki tüm uzamsal dizinleri bırakın. PRIMARY KEY kısıtlamasını değiştirdikten sonra, uzamsal dizinlerin tümünü yeniden oluşturabilirsiniz.

Tek bir yeniden bölüm oluşturma işleminde herhangi bir uzamsal dizin belirtemezsiniz. Ancak, bölümün tam olarak yeniden oluşturulmasında uzamsal dizinler belirtebilirsiniz.

BOUNDING_BOX veya GRID gibi uzamsal dizine özgü olan seçenekleri değiştirmek için, DROP_EXISTING = ON belirten bir CREATE SPATIAL INDEX deyimi kullanabilir veya uzamsal dizini bırakıp yeni bir tanesini oluşturabilirsiniz. Örnek olarak, bkz. KAYMA Index (Transact-sql) oluştur.

Sütun Deposu Dizini Kısıtlamaları

Sütun deposu dizini değiştirilemez. Bunun yerine sütun deposu dizinini bırakıp yeniden oluşturun.

Veri Sıkıştırma

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

Sıkıştırma durumunun bir tabloyu, dizini veya bölümü nasıl etkileyeceğini değerlendirmek için sp_estimate_data_compression_savings saklı yordamını kullanın.

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

  • ALTER INDEX ALL ..., deyimini kullandığınızda, tablonun hizalanmamış dizinleri varsa, tek bir bölümün sıkıştırma ayarını değiştiremezsiniz.

  • ALTER INDEX <dizin> ... REBUILD PARTITION ... sözdizimi, dizinin belirtilen bölümünü yeniden oluşturur.

  • ALTER INDEX <dizin> ... REBUILD WITH ... sözdizimi, dizinin tüm bölümlerini yeniden oluşturur.

İstatistikler

Tabloda ALTER INDEX ALL … çalıştırdığınızda, yalnızca dizinlerle ilişkili istatistikler güncelleştirilir. Dizin yerine tabloda otomatik veya el ile oluşturulmuş istatistikler güncelleştirilmez.

İzinler

ALTER INDEX deyimini yürütmek için, tablo veya görünümde en az ALTER izni gerekir.

Örnekler

A.Dizini yeniden oluşturma

Aşağıdaki örnek Employee tablosunda tek bir dizini yeniden oluşturur.

USE AdventureWorks2012;
GO
ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.Employee
REBUILD;
GO

B.Bir tablodaki tüm dizinleri yeniden oluşturma ve seçenek belirtme

Aşağıdaki örnek, ALL anahtar sözcüğünü belirtmektedir. Bu, tablo ile ilişkili tüm dizinleri yeniden oluşturur. Üç seçenek belirtilir.

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

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

Aşağıdaki örnek tek bir kümelenmiş dizini yeniden düzenler. Dizinde yaprak düzeyinde LOB verileri olduğundan, deyim ayrıca büyük nesne verisi içeren tüm sayfaları da sıkıştırır. Varsayılan değer ON olduğundan, WITH (LOB_COMPACTION) seçeneğinin belirtilmesinin gerekli olmadığına dikkat edin.

USE AdventureWorks2012;
GO
ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto
REORGANIZE ;
GO

D.Bir dizinin seçeneklerini ayarlama

Aşağıdaki örnek AK_SalesOrderHeader_SalesOrderNumber dizininde birkaç seçeneği belirler.

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

E.Bir dizini devre dışı bırakma

Aşağıdaki örnek, Employee tablosundaki kümelenmemiş bir dizini devre dışı bırakmaktadır.

USE AdventureWorks2012;
GO
ALTER INDEX IX_Employee_OrganizationNode ON HumanResources.Employee
DISABLE ;
GO

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

Aşağıdaki örnek, PRIMARY KEY dizinini devre dışı bırakarak bir PRIMARY KEY kısıtlamasını devre dışı bırakmaktadır. Alttaki tablodaki FOREIGN KEY kısıtlaması, otomatik olarak devre dışı bırakılır ve bir uyarı iletisi gösterilir.

USE AdventureWorks2012;
GO
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department
DISABLE ;
GO

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

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

PRIMARY KEY kısıtlaması, PRIMARY KEY dizini yeniden oluşturularak etkinleştirilmektedir.

USE AdventureWorks2012;
GO
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department
REBUILD ;
GO

FOREIGN KEY kısıtlaması daha sonra etkinleştirilmektedir.

ALTER TABLE HumanResources.EmployeeDepartmentHistory
CHECK CONSTRAINT FK_EmployeeDepartmentHistory_Department_DepartmentID;
GO

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

Aşağıdaki örnek, IX_TransactionHistory_TransactionDate bölümlenmiş dizininin bölüm numarası 5 olan tek bir bölümünü yeniden oluşturmaktadır.

USE AdventureWorks;
GO
-- 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;
GO

USE AdventureWorks;
GO
-- 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;
GO

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

Aşağıdaki örnek, bölümlenmemiş bir tablodaki bir dizini yeniden oluşturmaktadır.

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

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

Başka veri sıkıştırma örnekleri için, bkz. Veri Sıkıştırma.

Ayrıca bkz.

Başvuru

Index (Transact-sql) oluştur

KAYMA Index (Transact-sql) oluştur

xml Index (Transact-sql) oluştur

drop INDEX (Transact-sql)

sys.dm_db_index_physical_stats (Transact-sql)

eventdata (Transact-sql)

Kavramlar

Dizinler ve kısıtlamalar devre dışı bırakma

xml dizinleri (SQL Server)

Çevrimiçi dizin işlemleri gerçekleştirme

Yeniden düzenleme ve dizinler yeniden oluşturma