DBCC SHOWCONTIG (Transact-SQL)

Wyświetla informacje o Fragmentacja danych i indeksów tabela lub widoku.

Ważna informacjaWażne:

Ta funkcja zostanie usunięta z następnej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja.Użycie sys.dm_db_index_physical_stats w zamian.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

DBCC SHOWCONTIG 
[ ( 
    { table_name | table_id | view_name | view_id } 
    [ , index_name | index_id ] 
) ] 
    [ WITH 
        { 
         [ , [ ALL_INDEXES ] ] 
         [ , [ TABLERESULTS ] ] 
         [ , [ FAST ] ]
         [ , [ ALL_LEVELS ] ] 
         [ NO_INFOMSGS ]
         }
    ]

Argumenty

  • table_name | table_id | view_name | view_id
    Jest tabela lub widok, aby sprawdzić, czy informacje fragmentacji.Jeśli nie określono sprawdza wszystkie tabele i widoki indeksowane w bieżącej bazie danych.Aby uzyskać tabela lub wyświetlić identyfikator, za pomocą OBJECT_ID funkcja.

  • index_name | index_id
    Jest indeksem, aby sprawdzić, czy informacje fragmentacji.Jeśli nie określono instrukcja przetwarza podstawowego indeksu dla określonej tabela lub widoku.Aby uzyskać identyfikator indeksu, należy użyć sys.indexes katalogu widoku.

  • Z
    Określa opcje dotyczące typu informacji zwracanych przez DBCC instrukcja.

  • SZYBKIE
    Określa, czy szybkie skanowanie indeksu i produkcji niezbędnych informacji.Szybkie skanowanie nie odczytuje strony poziom liść lub dane indeksu.

  • ALL_INDEXES
    Wyświetla wyniki dla wszystkich indeksów dla określonych tabel i widoków, nawet jeśli określono określonego indeksu.

  • TABLERESULTS
    Wyświetla wyniki w postaci zestawu zestaw wierszy, z dodatkowymi informacjami.

  • ALL_LEVELS
    Utrzymać zgodność z poprzednimi wersjami.Nawet jeśli określono ALL_LEVELS liśćwskaźnikapoziom lub tabela danych poziom jest przetwarzany.

  • NO_INFOMSGS
    Pomija wszystkie komunikaty informacyjne, których poziomy ważności od 0 do 10.

Zestawy wyników

W poniższej tabela opisano informacje w zestaw wyników.

Statystyka

Opis

Stron zeskanowanych

Liczba stron w tabela lub indeksu.

Zakresy skanowania

Liczba zakresów w tabela lub indeksu.

Przełączniki zakres

Ile razy DBCC instrukcja przeniesione z jednego fragment na inny podczas instrukcja przechodni strony tabela lub indeksu.

ŚredniaStron na zakresie

Liczba stron na fragment w łańcuchu strona .

Skanowanie gęstość [Licznik najlepsze: Rzeczywista liczba]

Jest w procentach.Jest to stosunek Liczba najlepszych do Faktyczna.Wartość ta wynosi 100, jeśli wszystko jest ciągłym; Jeśli ta wartość jest mniejsza niż 100, istnieje kilka fragmentacji.

Najlepsze licznik jest idealnie nadaje się numer zmiany fragment , jeśli wszystko jest ciągły obszar połączony.Faktyczna jest rzeczywista liczba zmian fragment .

Logiczne fragmentacji skanowania

Procent zwrócił skanowania stron liść indeks stron poza kolejnością.Numer ten nie jest istotne dla stert.Poza kolejność strona jest strona , dla których następnej fizycznej strona przydzielonych do indeksu nie jest strona wskazywana przez pag daleje wskaźnik liśćbieżącejstrona.

Stopnia fragmentacji skanowania

Procent poza kolejnością zakresów w skanowaniu stron liść indeksu.Numer ten nie jest istotne dla stert.Poza kolejnością fragment jest dla którego fragment zawiera bieżącą strona indeksu nie jest fizycznie następnego fragment po fragment zawiera poprzedniej strona indeksu.

UwagaUwaga:
Numer ten jest bez znaczenia, gdy indeksu obejmującego wiele plików.

ŚredniaLiczba bajtów wolnego miejsca na stronie

Średnia liczba bajtów wolnych na stronach zeskanowanych.Im większa liczba, mniej pełnej strony są.Niższe numery są lepsze, jeżeli indeks nie będzie miał wiele losowe wstawiane.Liczba ta dotyczy również rozmiar wiersza; Rozmiar dużego wiersza może spowodować większą liczbę.

ŚredniaGęstość stronę (pełna)

Średnia gęstość strona jako procent.Wartość ta uwzględnia rozmiar wiersza konta.W związku z tym wartość jest bardziej dokładne wskazanie są jak pełne strony.Im większy procent, tym lepiej.

Gdy table_id i szybkie są określone, DBCC SHOWCONTIG zwraca zestaw wyników tylko następujące kolumny.

  • Stron zeskanowanych

  • Przełączniki zakres

  • Skanowanie gęstość [Licznik najlepsze: faktyczna]

  • Stopnia fragmentacji skanowania

  • Logiczne fragmentacji skanowania

Po określeniu TABLERESULTS DBCC SHOWCONTIG zwraca następujące kolumny i także kolumny dziewięciu opisane w poprzedniej tabela.

Statystyka

Opis

Nazwa obiektu

Nazwa tabela lub widoku przetworzone.

Identyfikator obiektu

Identyfikator nazwy obiektu.

Nazwa_indeksu

Nazwa indeksu przetwarzane.Jest wartość NULL dla sterty.

IndexId

Identyfikator indeksu.Jest równy 0 dla sterty.

Level

Poziom indeksu.Poziom 0 jest liśćlub dane, poziom indeksu.

Poziom jest 0 sterty.

Strony

Liczba stron, wchodzące w skład poziom indeksu lub całe sterty.

Wiersze

Liczba rekordów danych lub indeksu na poziom indeksu.Stosu jest liczba rekordów danych w całej sterty.

Sterty liczby rekordów zwracanych z tej funkcja mogą nie odpowiadać liczbę wierszy zwracanych przez uruchomienie COUNT(*) wybierz przeciwko sterty.Jest tak, ponieważ wiersz może zawierać wiele rekordów.Na przykład w niektórych aktualizacji sytuacje, wiersz jednego stosu może mieć rekord przesyłania dalej i przesyłanych dalej rekordu w wyniku operacji aktualizacji.Ponadto większość duże wiersze LOB są podzielone na wiele rekordów w magazynie LOB_DATA.

MinimumRecordSize

Rozmiar rekordu minimalny poziom indeksu lub całe sterty.

MaximumRecordSize

Maksymalna wielkość rekordu w poziom indeksu lub całe sterty.

AverageRecordSize

Średni rozmiar rekordu w poziom indeksu lub całe sterty.

ForwardedRecords

Liczba rekordów przekazane w poziom indeksu lub całe sterty.

Zakresy

Liczba zakresów poziom indeksu lub całe sterty.

ExtentSwitches

Ile razy DBCC instrukcja przeniesione z jednego fragment na inny podczas instrukcja przechodni strony tabela lub indeksu.

AverageFreeBytes

Średnia liczba bajtów wolnych na stronach zeskanowanych.Im większa liczba, mniej pełnej strony są.Niższe numery są lepsze, jeżeli indeks nie będzie miał wiele losowe wstawiane.Liczba ta dotyczy również rozmiar wiersza; Rozmiar dużego wiersza może spowodować większą liczbę.

AveragePageDensity

Średnia gęstość strona jako procent.Wartość ta uwzględnia rozmiar wiersza konta.W związku z tym wartość jest bardziej dokładne wskazanie są jak pełne strony.Im większy procent, tym lepiej.

ScanDensity

Jest w procentach.Jest to stosunek BestCount do ActualCount.Wartość ta wynosi 100, jeśli wszystko jest ciągłym; Jeśli ta wartość jest mniejsza niż 100, istnieje kilka fragmentacji.

BestCount

Jest idealnie nadaje się numer zmiany fragment , jeśli wszystko jest ciągły obszar połączony.

ActualCount

Jest rzeczywista liczba zmian fragment .

LogicalFragmentation

Procent zwrócił skanowania stron liść indeks stron poza kolejnością.Numer ten nie jest istotne dla stert.Poza kolejność strona jest strona , dla których następnej fizycznej strona przydzielonych do indeksu nie jest strona wskazywana przez pag daleje wskaźnik liśćbieżącejstrona.

ExtentFragmentation

Procent poza kolejnością zakresów w skanowaniu stron liść indeksu.Numer ten nie jest istotne dla stert.Poza kolejnością fragment jest dla którego fragment zawiera bieżącą strona indeksu nie jest fizycznie następnego fragment po fragment zawiera poprzedniej strona indeksu.

UwagaUwaga:
Numer ten jest bez znaczenia, gdy indeksu obejmującego wiele plików.

Po określeniu Z TABLERESULTS i szybko zestaw wyników jest taki sam jak gdy określono Z TABLERESULTS, z wyjątkiem następujących kolumn będą mieć wartości null :

Wiersze

Zakresy

MinimumRecordSize

AverageFreeBytes

MaximumRecordSize

AveragePageDensity

AverageRecordSize

ExtentFragmentation

ForwardedRecords

 

Uwagi

DBCC SHOWCONTIG instrukcja przechodzi łańcucha strona na liść poziom określonego indeksu podczas index_id określono.Jeśli tylko table_id została określona lub jeśli index_id jest równa 0, strony danych określonej tabela zostaną zeskanowane.Operacja wymaga tylko udostępnione intencji (IS) tabela blokada.Ten sposób wszystkie aktualizacje i wstawienia można przeprowadzić, z wyjątkiem tych, które wymagają wyłącznego tabela blokadaX).Umożliwia to zależnościami między szybkość realizacji i brak redukcji w współbieżność przeciwko liczba zwracanych danych statystycznych.Jeśli polecenie jest używane tylko po to, aby ocenić fragmentacji, firma Microsoft zaleca jednak użyć opcji z szybkiego dla zapewnienia optymalnej wydajności.Szybkie skanowanie nie odczytuje strony poziom liść lub dane indeksu.Opcja Z FAST nie dotyczą sterty.

Algorytm obliczania rozdrobnienia jest bardziej precyzyjne w SQL Server 2008 i w nowszych wersjach niż w SQL Server 2000.W wyniku fragmentacji wyświetlane wartości będą wyższe.Na przykład w SQL Server 2000, tabela nie jest uważany za fragmentacji, jeśli ma ona strona 11 i strona 13 w takim samym fragment , ale nie strona 12.Jednak dostęp do tych dwóch stron wymaga dwóch fizycznych operacji We/Wy, co to jest liczony jako fragmentacji w SQL Server 2008.

Ograniczenia

DBCC SHOWCONTIG nie są wyświetlane dane z ntext, text, i image typów danych.Wynika to z indeksów tekstu (indeks Identyfikatora 255 w SQL Server 2000) magazynu danych tekstowych i graficznych nie jest już istnieje.Aby uzyskać więcej informacji na temat indeksu Identyfikatora 255, zobacz sys.sysindexes (Transact-SQL).

DBCC SHOWCONTIG nie obsługuje także niektóre nowe funkcje.Na przykład:

  • Jeśli określona tabela lub indeks jest podzielony na partycje, DBCC SHOWCONTIG wyświetla tylko pierwszą partycją określonej tabela lub indeksu.

  • DBCC SHOWCONTIG nie jest wyświetlany wiersz przepełnienie magazynu informacji i inne nowe typy danych poza wiersz, takich jak nvarchar(max), varchar(max), varbinary(max), i xml.

  • Przestrzennej indeksy nie są obsługiwane przez DBCC SHOWCONTIG.

Wszystkie nowe funkcje są w pełni obsługiwane przez sys.dm_db_index_physical_stats (języka Transact-SQL) dynamiczny widok zarządzania.

Fragmentacji tabeli

DBCC SHOWCONTIG Określa, czy tabela jest pofragmentowana silnie.Fragmentacji tabeli odbywa się przez proces modyfikacji danych (instrukcje INSERT, UPDATE i DELETE) przeciwko tabela.Ponieważ te modyfikacje nie są zwykle rozpowszechniane jednakowo między wiersze tabela, stopnia ukończenia każdej strona może się zmieniać w czas.W przypadku kwerend, które skanowanie części lub całości tabelatakie fragmentacji tabela może spowodować odczyty dodatkowe strona .Przeszkadza, równoległe skanowania danych.

Gdy indeks jest dużym stopniu pofragmentowane, dostępne dla zmniejszenia fragmentacji są następujące opcje:

  • Usuwanie i ponowne utworzenie indeks klastrowany.

    Ponowne tworzenie indeks klastrowany Reorganizuje dane i powoduje, że strony pełnych danych.poziom stopnia ukończenia można skonfigurować za pomocą opcji FILLFACTOR tworzenia indeksu.Niedogodności tej metoda są, że indeks jest w trybie offline podczas upuszczania lub ponownie utworzyć cykl, a operacja jest niepodzielny.Jeśli do tworzenia indeksu jest przerwana, nie jest utworzony indeks.

  • Zmienianie kolejności liść-poziom stron indeksu w logicznej kolejności.

    Użyj ALTER INDEX…REORGANIZOWAĆ, aby zmienić kolejność liść-poziom stron indeksu w logicznej kolejności.Ponieważ ta operacja jest operacją online, indeks jest dostępny, gdy działa instrukcja .Operacja jest również zmiennego bez utraty Praca wykonana.Wadą tej metoda jest metoda nie wykonać tak dobrze, zadanie reorganizacji danych jako upuszczania indeks klastrowany lub odtworzyć operacji.

  • Odbudowanie indeksu.

    Należy zmienić indeks z ODBUDUJ odbudowanie indeksu.Aby uzyskać więcej informacji, zobacz Zmiana INDEKSU (Transact-SQL).

Licznika Śr. Liczba bajtów wolnego miejsca na strona i licznika Śr. Strona gęstości (pełna) Statystyka w zestaw wyników wskazują stopnia ukończenia stron indeksowych.Licznika Śr. Liczba bajtów wolnego miejsca na strona numer powinien być niski i licznika Śr. Strona gęstości (pełna) liczba powinna być wysoka indeksu nie będzie miał wiele losowe wstawiane.Usunięcie i ponowne tworzenie indeksu z FILLFACTOR opcji określonej można poprawić statystyki.Również zmianę INDEKSU z REORGANIZACJA będzie compact indeksu, biorąc pod uwagę jego FILLFACTOR i poprawi dane statystyczne.

Ostrzeżenie

Wstawia indeks, który ma wiele losowych i bardzo pełne strony będą miały zwiększonej liczby podziałów strona .Powoduje to więcej fragmentacji.

Fragmentacja poziom indeksu określa się w następujący sposób:

  • Porównując wartości Przełączniki stopniu i Skanowane zakresy.

    Wartość Przełączniki stopniu powinien być możliwie jak najbardziej zbliżone do tej Skanowane zakresy.Stosunek ten oblicza się jako Scan gęstości wartości.Wartość ta powinna być możliwie najwyższa i może być zwiększona przez zmniejszenie fragmentacji indeksu.

    Ostrzeżenie

    Ta metoda nie działa, jeśli indeksu obejmującego wiele plików.

  • Zrozumienie Logiczne fragmentacji skanowania i Stopnia fragmentacji skanowania wartości.

    Logiczne fragmentacji skanowania i w mniejszym fragment Stopnia fragmentacji skanowania wartości są najważniejsze wskaźniki fragmentacji poziom tabela.Wartości te powinny być jak najbliżej zero, jak to możliwe, chociaż wartość od 0 do 10 procent mogą być dopuszczalne.

    Ostrzeżenie

    Stopnia fragmentacji skanowania wartość będzie wysoka, jeżeli indeks obejmuje wiele plików.Zmniejszenie tych wartości, należy zmniejszyć fragmentacji indeksu.

Uprawnienia

Użytkownik musi własnej tabelalub element członkowski sysadmin stała rola serwera db_owner stałej rola bazy danychlub db_ddladmin stałej rola bazy danych.

Przykłady

A.Wyświetlanie informacji o fragmentacji tabela

Poniższy przykład przedstawia informacje fragmentacji dla Employee tabela.

USE AdventureWorks2008R2;
GO
DBCC SHOWCONTIG ("HumanResources.Employee");
GO

B.Aby uzyskać identyfikator tabela i sys.indexes, aby uzyskać identyfikator indeksu za pomocą OBJECT_ID

W poniższym przykładzie użyto OBJECT_ID i sys.indexes Widok, aby uzyskać identyfikator tabela i indeks Identyfikatora dla katalogu AK_Product_Name indeks Production.Product tabela w AdventureWorks2008R2 bazy danych.

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.Wyświetlanie skróconych zestaw wyników dla tabela

Poniższy przykład zwraca skróconą zestaw wyników dla Product tabela w AdventureWorks2008R2 bazy danych.

USE AdventureWorks2008R2;
GO
DBCC SHOWCONTIG ("Production.Product", 1) WITH FAST;
GO

D.Wyświetlanie pełnej zestaw wyników dla każdego indeksu w każdej tabela w bazie danych

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.Za pomocą DBCC SHOWCONTIG i DBCC INDEXDEFRAG defragmentować indeksów w bazie danych

W poniższym przykładzie pokazano prosty sposób defragmentowania wszystkie indeksy w bazie danych, która jest pofragmentowany powyżej progu zadeklarowanej.

/*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