dbcc SHOWCONTIG (Transact-SQL)
Belirtilen tablo ya da görünümün dizinlerini ve veri parçalanma bilgilerini görüntüler.
Önemli |
---|
Bu özellik Microsoft SQL Server'ın bir sonraki sürümünde kaldırılacaktır. Yeni geliştirme işlerinde bu özelliği kullanmaktan kaçının ve bu özelliği kullanmakta olan uygulamalarda değişiklik yapmayı planlayın.Use sys.dm_db_index_physical_stats onun yerine. |
Sözdizimi
DBCC SHOWCONTIG
[ (
{ table_name | table_id | view_name | view_id }
[ , index_name | index_id ]
) ]
[ WITH
{
[ , [ ALL_INDEXES ] ]
[ , [ TABLERESULTS ] ]
[ , [ FAST ] ]
[ , [ ALL_LEVELS ] ]
[ NO_INFOMSGS ]
}
]
Bağımsız değişkenler
table_name | table_id | view_name | view_id
tablo veya görünüm için parçalanma bilgilerini denetlemek için değil.Belirtilmezse, tüm tabloları ve geçerli veritabanında dizin oluşturulmuş görünümler denetlenir.tablo almak veya Kimliğini görüntülemek için kullanın OBJECT_IDişlev.index_name | index_id
Parçalanma bütünleştirmek için dizinidir.Belirtilmezse, belirtilen tablo ya da görünüm için temel dizin deyim işler.Dizin kimliği almak için kullanmak sys.indexes Katalog görünümü.İLE
dbcc deyimtarafından döndürülen bilgi türü seçeneklerini belirtir.HIZLI
Dizin ve çıkış bilgiler hızlı bir tarama gerçekleştirmek etkinleştirilip etkinleştirilmeyeceğini belirtir.Hızlı tarama, dizin yaprak ya da veri düzey sayfalarının okumuyor.ALL_INDEXES
Belirli bir dizin belirtilmiş olsa bile, tüm dizinler için belirtilen tablolar ve görünümler, sonuçlar görüntüler.TABLERESULTS
Bir satır kümesi, ek bilgilerle sonuçlar görüntüler.ALL_LEVELS
Yalnızca geriye dönük uyumluluk için korunur.all_levels belirtilmiş olsa bile, yalnızca dizin yaprak düzey veya tablo veri düzey işlenir.NO_INFOMSGS
Önem düzeyleri 0 ile 10 arasında bilgi tüm iletileri bastırır.
Sonuç Kümeleri
Aşağıdaki tablo sonuç kümesibilgileri açıklar.
İstatistik |
Açıklama |
---|---|
Taranan sayfalar |
Sayfa tablo veya dizin sayısı. |
Taranan uzanımı |
Kapsam bir tablo veya dizin sayısı. |
Uzantı anahtarlar |
Sayısı deyim tablo veya dizin sayfaları çapraz geçiş yaparken dbcc deyim bir kapsam diğerine taşınabilir. |
Ort.Kapsam başına sayfalar |
sayfa zincirindeki kapsam başına sayfa sayısı. |
Yoğunluk tarama [en iyi sayısı: Gerçek sayı] |
Bir yüzdedir.Oranı ise En iyi sayısı için Gerçek sayım.Her şeyi bitişik ise bu değer 100'dür; Bu değer 100'den küçük ise, bazı parçalanma bulunmaktadır. Sayı için en iyi her şeyi bitişik bağlantılıysa ideal kapsam değişiklikleri sayısıdır.Gerçek sayım gerçek kapsam değişiklikleri sayısıdır. |
Mantıksal tarama parçalanması |
Döndürülen dizin yaprak sayfaları tarama sırası sayfa yüzdesi.Bu numara, yığınlar için geçerli değildir.Sıra dışı sayfa sayfa , dizine ayrılan sonraki fiziksel sayfa olmadığı için tarafından İleri pag ulaşılan sayfa olane işaretçisi geçerli yaprak sayfa. |
Uzantı tarama parçalanması |
Dizin yaprak sayfaları tarama sırası kapsamlarını yüzdesi.Bu numara, yığınlar için geçerli değildir.Sıra dışı kapsam , bir dizin için geçerli sayfa içeren kapsam fiziksel olarak İleri kapsam bir dizin için önceki sayfa içeren kapsam sonra olmadığı biridir.
Not
Dizin birden fazla yayılmıştır olduğunda bu anlamsız bir sayıdır.
|
Ort.Sayfa başına bayt boş |
Ortalama taranan sayfalar üzerindeki boş bayt sayısı.Büyük sayı, daha az tam sayfalarıdır.Düşük numaraların dizini birçok rasgele ekler olmayacaksa daha iyi.Bu sayı da satır boyutu tarafından etkilenir; büyük satır boyutu daha büyük bir sayı neden olabilir. |
Ort.Sayfa yoğunluğu (tam) |
Yüzde olarak ortalama sayfa yoğunluk.Bu değer, hesap satır boyutunu alır.Bu nedenle, sayfalarınızı nasıl tam olduğunun daha doğru bir göstergesi değerdir.Büyük yüzdesi, daha iyi. |
Zaman table_id ve hızlı belirtilirse, dbcc SHOWCONTIG döndüren bir sonuç kümesi ile aşağıdaki sütunları yalnızca.
Taranan sayfalar
Uzantı anahtarlar
Yoğunluk tarama [en iyi sayısı: gerçek sayı]
Uzantı tarama parçalanması
Mantıksal tarama parçalanması
tableresults belirtildiğinde dbcc SHOWCONTIG aşağıdaki sütunlar ve ayrıca önceki tabloaçıklanan dokuz sütunlar döndürür.
İstatistik |
Açıklama |
---|---|
Nesne adı |
tablo ya da Görünüm işlenen adıdır. |
ObjectID |
Nesne adı kimliği. |
DizinAdı |
İşlenen dizin adı.Olan bir öbek için null. |
IndexId |
Dizin kimliği.Bir yığın 0'dır. |
Level |
Dizin düzeyi.0 yaprakveya veri, dizin düzey düzeyidir. Bir yığın 0 düzeydir. |
Sayfaları |
Bu düzey dizin veya tüm yığın oluşturan sayfa sayısı. |
Satırları |
Veri veya dizin kayıt aynı dizin düzey sayısı.Bir yığın, bu değer tüm yığın veri kayıt sayısıdır. Bir yığın, bu işlev döndürdüğü kayıt sayısını karşı yığını seçin count(*) çalıştırarak döndürülen satırların sayısını eşleşmeyebilir.Bir satır birden çok kayıt içeriyor olabilir olmasıdır.Örneğin, altında bazı durumlarda güncelleştirme, bir yığın tek satır iletme kayıt ve güncelleştirme işlemi sonucunda iletilen kayıt olabilir.Ayrıca, çoğu büyük lob satırlar birden çok kayıtta lob_data depolama bölünür. |
MinimumRecordSize |
Bu düzey dizin veya tüm yığın boyutu en az bir kayıt. |
MaximumRecordSize |
Bu düzey dizin veya tüm yığın boyutu en fazla kayıt. |
AverageRecordSize |
Bu dizin veya tüm yığın düzey ortalama kayıt boyutu. |
ForwardedRecords |
Bu dizin veya tüm yığın düzey iletilen kayıt sayısı. |
Kapsam |
O dizin veya tüm yığın düzey kapsamlarını sayısı. |
ExtentSwitches |
Sayısı deyim tablo veya dizin sayfaları çapraz geçiş yaparken dbcc deyim bir kapsam diğerine taşınabilir. |
AverageFreeBytes |
Ortalama taranan sayfalar üzerindeki boş bayt sayısı.Büyük sayı, daha az tam sayfalarıdır.Düşük numaraların dizini birçok rasgele ekler olmayacaksa daha iyi.Bu sayı da satır boyutu tarafından etkilenir; büyük satır boyutu daha büyük bir sayı neden olabilir. |
AveragePageDensity |
Yüzde olarak ortalama sayfa yoğunluk.Bu değer, hesap satır boyutunu alır.Bu nedenle, sayfalarınızı nasıl tam olduğunun daha doğru bir göstergesi değerdir.Büyük yüzdesi, daha iyi. |
ScanDensity |
Bir yüzdedir.Oranı ise BestCount için ActualCount.Her şeyi bitişik ise bu değer 100'dür; Bu değer 100'den küçük ise, bazı parçalanma bulunmaktadır. |
BestCount |
Her şeyi bitişik bağlantılıysa ideal kapsam değişiklikleri sayısıdır. |
ActualCount |
Gerçek kapsam değişiklikleri sayısıdır. |
LogicalFragmentation |
Döndürülen dizin yaprak sayfaları tarama sırası sayfa yüzdesi.Bu numara, yığınlar için geçerli değildir.Sıra dışı sayfa sayfa , dizine ayrılan sonraki fiziksel sayfa olmadığı için tarafından İleri pag ulaşılan sayfa olane işaretçisi geçerli yaprak sayfa. |
ExtentFragmentation |
Dizin yaprak sayfaları tarama sırası kapsamlarını yüzdesi.Bu numara, yığınlar için geçerli değildir.Sıra dışı kapsam , bir dizin için geçerli sayfa içeren kapsam fiziksel olarak İleri kapsam bir dizin için önceki sayfa içeren kapsam sonra olmadığı biridir.
Not
Dizin birden fazla yayılmıştır olduğunda bu anlamsız bir sayıdır.
|
İLE tableresults ve fast belirtildiğinde, aşağıdaki sütunları null değerler hariç sonuç kümesi ile tableresults ne zaman belirtilen aynıdır:
Satırları |
Kapsam |
MinimumRecordSize |
AverageFreeBytes |
MaximumRecordSize |
AveragePageDensity |
AverageRecordSize |
ExtentFragmentation |
ForwardedRecords |
|
Açıklamalar
dbcc SHOWCONTIG deyim yaprakdüzey belirtilen sayfa zincir erişir ne zaman dizin index_id belirtilir. Yalnızca table_id belirtilen veya index_id 0 olduğundan, belirtilen tablo veri sayfaları taranır.İşlem yalnızca bir paylaşılan amacını (Is) tablo kilitgerektiriyor.Bu şekilde tüm güncelleştirmeleri ve ekler, bir özel (x) tablo kilitgerektirenler hariç gerçekleştirilebilir.Bu yürütme hızını ve hiçbir azaltma minizle eşzamanlılık karşı verilen istatistik sayısı içinde sağlar.Ancak, komut yalnızca parçalanma ölçmek için kullanılıyorsa, en iyi performans için ile hızlı seçeneğini kullanmanızı öneririz.Hızlı tarama, dizin yaprak ya da veri düzey sayfalarının okumuyor.Bir yığın ile Hızlı seçeneği geçerli değildir.
Parçalanma hesaplama algoritması daha kesin olarak SQL Server 2008 ve daha üstü sürümlerde SQL Server 2000.Sonuç olarak, parçalanma değerleri daha yüksek görünür.Örneğin, SQL Server 2000, tablo sayfa 11 ve sayfa 13'te aynı kapsam ancak değil sayfa 12 varsa parçalanmış sayılmaz.Parçalanma sayılan bu şekilde ancak bu iki sayfalarına erişmek için fiziksel iki g/Ç işlemlerini gerektiren SQL Server 2008.
Kısıtlamalar
dbcc SHOWCONTIG verilerle görüntülemiyor ntext, text, ve image veri türü.Bu, çünkü metin dizinleri (dizin kimliği 255 SQL Server 2000) metin ve resim veri deposu artık yok.Dizin kimliği 255 hakkında daha fazla bilgi için bkz: sys.sysindexes (Transact-SQL).
Ayrıca, dbcc SHOWCONTIG bazı yeni özellikleri desteklemez.Örneğin:
Belirtilen tablo ya da dizin bölümlenmiş, dbcc SHOWCONTIG yalnızca belirtilen tablo ya da dizin ilk bölümünü görüntüler.
dbcc SHOWCONTIG görüntülemiyor satır taşma depolama bilgileri ve diğer yeni satır kapalı veri türleri gibi nvarchar(max), varchar(max), varbinary(max), ve xml.
Kayma dizinler dbcc SHOWCONTIG tarafından desteklenmez.
Tüm yeni özelliklerini tam olarak tarafından desteklenen sys.dm_db_index_physical_stats (Transact-SQL) dinamik yönetim görünümü.
Tablo parçalanması
dbcc SHOWCONTIG tablo yoğun parçalanmış olup olmadığını belirler.' % S'tabloya tablokarşı yapılan veri değişiklikleri (INSERT, update ve delete deyimlerini) sürecinde tablo parçalanma oluşur.Bu değişiklikler genellikle eşit tablosatırları arasında dağıtılır değil çünkü her sayfa tamlık saatiçinde değişebilir.Kısmını veya tamamını tablotarama sorguları gibi tablo parçalanma ek sayfa okuma neden olabilir.Bu paralel veri tarama yavaşlattığını.
Dizin yoğun parçalanmış olduğunda aşağıdaki seçenekleri parçalanma azaltmak için kullanılabilir:
Bırakın ve kümelenmiş dizinyeniden oluşturun.
kümelenmiş dizin yeniden oluşturma, verileri yeniden düzenler ve tam veri sayfaları neden olur.Tamlık düzey create INDEX FILLFACTOR seçeneği kullanılarak yapılandırılabilir.Bu yöntem dezavantajları şunlardır: dizin bırakma sırasında çevrimdışı olduğunda veya döngüsü yeniden ve işlem atomikolduğunu.Dizin oluşturma yarıda kesilirse, dizini yeniden değil.
yaprak-düzey sayfalar dizinin mantıksal sırada yeniden sıralayın.
alter INDEX… kullanınyaprak- dizinin mantıksal sıradadüzey sayfaları yeniden sıralamak için yeniden düzenleyin.Bu işlemi çevrimiçi bir işlem olduğundan, dizin deyim çalışırken kullanılabilir.İşlemi tamamlanan iş kaybı olmadan interruptible.Bu yöntem olumsuzluk yöntem değil kümelenmiş dizin bırakma olarak verileri yeniden düzenleyerek, iyi bir iş yapmak işlemi yeniden kullanmasıdır.
Dizini yeniden oluşturmak.
alter dizin yeniden oluşturma dizini yeniden oluşturmak için kullanın.Daha fazla bilgi için, bkz. alter INDEX (Transact-SQL).
Ort. Bayt boş sayfabaşına ve Ort. Yoğunluk (tam) sayfa istatistik sonuç kümesi dizin sayfalarının tamlık gösteriyor.Ort. Bayt boş sayfabaşına numarası düşük olmalı ve Ort. Yoğunluk (tam) sayfa numarası çok sayıda rasgele ekler olmayacak bir dizin için yüksek olmalıdır.Bırakarak ve FILLFACTOR taşıyan bir dizin yeniden oluşturma seçeneği belirtilen istatistikleri artırabilir.Ayrıca, alter INDEX ile yeniden düzenle dizin, kendi FILLFACTOR hesaba katarak compact ve istatistikleri artıracaktır.
Not
Rasgele sayıda olan dizin ekler ve çok dolu sayfalar sayfa ayırmaya sayısındaki artışla olacak.Bu, daha fazla parçalanma neden olur.
Dizin parçalanma düzey aşağıdaki şekillerde belirlenebilir:
Değerleri karşılaştırarak Ölçüde anahtarları ve Kapsamlarını taranan.
Değeri Ölçüde anahtarları olarak mümkün olduğu kadar yakın olması gerektiğini Kapsamlarını taranan.Bu oranı hesaplanır Tarama yoğunluğu değer.Bu değer, mümkün olduğu kadar yüksek olmalıdır ve dizin parçalanmasının azaltarak geliştirilebilir.
Not
Birden çok dosya dizini yayılıyorsa, bu yöntem çalışmaz.
Anlama tarafından Tarama mantıksal parçalanma ve Ölçüde tarama parçalanma değerler.
Tarama mantıksal parçalanma ve daha az kapsamde, Ölçüde tarama parçalanma değerler tabloparçalanma düzey en iyi göstergesi.0 İle yüzde 10 arasında bir değer kabul edilebilir olabilir, ancak her ikisi de bu değerleri sıfıra yakın gibi olabildiğince olmalıdır.
Not
Ölçüde tarama parçalanma değeri birden çok dosya dizini yayılıyorsa yüksek olacaktır.Bu değerler azaltmak için dizin parçalanmasının azaltmalısınız.
İzinler
Kullanıcı tablosahibi veya gerekir üye olmanız sysadmin sabit sunucu rolü, db_owner veritabanı rolü, sabit veya db_ddladmin veritabanı rolüsabit.
Örnekler
A.Bir tabloparçalanma bilgilerini görüntüleme
Aşağıdaki örnek parçalanma bilgilerini görüntüler Employee tablo.
USE AdventureWorks2008R2;
GO
DBCC SHOWCONTIG ("HumanResources.Employee");
GO
B.tablo kimliği ve sys.indexes dizin kimliği edinmek için elde etmek için OBJECT_ID kullanma
Aşağıdaki örnek OBJECT_ID ve sys.indexes katalog Görünüm tablo kimliği edinip kimliği dizin AK_Product_Name dizini Production.Product tablo AdventureWorks2008R2 veritabanı.
USE AdventureWorks2008R2;
GO
DECLARE @id int, @indid int
SET @id = OBJECT_ID('Production.Product')
SELECT @indid = index_id
FROM sys.indexes
WHERE object_id = @id
AND name = 'AK_Product_Name'
DBCC SHOWCONTIG (@id, @indid);
GO
C.Bir kısaltılmış sonuç kümesi için tablogörüntüleme
Bir kısaltılmış sonuç kümesi için aşağıdaki örnek verir Product tablo AdventureWorks2008R2 veritabanı.
USE AdventureWorks2008R2;
GO
DBCC SHOWCONTIG ("Production.Product", 1) WITH FAST;
GO
D.Bir veritabanındaki her tablo tam sonuç kümesi her dizin için görüntüleme
The following example returns a full table result set for every index on every table in the AdventureWorks2008R2 database.
USE AdventureWorks2008R2;
GO
DBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXES;
GO
E.Bir veritabanı dizinleri birleştirmek için dbcc SHOWCONTIG ve INDEXDEFRAG dbcc kullanma
Aşağıdaki örnek, bildirilen eşik parçalanmış bir veritabanındaki tüm dizinleri birleştirmek için basit bir yol gösterir.
/*Perform a 'USE <database name>' to select the database in which to run the script.*/
-- Declare variables
SET NOCOUNT ON;
DECLARE @tablename varchar(255);
DECLARE @execstr varchar(400);
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @frag decimal;
DECLARE @maxfrag decimal;
-- Decide on the maximum fragmentation to allow for.
SELECT @maxfrag = 30.0;
-- Declare a cursor.
DECLARE tables CURSOR FOR
SELECT TABLE_SCHEMA + '.' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE';
-- Create the table.
CREATE TABLE #fraglist (
ObjectName char(255),
ObjectId int,
IndexName char(255),
IndexId int,
Lvl int,
CountPages int,
CountRows int,
MinRecSize int,
MaxRecSize int,
AvgRecSize int,
ForRecCount int,
Extents int,
ExtentSwitches int,
AvgFreeBytes int,
AvgPageDensity int,
ScanDensity decimal,
BestCount int,
ActualCount int,
LogicalFrag decimal,
ExtentFrag decimal);
-- Open the cursor.
OPEN tables;
-- Loop through all the tables in the database.
FETCH NEXT
FROM tables
INTO @tablename;
WHILE @@FETCH_STATUS = 0
BEGIN
-- Do the showcontig of all indexes of the table
INSERT INTO #fraglist
EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')
WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS');
FETCH NEXT
FROM tables
INTO @tablename;
END;
-- Close and deallocate the cursor.
CLOSE tables;
DEALLOCATE tables;
-- Declare the cursor for the list of indexes to be defragged.
DECLARE indexes CURSOR FOR
SELECT ObjectName, ObjectId, IndexId, LogicalFrag
FROM #fraglist
WHERE LogicalFrag >= @maxfrag
AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0;
-- Open the cursor.
OPEN indexes;
-- Loop through the indexes.
FETCH NEXT
FROM indexes
INTO @tablename, @objectid, @indexid, @frag;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',
' + RTRIM(@indexid) + ') - fragmentation currently '
+ RTRIM(CONVERT(varchar(15),@frag)) + '%';
SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',
' + RTRIM(@indexid) + ')';
EXEC (@execstr);
FETCH NEXT
FROM indexes
INTO @tablename, @objectid, @indexid, @frag;
END;
-- Close and deallocate the cursor.
CLOSE indexes;
DEALLOCATE indexes;
-- Delete the temporary table.
DROP TABLE #fraglist;
GO