Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Felügyelt Azure SQL-példány
A megadott tábla vagy nézet töredezettségmentesítési indexei.
Fontos
Ez a funkció az SQL Server egy későbbi verziójában lesz eltávolítva. Ne használja ezt a funkciót az új fejlesztési munkában, és tervezze meg a funkciót jelenleg használó alkalmazások módosítását. Ehelyett használja ALTER INDEX.
: SQL Server 2008 (10.0.x) és újabb verziók
Transact-SQL szintaxis konvenciói
Szintaxis
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 ]
Érvek
| database_namedatabase_id | 0
A töredezettségmentesség indexét tartalmazó adatbázis. Ha 0 van megadva, a rendszer az aktuális adatbázist használja. Az adatbázisneveknek meg kell felelniük azonosítókszabályainak.
table_name | table_id | view_name | view_id
A töredezettségmentesítéshez használt indexet tartalmazó táblázat vagy nézet. A tábla- és nézetneveknek meg kell felelniük az azonosítókra vonatkozó szabályoknak.
index_name | index_id
A töredezettségmentesítéshez használt index neve vagy azonosítója. Ha nincs megadva, az utasítás töredezettségmentesen töredezett a megadott tábla vagy nézet összes indexében. Az indexneveknek meg kell felelniük az azonosítókra vonatkozó szabályoknak.
partition_number | 0
A töredezettségmentesítéshez használt index partíciószáma. Ha nincs megadva, vagy ha 0 van megadva, az utasítás töredezettségmentesítést alkalmaz a megadott index összes partícióján.
A NO_INFOMSGS
Letiltja a 0 és 10 közötti súlyossági szintű információs üzeneteket.
Megjegyzések
DBCC INDEXDEFRAG töredezettségmentesítéssel az index levélszintje úgy, hogy a lapok fizikai sorrendje megegyezik a levélcsomópontok balról jobbra logikai sorrendjével, ezáltal javítva az indexvizsgálat teljesítményét.
Jegyzet
Ha DBCC INDEXDEFRAG fut, az index töredezettségmentesítése sorozatosan történik. Ez azt jelenti, hogy a művelet egyetlen indexen egyetlen szál használatával történik. Nincs párhuzamosság. Emellett az ugyanazon DBCC INDEXDEFRAG utasításból származó több indexen végzett műveletek egyszerre egy indexen lesznek végrehajtva.
DBCC INDEXDEFRAG az index lapjait is tömöríti, figyelembe véve az index létrehozásakor megadott kitöltési tényezőt. A tömörítés miatt létrehozott üres lapok törlődnek. További információ: Kitöltési tényező megadása index.
Ha egy index egynél több fájlra terjed ki, DBCC INDEXDEFRAG egyszerre egy fájlt töredezettségmentesít. A lapok nem migrálnak a fájlok között.
DBCC INDEXDEFRAG a becsült százalékos készültségi arányt öt percenként jelenti.
DBCC INDEXDEFRAG a folyamat bármely pontján leállítható, és a befejezett munka megmarad.
A DBCC DBREINDEXvagy általában az indexépítési művelettel ellentétben a DBCC INDEXDEFRAG egy online művelet. Nem tart hosszú távú zárakat. Ezért DBCC INDEXDEFRAG nem blokkolja a lekérdezések vagy frissítések futtatását. Mivel a töredezettségmentesítés ideje a töredezettség szintjéhez kapcsolódik, egy viszonylag töredezett index gyorsabban töredezett, mint egy új index felépíthető. A erősen töredezett indexek töredezettsége jelentősen tovább tarthat, mint az újraépítés.
A töredezettségmentesítés mindig teljes mértékben naplózva van, függetlenül az adatbázis-helyreállítási modell beállításától. További információ: ALTER DATABASE (Transact-SQL). Egy erősen töredezett index töredezettsége több naplót hozhat létre, mint egy teljesen naplózott index létrehozása. A töredezettségmentesítés azonban rövid tranzakciók sorozataként történik, így a nagy méretű naplók szükségtelenek, ha gyakran készít biztonsági másolatot a naplókról, vagy ha a helyreállítási modell beállítása EGYSZERŰ.
Korlátozások
DBCC INDEXDEFRAG sorba rendezi az index levéloldalait. Ezért ha egy index más lemezen lévő indexekkel van összekötve, akkor az indexen futó DBCC INDEXDEFRAG nem teszi egybe az index összes levéloldalát. A lapok fürtözésének javítása érdekében építse újra az indexet.
DBCC INDEXDEFRAG nem használható a következő indexek töredezettségmentesítésére:
- Letiltott index.
- Egy index, amelyen az oldalzárolás KI értékre van állítva.
- Térbeli index.
DBCC INDEXDEFRAG nem támogatott a rendszertáblákon való használathoz.
Eredményhalmazok
DBCC INDEXDEFRAG a következő eredményhalmazt adja vissza (az értékek eltérhetnek), ha az utasításban index van megadva (kivéve, ha WITH NO_INFOMSGS van megadva):
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.
Engedélyek
A hívónak rendelkeznie kell a táblával, vagy tagja kell lennie a sysadmin rögzített kiszolgálói szerepkörnek, a db_owner rögzített adatbázis-szerepkörnek vagy a db_ddladmin rögzített adatbázis-szerepkörnek.
Példák
Egy. Index töredezettségmentesítése a DBCC INDEXDEFRAG használatával
Az alábbi példa a PK_Product_ProductID-index összes partícióját töredezettségmentesen töredezi az Production.Product-adatbázis AdventureWorks2025 táblájában.
DBCC INDEXDEFRAG (AdventureWorks2022, 'Production.Product', PK_Product_ProductID);
GO
B. Adatbázis indexeinek töredezettségmentesítése a DBCC SHOWCONTIG és a DBCC INDEXDEFRAG használatával
Az alábbi példa egy egyszerű módszert mutat be egy adatbázis összes indexének töredezettségmentesítésére, amely egy deklarált küszöbérték felett töredezett.
/*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