Aracılığıyla paylaş


dbcc SHOWCONTIG (Transact-SQL)

Belirtilen tablo ya da görünümün dizinlerini ve veri parçalanma bilgilerini görüntüler.

Önemli notÖ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.

Konu bağlantısı simgesiTransact-SQL sözdizimi kuralları

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.

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

NotNot
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