Yeniden düzenleme ve dizinler yeniden oluşturuluyor

The SQL Server Veritabanı Altyapısı automatically maintains indexes whenever insert, update, or delete operations are made to the underlying data.Üzerinden saat bu değişiklikleri bilgileri dizinde (parçalara) veritabanında dağılmış duruma neden olabilir.Parçalanma var sayfalar içinde mantıksal, anahtar değerine göre sıralama eşleşmiyor fiziksel dizinler varsa, veri dosyası içinde sipariş.Yoğun bir şekilde parçalanmış dizinler sorgu performansı düşürebilir ve uygulamanız yavaş yanıt vermesine neden.Bu daha fazla bilgi için bkz: Microsoft Web sitesi.

Dizin parçalanmasının onarmak ya da bir dizin yeniden düzenleyerek ya da bir dizini yeniden oluşturuluyor.Yerleşik olarak bir bölümleme düzeni bölümlenmiş dizinler için bu yöntemlerin tam bir dizin veya bir dizinin tek bir bölüm ya da kullanabilirsiniz.

Parçalanma algılama

Karar vermek için kullanılacak disk birleştirme yöntem ilk adımı, dizin parçalanma derecesini belirlemek için analiz etmektir.Sistem işlev kullanılarak sys.dm_db_index_physical_stats, yapabilirsiniz algılamak parçalanma belirli bir dizin, bir tablo veya dizinli görünüm üzerinde tüm dizinler, bir veritabanındaki tüm dizinleri veya tüm veritabanlarındaki tüm dizinler.Bölümlenmiş dizinler için sys.dm_db_index_physical_stats her bölüm için parçalanma bilgi de sağlar.

Tarafından döndürülen sonuç küme sys.dm_db_index_physical_stats işlev aşağıdaki sütunları içerir.

Column

Açıklama

avg_fragmentation_in_percent

(Dizin sırası sayfaları) mantıksal parçalanma yüzdesi.

fragment_count

Dizin parçalanma (fiziksel olarak ardışık yaprak sayfaları) sayısı.

avg_fragment_size_in_pages

Bir dizindeki bir parça sayfalarında ortalama sayısı.

Parçalanma derecesini bilinen sonra parçalanma düzeltmek için en iyi yöntem belirlemek için aşağıdaki tablo kullanın.

avg_fragmentation_in_percent değer

Düzeltici deyim

>5% and < = 30%

ALTER DİZİN YENİDEN DÜZENLE

> 30%

ALTER DİZİN YENİDEN OLUŞTURMA (ÇEVRİMİÇİ = ON) *

* Dizin yeniden oluşturma çevrimiçi veya çevrimdışı çalıştırılır.Bir dizini yeniden düzenleme her zaman çevrimiçi yürütülür.Yeniden düzenle seçeneğine benzer kullanılabilirlik elde etmek için çevrimiçi dizinler yeniden oluşturmalısınız.

Bu değerler, alter dizin yeniden DÜZENLEMEK ve alter dizin yeniden arasında geçer noktası belirlemek için kaba bir kılavuz sağlar.Ancak, gerçek değerleri durum durum değişebilir.Ortamınız için en iyi eşiği belirlemek için deneme önemlidir.

Böyle küçük bir miktar parçalanma kaldırmayı gelen yararı üzerinde hemen hemen her zaman gelişir yeniden düzenleyerek veya dizini yeniden oluşturuluyor maliyetini tarafından outweighed çünkü çok düşük düzeyde parçalanma (daha az yüzde 5'inden) aşağıdaki komutlardan birini ele alınması gereken değil.

Not

Genel olarak, küçük dizinler üzerinde parçalanma denetlenebilir değil genellikle.Karışık uzantılarına bağlı sayfaları küçük dizinleri saklanır.Parçalanmanın küçük bir dizini yeniden düzenleme veya dizini yeniden oluşturuluyor sonra azalabilir değil böylece karışık kapsamlarını en fazla sekiz nesneler tarafından paylaşılır.Karışık kapsamları hakkında daha fazla bilgi için bkz: Anlama sayfaları ve kapsam.

Örnek

Aşağıdaki örnek sorgu sys.dm_db_index_physical_stats üzerinde tüm dizinler için ortalama parçalanma dönmek için dinamik yönetimi işlev Production.Product tablo.Önceki tablo kullanarak, yeniden düzenlemek için önerilen çözünürlüğü ise PK_Product_ProductID ve yeniden diğer dizinler.

USE AdventureWorks2008R2;
GO
SELECT a.index_id, name, avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID(N'Production.Product'),
     NULL, NULL, NULL) AS a
    JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;
GO

Return deyim bir sonuç küme aşağıdakine benzer.

index_id    name                        avg_fragmentation_in_percent
----------- --------------------------- ----------------------------
1           PK_Product_ProductID        15.076923076923077
2           AK_Product_ProductNumber    50.0
3           AK_Product_Name             66.666666666666657
4           AK_Product_rowguid          50.0

(4 row(s) affected)

Bir dizini yeniden düzenleme

Bir veya daha fazla dizini yeniden düzenlemek için yeniden düzenle yan tümce tümce tümcesinde alter INDEX deyim kullanın.Bu deyim dbcc INDEXDEFRAG deyimi değiştirir.Tek bir bölüm bölümlenmiş dizin yeniden düzenlemek için bölüm yan tümce tümce tümcesini alter INDEX kullanın.

Dizin birleştirir yeniden düzenleme yaprak düzeyi , kümelenmiş ve kümelenmemiş dizinleri tablolar ve görünümler tarafından fiziksel olarak yaprak düzey sayfalar (soldan sağa) mantıksal sırası yaprak düğümlerin eşleştirmek için yeniden sıralama.Sayfaları sırayla sahip dizin tarama performansını artırır.Dizin içinde kendisine ayrılan varolan sayfaları yeniden düzenlenmesi; Yeni sayfa ayrılır.Dizin birden fazla dosya yayılırsa, dosyalar yeniden düzenlenen bir at, bir saat.Sayfalar arasında dosya geçirin.

Yeniden düzenleme dizin sayfaları sıkıştırır.Bu düzenleme tarafından oluşturulan boş sayfalar, ek disk alanı sağlamak kaldırılır.Sıkıştırma esas doldurma faktörü değer içinde sys.indexes Katalog görünümü.

Yeniden düzenle işlemi en az sistem kaynağı kullanır.Ayrıca, yeniden düzenleyerek otomatik olarak çevrimiçi gerçekleştirilir.İşlem uzun süreli engelleme kilitler basılı tutun; Bu nedenle, onu olacak değil blok çalışan sorguları veya güncelleştirmeler.

Dizin yoğun parçalanmış olduğunda bir dizin yeniden düzenlemek.Öncekine bak tablo parçalanma yönergeleri için.Ancak, dizin yoğun parçalanmış, dizini yeniden oluşturuluyor tarafından daha iyi sonuçlar elde edecek.

Büyük nesne veri türü düzenleme

Bir veya daha fazla dizinler kümelenmiş dizinde bulunan büyük nesne veri türleri (LOB'lar) yeniden düzenleme veya arka plandaki yanı sıra temel alınan temel alınan tablo dizin yeniden düzenlenmesi, varsayılan olarak dursa.The data types image, text, ntext, varchar(max), nvarchar(max), varbinary(max), and xml are large object data types.Bu veri sıkıştırma daha iyi disk alanı kullanımını neden olabilir:

  • Belirtilen bir kümelenmiş dizini yeniden düzenleme içerdiği tüm lob sütunları sıkıştırmak yaprak düzey (veri satırları) kümelenmiş dizin.

  • kümelenmemiş dizin yeniden düzenleyerek, anahtarı olmayan (dahil) sütunlar dizin içindeki tüm lob sütunları düzenleyin.

  • Tüm belirtilirse, belirtilen tabloyu veya görünümü ile ilişkili tüm dizinler yeniden düzenlenmesi ve kümelenmiş dizin, temel alınan temel alınan tablo veya dahil sütunlarla kümelenmemiş dizin ile ilişkili tüm lob sütunları dursa.

  • LOB_COMPACTION yan tümce tümce tümce lob sütun varsa, yoksayılır.

Bir dizini yeniden oluşturuluyor

Bir dizini yeniden oluşturuluyor, dizine keser ve yeni bir tane oluşturur.Böylece, parçalanma kaldırılır, disk alanı belirtilen veya varolan doldurma faktörü ayarını kullanarak sayfaları sıkıştırarak iadesi ve dizin satırları (gerektiğinde yeni sayfalara ayırma) bitişik sayfaları katlandıklarında.Bu sayfa okuma istenen verileri elde etmek için gereken sayısını azaltarak disk performansını iyileştirebilir.

Kümelenmiş ve kümelenmemiş dizinleri yeniden oluşturmak için aşağıdaki yöntemleri kullanılabilir:

  • alter dizin yeniden oluşturma yan tümce tümce tümce ile birlikte.Bu deyim dbcc DBREINDEX deyimi değiştirir.

  • create INDEX DROP_EXISTING yan tümce tümce tümce ile birlikte.

Her yöntem ile aynı işlev görür, ancak vardır, avantajları ve dezavantajları aşağıdaki gösterildiği gibi göz önünde tablo.

İşlevsellik

ALTER DİZİN YENİDEN OLUŞTURMA

DROP_EXISTING İLE DİZİN OLUŞTURMA

Dizin tanımı ekleme veya kaldırma anahtar sütunları, sütun sırasını değiştirme veya sütun sıralama düzeni order.* değiştirme değiştirilebilir

Hayır

Evet **

Dizin seçeneklerini küme veya değiştirme.

Evet

Evet

Tek bir işlemde birden fazla dizin yeniden oluşturulması.

Evet

Hayır

Dizin türlerinin çoğu çevrimiçi çalışan sorguları veya güncelleştirmeleri engelleme olmadan yeniden.

Evet

Evet

Bölümlenmiş bir dizin bölümlendirilmesi.

Hayır

Evet

Dizin için başka bir dosya grubu taşınabilirler.

Hayır

Evet

Ek geçici disk alanı gereklidir.

Evet

Evet

Kümelenmiş dizin yeniden oluşturma ilişkili kümelenmemiş dizinleri yeniden oluşturur.

Hayır

Sürece tüm belirtilen anahtar sözcük.

Hayır

Dizin tanımı değiştirmediyse.

BİRİNCİL anahtar ve benzersiz kısıtlamaları zorlamayı dizinler bırakılıyor ve kısıtlamaları yeniden oluşturmayı yeniden oluşturulması.

Evet

Evet

Tek bir dizin bölümü yeniden oluşturulması.

Evet

Hayır

* a kümelenmemiş dizin kümelenmiş dizin tanımındaki belirterek kümelenmiş dizin türüne dönüştürülebilir.Bu işlem çevrimiçi seçeneği ile gerçekleştirilmelidir küme off için.Dönüştürme işlemi için kümelenmemiş kümelenmiş bağımsız olarak çevrimiçi ayarı desteklenmez.

** Varsa, aynı adı, sütun ve sıralama düzeni kullanarak dizin yeniden sıralama işlemi atlanabilir.Yeniden oluşturma işlemi, satır dizini oluşturulurken sıralandığını denetler.

İlk drop INDEX deyim dizin bırakarak ve ayrı bir create INDEX deyim ile yeniden oluşturmayı da bir dizin yeniden oluşturabilirsiniz.Bu işlemleri ayrı ifadeler olarak bazı olumsuz yanları vardır ve bu önerilmez.

İşlem sırasında disk alanından tasarruf etmek için devre dışı bırakma kümelenmemiş dizinleri yeniden oluşturmak

kümelenmemiş dizin devre dışı bırakıldığında dizin veri satırları silinir, ancak dizin tanımı meta veriler kalır.Dizini, yeniden etkinleştirilir.Yeniden oluşturma işlemi, kümelenmemiş dizin devre dışıyken, hem eski ve yeni dizini depolamak için yeterli geçici disk alanı gerektirir.Ancak, devre dışı bırakma ve ayrı işlemlerde kümelenmemiş dizin yeniden oluşturma, dizin devre dışı bırakarak kullanılabilir disk alanını izleyen yeniden oluşturma veya başka bir işlem tarafından yeniden kullanılabilir.Genellikle dizin boyutu yüzde 20'si olan sıralama, geçici disk alanı dışında hiçbir ek alan gereklidir.Kümelenmemiş dizin birincil anahtar ise, tüm etkin, başvuru yabancı anahtar kısıtlamalarını otomatik olarak devre dışı bırakılacak.Dizini yeniden oluşturulduktan sonra bu kısıtlamaları el ile etkinleştirilmesi gerekir.Daha fazla bilgi için bkz: Dizinler devre dışı bırakma ve Dizinler ve kısıtlamalar etkinleştirme yönergeleri.

Büyük dizinleri yeniden oluşturuluyor

Dizinleri 128 uzanımı ile iki ayrı bölüm halinde yeniden oluşturulur: mantıksal ve fiziksel.Mantıksal aşama, dizin tarafından kullanılan varolan ayırma birimleri kaldırma için işaretlenir, veri satırlarına kopyalanır ve sıralanmış ve sonra depoya oluşturulan yeni ayırma birimleri yeniden dizin taşındı.Fiziksel aşamasında ayırmayı kaldırma için önceden işaretlenmiş ayırma birimleri fiziksel olarak kısa arka planda gerçekleşir ve birçok kilitleri gerektiren hareketleri bırakılır.Daha fazla bilgi için bkz: Bırakarak ve büyük nesneler yeniden oluşturuluyor.

Dizin seçeneklerini ayarlama

Bir dizini yeniden düzenleme, dizin seçenekleri belirtilemez.Bununla birlikte, aşağıdaki dizin seçeneklerini olabilir küme zaman, yeniden dizin alter dizin yeniden oluşturma veya DROP_EXISTING ile dizin oluşturma kullanarak:

PAD_INDEX

DROP_EXISTING (yalnızca create INDEX)

FILLFACTOR

ÇEVRİMİÇİ

SORT_IN_TEMPDB

ALLOW_ROW_LOCKS

IGNORE_DUP_KEY

ALLOW_PAGE_LOCKS

STATISTICS_NORECOMPUTE

MAXDOP

Not

Sıralama işlemi gerekli değilse veya sıralama bellekte gerçekleştirilen kullanılabilir, SORT_IN_TEMPDB seçeneği gözardı edilir.

Ayrıca, küme yan tümce tümce tümce içinde alter INDEX deyim dizini yeniden oluşturuluyor olmadan aşağıdaki dizin seçeneklerini ayarlayabilirsiniz:

ALLOW_PAGE_LOCKS

IGNORE_DUP_KEY

ALLOW_ROW_LOCKS

STATISTICS_NORECOMPUTE

Daha fazla bilgi için bkz: Dizin seçeneklerini ayarlama.

Yeniden oluşturmak veya bir dizin yeniden düzenlemek için

alter INDEX (Transact-sql)

Bırakarak ve tek bir adımda bir dizin yeniden oluşturmayı bir dizini yeniden oluşturmak için

CREATE INDEX (Transact-SQL)

Örnekler

A.Bir dizini yeniden oluşturuluyor

Aşağıdaki örnek, tek bir dizin yeniden oluşturur.

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

B.Üzerinde tüm dizinler yeniden oluşturuluyor bir tablo ve seçenekleri belirtme

Aşağıdaki örnek anahtar sözcüğünü belirtir ALL.Bu tablo ile ilişkili tüm dizinler yeniden oluşturulur.Üç seçenek belirtilmedi.

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

C.Bir dizin ile lob düzenleme yeniden düzenleme

Aşağıdaki örnek, tek kümelenmiş dizin yeniden düzenler.yaprak düzey bir lob veri türü dizin içerdiğinden, deyim de büyük nesne verisi içeren tüm sayfaları sıkıştırır.Not ile belirtmek sahip değil (LOB_Compaction) varsayılan değer açık olduğu için seçenek.

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