Aracılığıyla paylaş


DBCC INDEXDEFRAG (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL Yönetilen Örneği

Belirtilen tablo veya görünümün dizinlerini birleştirir.

Ö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 ALTER INDEX 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 INDEXDEFRAG
(
    { database_name | database_id | 0 }
    , { table_name | table_id | view_name | view_id }
    [ , { index_name | index_id } [ , { partition_number | 0 } ] ]
)
    [ WITH NO_INFOMSGS ]

Bağımsız değişken

| database_namedatabase_id | 0

Birleştirilmesi gereken dizini içeren veritabanı. 0 belirtilirse geçerli veritabanı kullanılır. Veritabanı adları tanımlayıcılarının kurallarına uymalıdır.

table_name | table_id | view_name | view_id

Birleştirilmesi gereken dizini içeren tablo veya görünüm. Tablo ve görünüm adları, tanımlayıcıların kurallarına uymalıdır.

index_name | index_id

Birleştirecek dizinin adı veya kimliği. Belirtilmezse, deyimi belirtilen tablo veya görünümün tüm dizinlerini birler. Dizin adları, tanımlayıcıların kurallarına uymalıdır.

partition_number | 0

Birleştirecek dizinin bölüm numarası. Belirtilmezse veya 0 belirtilirse, deyimi belirtilen dizindeki tüm bölümleri birler.

BİLGİ_MSJSIZ

Önem düzeyi 0 ile 10 arasında olan tüm bilgilendirme iletilerini gizler.

Açıklamalar

DBCC INDEXDEFRAG, sayfaların fiziksel sırasının yaprak düğümlerin soldan sağa mantıksal sırasıyla eşleşmesi için dizinin yaprak düzeyini birleştirerek dizin tarama performansını artırır.

Not

DBCC INDEXDEFRAG çalıştırıldığında, dizin birleştirme seri olarak gerçekleşir. Başka bir deyişle, tek bir dizindeki işlem tek bir iş parçacığı kullanılarak gerçekleştirilir. Paralellik gerçekleşmez. Ayrıca, aynı DBCC INDEXDEFRAG deyiminden birden çok dizindeki işlemler aynı anda bir dizinde gerçekleştirilir.

DBCC INDEXDEFRAG, dizin oluşturulurken belirtilen dolgu faktörünü dikkate alarak bir dizinin sayfalarını da sıkıştırabilir. Bu sıkıştırma nedeniyle oluşturulan tüm boş sayfalar kaldırılır. Daha fazla bilgi için bkz. Diziniçin Dolgu Faktörü Belirtme.

Dizin birden fazla dosyaya yayıyorsa, DBCC INDEXDEFRAG bir kerede bir dosyayı bir arada oluşturur. Sayfalar dosyalar arasında geçirilmez.

DBCC INDEXDEFRAG, tahmini yüzdenin beş dakikada bir tamamlandığını bildirir. DBCC INDEXDEFRAG işlemin herhangi bir noktasında durdurulabilir ve tamamlanan tüm çalışmalar korunur.

DBCC DBREINDEXveya dizin oluşturma işleminin genel olarak aksine, DBCC INDEXDEFRAG çevrimiçi bir işlemdir. Kilitleri uzun vadeli tutmaz. Bu nedenle, DBCC INDEXDEFRAG çalışan sorguları veya güncelleştirmeleri engellemez. Birleştirme süresi parçalanma düzeyiyle ilgili olduğundan, yeni bir dizin oluşturulabileceğinden görece yapılandırılmamış bir dizin daha hızlı birleştirilebilir. Yoğun şekilde parçalanmış bir dizinin birleştirilmiş olması yeniden derlemekten çok daha uzun sürebilir.

Veritabanı kurtarma modeli ayarı ne olursa olsun birleştirme her zaman tam olarak günlüğe kaydedilir. Daha fazla bilgi için bkz. ALTER DATABASE (Transact-SQL) . Yoğun şekilde parçalanmış bir dizinin birleştirilmiş olması, tam olarak günlüğe kaydedilen dizin oluşturma işleminden daha fazla günlük oluşturabilir. Ancak, birleştirme bir dizi kısa işlem olarak gerçekleştirilir, bu nedenle günlük yedeklemeleri sık sık alınırsa veya kurtarma modeli ayarı SIMPLE ise büyük bir günlük gereksizdir.

Kısıtlama -ları

DBCC INDEXDEFRAG dizin yaprak sayfalarını yerinde karıştırıyor. Bu nedenle, bir dizin diskteki diğer dizinlerle kesişirse, bu dizinde DBCC INDEXDEFRAG çalıştırmak dizindeki tüm yaprak sayfaları bitişik yapmaz. Sayfaların kümelemini geliştirmek için dizini yeniden derleyin.

DBCC INDEXDEFRAG aşağıdaki dizinleri birleştirmek için kullanılamaz:

  • Devre dışı bırakılmış bir dizin.
  • Sayfa kilitleme özelliği KAPALI olarak ayarlanmış bir dizin.
  • Uzamsal dizin.

DBCC INDEXDEFRAG, sistem tablolarında kullanılmak üzere desteklenmez.

Sonuç kümeleri

DBCC INDEXDEFRAG deyiminde bir dizin belirtilirse (WITH NO_INFOMSGS belirtilmediği sürece) aşağıdaki sonuç kümesini döndürür (değerler değişebilir):

Pages Scanned Pages Moved Pages Removed
------------- ----------- -------------
359           346         8
  
(1 row(s) affected)
  
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

İzinler

Çağıranın tabloya sahip olması veya sysadmin sabit sunucu rolünün, db_owner sabit veritabanı rolünün veya db_ddladmin sabit veritabanı rolünün üyesi olması gerekir.

Örnekler

A. Dizini birleştirmek için DBCC INDEXDEFRAG kullanma

Aşağıdaki örnek, PK_Product_ProductID veritabanındaki Production.Product tablosundaki AdventureWorks2025 dizininin tüm bölümlerini birleştirilir.

DBCC INDEXDEFRAG (AdventureWorks2022, 'Production.Product', PK_Product_ProductID);
GO

B. Veritabanındaki dizinleri birleştirmek için DBCC SHOWCONTIG ve DBCC INDEXDEFRAG kullanma

Aşağıdaki örnek, bir veritabanındaki bildirilen eşiğin üzerinde parçalanmış tüm dizinleri birleştirmenin basit bir yolunu 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

Ayrıca bkz.