Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Yönetilen Örneği
Belirlenen tablo veya görünümün verileri ve indeksleri için parçalanma bilgilerini gösterir.
Önemli
Bu özellik, SQL Server'ın gelecek bir sürümünde kaldırılacaktır. Bu özelliği yeni geliştirme çalışmalarında kullanmaktan kaçının ve şu anda bu özelliği kullanan uygulamaları değiştirmeyi planlayın. Bunun yerine sys.dm_db_index_physical_stats kullanın.
için geçerlidir: SQL Server 2008 (10.0.x) ve sonraki sürümler
Transact-SQL söz dizimi 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 ]
}
]
Arguments
table_name | table_id | view_name | view_id
Parçalanma bilgisini kontrol etmek için tablo veya görünüm. Belirtilmediyse, mevcut veritabanındaki tüm tablolar ve indekslenmiş görünümler kontrol edilir. Tablo veya görünüm kimliğini almak için OBJECT_ID fonksiyonunu kullanın.
index_name | index_id
Parçalanma bilgisini kontrol etmek için dizin. Belirtilmediyse, ifade belirtilen tablo veya görünüm için temel indeks işlerini işler. Indeks kimliğini elde etmek için sys.indexes katalog görünümünü kullanın.
WITH
DBCC ifadesi tarafından döndürülen bilgi türü için seçenekleri belirtir.
HIZLI
İndeksin hızlı taraması yapıp minimum bilgi çıkarıp çıkarılıp çıkarılmayacağını belirtir. Hızlı tarama, indeksin yaprak veya veri seviyesi sayfalarını okumaz.
ALL_INDEXES
Belirli bir indeks belirtilmiş olsa bile, belirtilen tablolar ve görünümler için tüm indekslerin sonuçlarını gösterir.
TABLERESULTS
Sonuçları ek bilgilerle birlikte bir sıra kümesi olarak gösterir.
ALL_LEVELS
Sadece geriye dönük uyumluluk için korunmuştur. Belirtilmiş olsa ALL_LEVELS bile, yalnızca indeks yaprağı seviyesi veya tablo veri seviyesi işlenir.
NO_INFOMSGS
Önem düzeyi 0 ile 10 arasında olan tüm bilgilendirme iletilerini gizler.
Sonuç kümeleri
Aşağıdaki tabloda sonuç kümesindeki bilgiler açıklanmaktadır.
| Istatistik | Description |
|---|---|
| Sayfalar Taranmış | Tablo veya indeksteki sayfa sayısı. |
| Kapsamlar Tarandı | Tablo veya indeksteki kapsam sayısı. |
| Kapsam Anahtarları | DBCC ibelesinin tablo veya indeks sayfaları arasında dolaştığı bir noktadan diğerine kaç kez hareket ettiği sayısı. |
| Ortalama Sayfa Sayı Kapsama Başına | Sayfa zincirinde bir kapsam başına sayfa sayısı. |
| Tarama Yoğunluğu [En İyi Sayı: Gerçek Sayı] | Bir yüzde. Bu, En İyi Sayım ile Gerçek Sayım oranıdır. Bu değer her şey bitişik ise 100'dür; Bu değer 100'den küçükse, biraz parçalanma vardır. En İyi Sayım , her şey bitişik olarak birbirine bağlı ise ideal ölçüde değişen miktardır. Gerçek Sayı , gerçek kapsam değişikliklerinin sayısıdır. |
| Mantıksal Tarama Parçalanması | Bir indeksin yaprak sayfalarını tarandıktan sonra dönen sırasız sayfaların yüzdesi. Bu sayı çok fazla kişi için önemli değil. Sırasız sayfa, indekse tahsis edilen bir sonraki fiziksel sayfanın, mevcut yaprak sayfasındaki sonrakisayfa e işaretiyle işaret edilen sayfa olmadığı bir sayfadır. |
| Kapsam Tarama Parçalanması | Bir indeksin yaprak sayfalarını taranırken sırasız kapsamların yüzdesi. Bu sayı çok fazla kişi için önemli değil. Sıradan çıkmış kapsam, bir indeksin mevcut sayfasını içeren kapsamın, bir indeksin önceki sayfasını içeren kapsamdan sonraki kapsam fiziksel olarak olmadığı bir kapsamdır. Not: Bu sayı, indeks birden fazla dosyayı kapsadığında anlamsızdır. |
| Sayfa başına ortalama bayt serbest | Taranan sayfalardaki ortalama boş bayt sayısı. Sayı ne kadar büyükse, sayfalar o kadar az dolu olur. Düşük sayılar daha iyidir, eğer indekste çok fazla rastgele ekleme yoksa. Bu sayı ayrıca sıra büyüklüğünden de etkilenir; Büyük bir sıra büyüklüğü daha fazla sayıda olmasına neden olabilir. |
| Ortalama sayfa yoğunluğu (tam) | Ortalama sayfa yoğunluğu, yüzde olarak. Bu değer satır boyutunu da dikkate alır. Bu nedenle, değer sayfalarınızın ne kadar dolu olduğunu daha doğru gösterir. Yüzde ne kadar büyükse, o kadar iyidir. |
table_id ve FAST belirtildiğinde, DBCC SHOWCONTIG yalnızca aşağıdaki sütunlardan oluşan bir sonuç kümesi döner:
- Sayfalar Taranmış
- Kapsam Anahtarları
- Tarama Yoğunluğu [En İyi Sayı:Gerçek Sayı]
- Kapsam Tarama Parçalanması
- Mantıksal Tarama Parçalanması
Belirtildiğinde TABLERESULTS , DBCC SHOWCONTIG aşağıdaki sütunları ve önceki tabloda tanımlanan dokuz sütunu döner.
| Istatistik | Description |
|---|---|
| Nesne Adı | İşlenen tablo veya görünüm adı. |
| Nesne Kimliği | Nesne adının kimliği. |
| IndexName | İşlenen indeksin adı. Bir yığın için NULL. |
| IndexId | Dizinin kimliği. 0 bir yığın için yok. |
| Level | Indeks seviyesi. Seviye 0, indeksin yaprak veya veri seviyesidir. Seviye bir yığın için 0. |
| Sayfalar | Indeksin veya tüm yığının o seviyesini oluşturan sayfa sayısı. |
| Satırlar | Indeksin o seviyesindeki veri veya indeks kayıtlarının sayısı. Bir yığın için, bu değer tüm yığındaki veri kayıtlarının sayısıdır. Bir yığın için, bu fonksiyondan döndürülen kayıt sayısı, yığına karşı a SELECT COUNT(*) çalıştırıldığında döndürülen satır sayısıyla eşleşmeyebilir. Bunun nedeni, bir satırın birden fazla kayıt içerebileceğidir. Örneğin, bazı güncelleme durumlarında tek bir yığın satırında bir ilete gönderme kaydı ve güncelleme işlemi sonucunda bir iletilen kayıt olabilir. Ayrıca, çoğu büyük LOB satırı LOB_DATA depolamada birden fazla kayda bölünür. |
| MinimumRecordSize | Indeksin veya tüm yığının o seviyesinde minimum kayıt büyüklüğü. |
| MaximumRecordSize | Indeks veya tüm yığının o seviyesinde maksimum kayıt büyüklüğü. |
| AverageRecordSize | Ortalama rekor büyüklüğü, indeks veya tüm yığının o seviyesinde. |
| ForwardedRecords | Indeksin veya tüm yığının o seviyesinde yönlendirilen kayıt sayısı. |
| Kapsam | Indeksin veya tüm yığının o seviyesindeki kapsam sayısı. |
| ExtentSwitches | DBCC ibelesinin tablo veya indeks sayfaları arasında dolaştığı bir noktadan diğerine kaç kez hareket ettiği sayısı. |
| AverageFreeBytes | Taranan sayfalardaki ortalama boş bayt sayısı. Sayı ne kadar büyükse, sayfalar o kadar az dolu olur. Düşük sayılar daha iyidir, eğer indekste çok fazla rastgele ekleme yoksa. Bu sayı ayrıca sıra büyüklüğünden de etkilenir; Büyük bir sıra büyüklüğü daha fazla sayıda olmasına neden olabilir. |
| OrtalaSayfa Yoğunluğu | Ortalama sayfa yoğunluğu, yüzde olarak. Bu değer satır boyutunu da dikkate alır. Bu nedenle, değer sayfalarınızın ne kadar dolu olduğunu daha doğru gösterir. Yüzde ne kadar büyükse, o kadar iyidir. |
| ScanDensity | Bir yüzde. Bu, BestCount ile ActualCount oranıdır. Bu değer her şey bitişik ise 100'dür; Bu değer 100'den küçükse, biraz parçalanma vardır. |
| BestCount | İdeal kapsam sayısı, her şey birbirine bitişik şekilde bağlanırsa değişir. |
| ActualCount | Gerçek kapsam sayısı değişir. |
| Mantıksal Parçalanma | Bir indeksin yaprak sayfalarını tarandıktan sonra dönen sırasız sayfaların yüzdesi. Bu sayı çok fazla kişi için önemli değil. Sıra dışı bir sayfa, dizine ayrılan sonraki fiziksel sayfanın geçerli yaprak sayfasındaki sonraki sayfa işaretçisi tarafından işaret edilen sayfa olmadığı bir sayfadır. |
| KapsamParçalanma | Bir indeksin yaprak sayfalarını taranırken sırasız kapsamların yüzdesi. Bu sayı çok fazla kişi için önemli değil. Sıradan çıkmış kapsam, bir indeksin mevcut sayfasını içeren kapsamın, bir indeksin önceki sayfasını içeren kapsamdan sonraki kapsam fiziksel olarak olmadığı bir kapsamdır. Not: Bu sayı, indeks birden fazla dosyayı kapsadığında anlamsızdır. |
WITH TABLERESULTS ve FAST belirtildiğinde, sonuç kümesi belirtildiğinde WITH TABLERESULTS olduğu ile aynıdır, ancak aşağıdaki sütunlarda null değerler olur:
| Rows | Kapsam |
|---|---|
| MinimumRecordSize | AverageFreeBytes |
| MaximumRecordSize | OrtalaSayfa Yoğunluğu |
| AverageRecordSize | KapsamParçalanma |
| ForwardedRecords |
Açıklamalar
Bu DBCC SHOWCONTIG ifade, index_id belirtildiğinde belirtilen indeksin yaprak seviyesinde sayfa zinciri boyunca ilerler. Sadece table_id belirtilirse veya index_id 0 ise, belirtilen tablonun veri sayfaları taranır. İşlem yalnızca niyetli paylaşımlı (IS) bir tablo kilidi gerektirir. Bu şekilde, özel (X) tablo kilidi gerektirenler hariç tüm güncellemeler ve eklemeler gerçekleştirilebilir. Bu, uygulama hızı ile eşzamanlılığın azalmaması ile geri dönen istatistiklerin sayısı arasında bir uzlaşma sağlar. Ancak, komut sadece parçalanmayı ölçmek için kullanılıyorsa, optimal performans için bu WITH FAST seçeneği kullanmanızı öneririz. Hızlı tarama, indeksin yaprak veya veri seviyesi sayfalarını okumaz. Bu WITH FAST seçenek bir yığın için geçerli değil.
Restrictions
DBCC SHOWCONTIG
ntext, metin ve görüntü veri türleriyle veri göstermiyor. Bunun nedeni, metin ve görüntü verisini depolayan metin indekslerinin artık var olmamasıdır.
Ayrıca DBCC SHOWCONTIG bazı yeni özellikleri desteklemiyor. Örneğin:
- Belirtilen tablo veya indeks bölümlendirilmişse,
DBCC SHOWCONTIGyalnızca belirtilen tablo veya indeksin ilk bölümü görüntülenir. -
DBCC SHOWCONTIGSıra taşma depolama bilgilerini ve nvarchar(max), varchar(max), varbinary(max) ve XML gibi yeni satır dışı veri türlerini göstermez. - Mekânsal indeksler desteklenmez
DBCC SHOWCONTIG.
Tüm yeni özellikler sys.dm_db_index_physical_stats (Transact-SQL) dinamik yönetim görünümü tarafından tamamen desteklenmektedir.
Tablo parçalanması
DBCC SHOWCONTIG tablonun ağır şekilde parçalanmış olup olmadığını belirler. Tablo parçalanması, tabloya karşı yapılan veri değişiklikleri (INSERT, UPDATE ve DELETE ifadeleri) yoluyla gerçekleşir. Bu değişiklikler genellikle tablonun satırları arasında eşit şekilde dağılmadığından, her sayfanın dolgunluğu zamanla değişebilir. Bir tablonun bir kısmını veya tamamını taran sorgularda, bu tür tablo parçalanması ek sayfa okumalarına neden olabilir. Bu, verilerin paralel taramasını engeller.
Bir indeks ağır şekilde parçalanmışsa, parçalanmayı azaltmak için aşağıdaki seçenekler mevcuttur:
Kümelenmiş bir indeks bırakın ve yeniden oluşturun.
Kümelenmiş bir indeksin yeniden oluşturulması, verileri yeniden düzenler ve veri sayfalarının dolu olmasına neden olur. Tamlık düzeyi,
FILLFACTORiçindekiCREATE INDEXseçeneği kullanılarak yapılandırılabilir. Bu yöntemin dezavantajları, düşürme veya yeniden oluşturma döngüsü sırasında indeksin çevrimdışı olması ve işlemin atomik olmasıdır. Eğer endeks oluşturma kesintiye girerse, indeks yeniden oluşturulmaz.İndeksin yaprak seviyesindeki sayfalarını mantıklı bir sırayla yeniden düzenleyin.
Indeksin yaprak seviyesindeki sayfalarını mantıklı bir sırayla yeniden sıralamak için kullanılır
ALTER INDEX...REORGANIZE. Bu işlem çevrimiçi bir işlem olduğundan, ibeleme çalışırken indeks kullanılabilir. İşlem ayrıca tamamlanmış iş kaybı olmadan kesintiye alınabilir. Bu yöntemin dezavantajı, veriyi yeniden düzenlemede kümelenmiş bir indeks düşürme veya yeniden oluşturma işlemi kadar iyi yapmamasıdır.İndeksin yeniden oluşturulması.
ALTER INDEXIndeksi yeniden oluşturmak için kullanınREBUILD. Daha fazla bilgi için bkz . ALTER INDEX (Transact-SQL).
Sonuç kümesindeki sayfa başına ortalama bayt serbest ve Ortalama sayfa yoğunluğu (tam) istatistiği indeks sayfalarının doluluğunu gösterir. Sayfa başına ortalama bayt serbest sayısı düşük olmalı ve Ortalama sayfa yoğunluğu (tam) sayısı yüksek olmalı, çünkü çok fazla rastgele ekleme yapılmayacak. Belirtilen seçenekle bir indeksin FILLFACTOR düşürülüp yeniden oluşturulması istatistikleri iyileştirebilir. Ayrıca, ALTER INDEX bir REORGANIZE indeks kısılır, onun değerini FILLFACTORdikkate alır ve istatistikleri iyileştirir.
Uyarı
Birçok rastgele ekleme ve çok dolu sayfa içeren bir indeks, sayfa bölünme sayısı artacaktır. Bu daha fazla parçalanma neden olur.
Bir indeksin parçalanma seviyesi aşağıdaki şekillerde belirlenebilir:
Kapsam Anahtarları ve Tarama Kapsamları değerlerini karşılaştırarak.
Kapsam Anahtarlarının değeri, Extents Scanned değerine mümkün olduğunca yakın olmalıdır. Bu oran, Tarama Yoğunluğu değeri olarak hesaplanır. Bu değer mümkün olduğunca yüksek olmalı ve indeks parçalanmasını azaltarak iyileştirilebilir.
Uyarı
Bu yöntem, indeks birden fazla dosyayı kapsa, çalışmaz.
Mantıksal tarama parçalanması ve kapsam taraması parçalanma değerlerini anlayarak
Mantıksal Tarama Parçalanması ve daha az ölçüde Kapsam Tarama Parçalanması değerleri, bir tablonun parçalanma seviyesinin en iyi göstergeleridir. Her iki değer de mümkün olduğunca sıfıra yakın olmalıdır, ancak 0'dan yüzde 10'a kadar bir değer kabul edilebilir.
Uyarı
Index birden fazla dosyayı kapsa, Extent Scan Fragmentation değeri yüksek olur. Bu değerleri azaltmak için indeks parçalanmasını azaltmalısınız.
Permissions
Kullanıcı tabloya sahip olmalı veya sistem yöneticisi sabit sunucu rolü, db_owner sabit veritabanı rolü veya db_ddladmin sabit veritabanı rolünün üyesi olmalıdır.
Örnekler
A. Bir tablo için parçalanma bilgisini gösterin
Aşağıdaki örnek, tablo için Employee parçalanma bilgilerini gösterir.
USE AdventureWorks2022;
GO
DBCC SHOWCONTIG ('HumanResources.Employee');
GO
B. Tablo ID'sini elde etmek için OBJECT_ID ve indeks kimliğini elde etmek için sys.indexes kullanın
Aşağıdaki örnek, veritabanındaki tablo indeksi için tablo kimliği ve indeks kimliğini AK_Product_NameProduction.Product elde etmek için katalog görünümünü kullanır OBJECT_IDsys.indexes.AdventureWorks2025
USE AdventureWorks2022;
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 tablo için kısaltılmış bir sonuç seti göster
Aşağıdaki örnek, AdventureWorks2025 veritabanındaki tablo için Product kısaltılmış bir sonuç seti döndürür.
USE AdventureWorks2022;
GO
DBCC SHOWCONTIG ('Production.Product', 1) WITH FAST;
GO
D. Veritabanındaki her tablodaki her indeks için tam sonuç setini göster
Aşağıdaki örnek, veritabanındaki AdventureWorks2025 her tablodaki her indeks için tam bir tablo sonuç seti döndürür.
USE AdventureWorks2022;
GO
DBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXES;
GO
E. DBCC SHOWCONTIG ve DBCC INDEXDEFRAG kullanarak bir veritabanındaki indeksleri parça ayrıştırmak için
Aşağıdaki örnek, ilan edilen eşik sınırının üzerinde parçalanmış bir veritabanındaki tüm indeksleri parçalandırmanın basit bir yolunu göstermektedir.
/*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