sys.dm_db_index_physical_stats (Transact-SQL)sys.dm_db_index_physical_stats (Transact-SQL)

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)jaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Gibt Größen- und Fragmentierungsinformationen für die Daten und Indizes der angegebenen Tabelle oder Sicht in SQL ServerSQL Server zurück.Returns size and fragmentation information for the data and indexes of the specified table or view in SQL ServerSQL Server. Bei einem Index wird eine Zeile für jede B-Strukturebene in den einzelnen Partitionen zurückgegeben.For an index, one row is returned for each level of the B-tree in each partition. Bei einem Heap wird eine Zeile für die IN_ROW_DATA-Zuordnungseinheit jeder Partition zurückgegeben.For a heap, one row is returned for the IN_ROW_DATA allocation unit of each partition. Bei LOB-Daten (Large Object) wird eine Zeile für die LOB_DATA-Zuordnungseinheit jeder Partition zurückgegeben.For large object (LOB) data, one row is returned for the LOB_DATA allocation unit of each partition. Falls Zeilenüberlaufdaten in der Tabelle vorhanden sind, wird eine Zeile für die ROW_OVERFLOW_DATA-Zuordnungseinheit in jeder Partition zurückgegeben.If row-overflow data exists in the table, one row is returned for the ROW_OVERFLOW_DATA allocation unit in each partition. Gibt keine Informationen zu speicheroptimierten xVelocity-ColumnStore-Indizes zurück.Does not return information about xVelocity memory optimized columnstore indexes.

Wichtig

Wenn Sie Abfragen Sys. dm_db_index_physical_stats auf einer Serverinstanz, die Always On hostet lesbares sekundäres Replikat, ein REDO-Blockierungsproblem auftreten.If you query sys.dm_db_index_physical_stats on a server instance that is hosting an Always On readable secondary replica, you might encounter a REDO blocking issue. Dies kommt daher, dass diese dynamische Verwaltungssicht eine beabsichtigte gemeinsame Sperre für die angegebene Benutzertabelle oder Sicht erhält, die Anforderungen von einem REDO-Thread für eine X-Sperre dieser Benutzertabelle oder Sicht blockieren kann.This is because this dynamic management view acquires an IS lock on the specified user table or view that can block requests by a REDO thread for an X lock on that user table or view.

Sys. dm_db_index_physical_stats gibt keine Informationen zu speicheroptimierten Indizes zurück.sys.dm_db_index_physical_stats does not return information about memory-optimized indexes. Informationen zur Verwendung von speicheroptimierten Indizes finden Sie unter dm_db_xtp_index_stats (Transact-SQL).For information about memory-optimized index use, see sys.dm_db_xtp_index_stats (Transact-SQL).

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax


sys.dm_db_index_physical_stats (   
    { database_id | NULL | 0 | DEFAULT }  
  , { object_id | NULL | 0 | DEFAULT }  
  , { index_id | NULL | 0 | -1 | DEFAULT }  
  , { partition_number | NULL | 0 | DEFAULT }  
  , { mode | NULL | DEFAULT }  
)  

ArgumenteArguments

Database_id | NULL | 0 | STANDARDWERTdatabase_id | NULL | 0 | DEFAULT
Ist die ID der Datenbank.Is the ID of the database. Database_id ist "smallint".database_id is smallint. Gültige Eingaben sind die ID einer Datenbank, NULL, 0 oder DEFAULT.Valid inputs are the ID number of a database, NULL, 0, or DEFAULT. Die Standardeinstellung ist 0.The default is 0. NULL, 0 und DEFAULT sind in diesem Kontext gleichwertig.NULL, 0, and DEFAULT are equivalent values in this context.

Geben Sie NULL an, wenn Informationen zu allen Datenbanken in der Instanz von SQL ServerSQL Server zurückgegeben werden sollen.Specify NULL to return information for all databases in the instance of SQL ServerSQL Server. Bei Angabe von NULL für Database_id, müssen Sie auch angeben, NULL für Object_id, Index_id, und Partition_number.If you specify NULL for database_id, you must also specify NULL for object_id, index_id, and partition_number.

Die integrierte Funktion DB_ID kann angegeben werden.The built-in function DB_ID can be specified. Wenn DB_ID verwendet wird, ohne dass ein Datenbankname angegeben wird, muss der Kompatibilitätsgrad der aktuellen Datenbank 90 oder höher sein.When using DB_ID without specifying a database name, the compatibility level of the current database must be 90 or greater.

Object_id | NULL | 0 | STANDARDWERTobject_id | NULL | 0 | DEFAULT
Die Objekt-ID der Tabelle oder Sicht mit dem Index.Is the object ID of the table or view the index is on. object_id ist int.object_id is int.

Gültige Eingaben sind die ID einer Tabelle und Sicht, NULL, 0 oder DEFAULT.Valid inputs are the ID number of a table and view, NULL, 0, or DEFAULT. Die Standardeinstellung ist 0.The default is 0. NULL, 0 und DEFAULT sind in diesem Kontext gleichwertig.NULL, 0, and DEFAULT are equivalent values in this context. Als der SQL Server 2016 (13.x)SQL Server 2016 (13.x), gültige Eingaben auch der Name der Service Broker-Warteschlange oder der Name der Warteschlange interne Tabelle enthalten.As of SQL Server 2016 (13.x)SQL Server 2016 (13.x), valid inputs also include the service broker queue name or the queue internal table name. Wenn der Standardparameter angewendet werden (d. h. alle Objekte, alle Indizes usw.), Fragmentierungsinformationen für alle Warteschlangen im Resultset enthalten sind.When default parameters are applied (i.e. all objects, all indexes, etc), fragmentation information for all queues are included in the result set.

Geben Sie NULL an, wenn Informationen zu allen Tabellen und Sichten in der angegebenen Datenbank zurückgegeben werden sollen.Specify NULL to return information for all tables and views in the specified database. Bei Angabe von NULL für Object_id, müssen Sie auch angeben, NULL für Index_id und Partition_number.If you specify NULL for object_id, you must also specify NULL for index_id and partition_number.

Index_id | 0 | NULL | -1 | STANDARDWERTindex_id | 0 | NULL | -1 | DEFAULT
Die ID des Indexes.Is the ID of the index. Index_id ist Int. Gültige Eingaben sind die ID-Nummer eines Indexes, 0, wenn Object_id ist ein Heap ist, NULL,-1 oder DEFAULT.index_id is int. Valid inputs are the ID number of an index, 0 if object_id is a heap, NULL, -1, or DEFAULT. Der Standardwert ist-1.The default is -1. NULL,-1 und DEFAULT sind in diesem Kontext gleichwertig.NULL, -1, and DEFAULT are equivalent values in this context.

Geben Sie NULL an, um Informationen zu allen Indizes für eine Basistabelle oder Sicht zurückgegeben.Specify NULL to return information for all indexes for a base table or view. Bei Angabe von NULL für Index_id, müssen Sie auch angeben, NULL für Partition_number.If you specify NULL for index_id, you must also specify NULL for partition_number.

Partitionsnummer | NULL | 0 | STANDARDWERTpartition_number | NULL | 0 | DEFAULT
Die Partitionsnummer im Objekt.Is the partition number in the object. Partitionsnummer ist Int. Gültige Eingaben sind die Partion_number eines Indexes oder Heaps, NULL, 0 oder DEFAULT.partition_number is int. Valid inputs are the partion_number of an index or heap, NULL, 0, or DEFAULT. Die Standardeinstellung ist 0.The default is 0. NULL, 0 und DEFAULT sind in diesem Kontext gleichwertig.NULL, 0, and DEFAULT are equivalent values in this context.

Geben Sie NULL an, um Informationen für alle Partitionen des besitzenden Objekts zurückgegeben.Specify NULL to return information for all partitions of the owning object.

Partitionsnummer ist 1-basiert.partition_number is 1-based. Ein nicht partitionierter Index oder Heap ist Partition_number auf 1 festgelegt.A nonpartitioned index or heap has partition_number set to 1.

Modus | NULL | STANDARDWERTmode | NULL | DEFAULT
Der Name des Modus.Is the name of the mode. Modus gibt die Scanebene an, die verwendet wird, um Statistiken zu erhalten.mode specifies the scan level that is used to obtain statistics. Modus ist Sysname.mode is sysname. Gültige Eingaben sind DEFAULT, NULL, LIMITED, SAMPLED oder DETAILED.Valid inputs are DEFAULT, NULL, LIMITED, SAMPLED, or DETAILED. Der Standardwert (NULL) ist LIMITED.The default (NULL) is LIMITED.

Zurückgegebene TabelleTable Returned

SpaltennameColumn name DatentypData type DescriptionDescription
database_iddatabase_id smallintsmallint Datenbank-ID der Tabelle oder Sicht.Database ID of the table or view.
object_idobject_id intint Objekt-ID der Tabelle oder Sicht mit dem Index.Object ID of the table or view that the index is on.
index_idindex_id intint Index-ID eines Indexes.Index ID of an index.

0 = Heap.0 = Heap.
partition_numberpartition_number intint 1-basierte Partitionsnummer im besitzenden Objekt; eine Tabelle, eine Sicht oder ein Index.1-based partition number within the owning object; a table, view, or index.

1 = Nicht partitionierter Index oder Heap.1 = Nonpartitioned index or heap.
index_type_descindex_type_desc nvarchar(60)nvarchar(60) Beschreibung des Indextyps:Description of the index type:

HEAPHEAP

CLUSTERED INDEXCLUSTERED INDEX

NONCLUSTERED INDEXNONCLUSTERED INDEX

PRIMARY XML INDEXPRIMARY XML INDEX

SPATIAL INDEXSPATIAL INDEX

XML INDEXXML INDEX

Columnstore-ZUORDNUNG INDEX (intern)COLUMNSTORE MAPPING INDEX (internal)

Columnstore-DELETEBUFFER INDEX (intern)COLUMNSTORE DELETEBUFFER INDEX (internal)

Columnstore-DELETEBITMAP INDEX (intern)COLUMNSTORE DELETEBITMAP INDEX (internal)
hobt_idhobt_id bigintbigint Heap- oder B-Struktur-ID des Indexes oder der Partition.Heap or B-Tree ID of the index or partition.

Neben der Rückgabe die Hobt_id benutzerdefinierte Indizes, gibt auch die Hobt_id der internen columnstore-Indizes zurück.Besides returning the hobt_id of user-defined indexes, this also returns the hobt_id of the internal columnstore indexes.
alloc_unit_type_descalloc_unit_type_desc nvarchar(60)nvarchar(60) Beschreibung des Typs der Zuordnungseinheit:Description of the allocation unit type:

IN_ROW_DATAIN_ROW_DATA

LOB_DATALOB_DATA

ROW_OVERFLOW_DATAROW_OVERFLOW_DATA

Die LOB_DATA-Zuordnungseinheit enthält die Daten, die in Spalten vom Datentyp gespeichert sind Text, Ntext, Image, varchar(max), nvarchar(max), varbinary(max), und Xml.The LOB_DATA allocation unit contains the data that is stored in columns of type text, ntext, image, varchar(max), nvarchar(max), varbinary(max), and xml. Weitere Informationen finden Sie unter Datentypen (Transact-SQL).For more information, see Data Types (Transact-SQL).

Die ROW_OVERFLOW_DATA-Zuordnungseinheit enthält die Daten, die in Spalten vom Datentyp gespeichert sind varchar, nvarchar (n), varbinary, und Sql_ Variante , die ein Push ausgeführt wurde außerhalb von Zeilen.The ROW_OVERFLOW_DATA allocation unit contains the data that is stored in columns of type varchar(n), nvarchar(n), varbinary(n), and sql_variant that have been pushed off-row.
index_depthindex_depth tinyinttinyint Anzahl von Indexebenen.Number of index levels.

1 = Heap oder LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheit.1 = Heap, or LOB_DATA or ROW_OVERFLOW_DATA allocation unit.
index_levelindex_level tinyinttinyint Aktuelle Ebene des Indexes.Current level of the index.

0 für Indexblattebene, Heaps und LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheiten.0 for index leaf levels, heaps, and LOB_DATA or ROW_OVERFLOW_DATA allocation units.

Werte größer 0 für Nicht-Indexblattebenen.Greater than 0 for nonleaf index levels. Index_level werden auf der Stammebene eines Indexes den höchsten Wert.index_level will be the highest at the root level of an index.

Die nichtblattebenen von Indizes werden nur verarbeitet, wenn Modus = DETAILED.The nonleaf levels of indexes are only processed when mode = DETAILED.
avg_fragmentation_in_percentavg_fragmentation_in_percent floatfloat Die logische Fragmentierung für Indizes oder die Blockfragmentierung für Heaps in der IN_ROW_DATA-Zuordnungseinheit.Logical fragmentation for indexes, or extent fragmentation for heaps in the IN_ROW_DATA allocation unit.

Der Wert wird als Prozentsatz gemessen und berücksichtigt mehrere Dateien.The value is measured as a percentage and takes into account multiple files. Definitionen für die logische Fragmentierung und die Blockfragmentierung finden Sie unter den Hinweisen.For definitions of logical and extent fragmentation, see Remarks.

0 für LOB_DATA- und ROW_OVERFLOW_DATA-Zuordnungseinheiten.0 for LOB_DATA and ROW_OVERFLOW_DATA allocation units.

NULL für heaps, wenn Modus = SAMPLED.NULL for heaps when mode = SAMPLED.
fragment_countfragment_count bigintbigint Anzahl von Fragmenten auf der Blattebene einer IN_ROW_DATA-Zuordnungseinheit.Number of fragments in the leaf level of an IN_ROW_DATA allocation unit. Weitere Informationen zu Fragmenten finden Sie unter den Hinweisen.For more information about fragments, see Remarks.

NULL für Nichtblattebenen eines Indexes und LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheiten.NULL for nonleaf levels of an index, and LOB_DATA or ROW_OVERFLOW_DATA allocation units.

NULL für heaps, wenn Modus = SAMPLED.NULL for heaps when mode = SAMPLED.
avg_fragment_size_in_pagesavg_fragment_size_in_pages floatfloat Durchschnittliche Anzahl von Seiten in einem Fragment auf der Blattebene einer IN_ROW_DATA-Zuordnungseinheit.Average number of pages in one fragment in the leaf level of an IN_ROW_DATA allocation unit.

NULL für Nichtblattebenen eines Indexes und LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheiten.NULL for nonleaf levels of an index, and LOB_DATA or ROW_OVERFLOW_DATA allocation units.

NULL für heaps, wenn Modus = SAMPLED.NULL for heaps when mode = SAMPLED.
page_countpage_count bigintbigint Gesamtanzahl von Index- oder Datenseiten.Total number of index or data pages.

Bei einem Index die Gesamtanzahl von Indexseiten auf der aktuellen B-Strukturebene in der IN_ROW_DATA-Zuordnungseinheit.For an index, the total number of index pages in the current level of the b-tree in the IN_ROW_DATA allocation unit.

Bei einem Heap auf die Gesamtanzahl von Datenseiten in der IN_ROW_DATA-Zuordnungseinheit.For a heap, the total number of data pages in the IN_ROW_DATA allocation unit.

Bei LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheiten auf die Gesamtanzahl von Seiten in der Zuordnungseinheit.For LOB_DATA or ROW_OVERFLOW_DATA allocation units, total number of pages in the allocation unit.
avg_page_space_used_in_percentavg_page_space_used_in_percent floatfloat Durchschnittlicher Prozentsatz des auf allen Seiten verwendeten verfügbaren Datenspeicherplatzes.Average percentage of available data storage space used in all pages.

Bei einem Index bezieht sich der Durchschnittswert auf die aktuelle B-Strukturebene in der IN_ROW_DATA-Zuordnungseinheit.For an index, average applies to the current level of the b-tree in the IN_ROW_DATA allocation unit.

Bei einem Heap auf den Durchschnittswert aller Datenseiten in der IN_ROW_DATA-Zuordnungseinheit.For a heap, the average of all data pages in the IN_ROW_DATA allocation unit.

Bei LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheiten auf den Durchschnittswert aller Seiten in der Zuordnungseinheit.For LOB_DATA or ROW_OVERFLOW DATA allocation units, the average of all pages in the allocation unit.

NULL zurück, wenn Modus = LIMITED.NULL when mode = LIMITED.
record_countrecord_count bigintbigint Gesamtanzahl von Datensätzen.Total number of records.

Bei einem Index bezieht sich die Gesamtanzahl von Datensätzen auf die aktuelle B-Strukturebene in der IN_ROW_DATA-Zuordnungseinheit.For an index, total number of records applies to the current level of the b-tree in the IN_ROW_DATA allocation unit.

Bei einem Heap auf die Gesamtanzahl von Datensätzen in der IN_ROW_DATA-Zuordnungseinheit.For a heap, the total number of records in the IN_ROW_DATA allocation unit.

Hinweis: für einen Heap möglicherweise die Anzahl der Datensätze, die von dieser Funktion zurückgegeben werden. die Anzahl der Zeilen, die zurückgegeben werden, durch Ausführen von Wählen Sie die Anzahl nicht überein (*) für den Heap.Note: For a heap, the number of records returned from this function might not match the number of rows that are returned by running a SELECT COUNT(*) against the heap. Das liegt daran, dass eine Zeile möglicherweise mehrere Datensätze enthält.This is because a row may contain multiple records. So kann in bestimmten Updatesituationen eine einzelne Heapzeile möglicherweise über einen Weiterleitungsdatensatz und einen weitergeleiteten Datensatz als Ergebnis des Updates verfügen.For example, under some update situations, a single heap row may have a forwarding record and a forwarded record as a result of the update operation. Außerdem werden die meisten großen LOB-Zeilen im LOB_DATA-Speicher in mehrere Datensätze geteilt.Also, most large LOB rows are split into multiple records in LOB_DATA storage.

Bei LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheiten auf die Gesamtanzahl von Datensätzen in der gesamten Zuordnungseinheit.For LOB_DATA or ROW_OVERFLOW_DATA allocation units, the total number of records in the complete allocation unit.

NULL zurück, wenn Modus = LIMITED.NULL when mode = LIMITED.
ghost_record_countghost_record_count bigintbigint Anzahl von inaktiven Datensätzen, die durch den Cleanuptask für inaktive Datensätze in der Zuordnungseinheit entfernt werden können.Number of ghost records ready for removal by the ghost cleanup task in the allocation unit.

0 für Nichtblattebenen eines Indexes in der IN_ROW_DATA-Zuordnungseinheit.0 for nonleaf levels of an index in the IN_ROW_DATA allocation unit.

NULL zurück, wenn Modus = LIMITED.NULL when mode = LIMITED.
version_ghost_record_countversion_ghost_record_count bigintbigint Anzahl inaktiver Datensätze, die von einer ausstehenden Momentaufnahme-Isolationstransaktion in einer Zuordnungseinheit beibehalten werden.Number of ghost records retained by an outstanding snapshot isolation transaction in an allocation unit.

0 für Nichtblattebenen eines Indexes in der IN_ROW_DATA-Zuordnungseinheit.0 for nonleaf levels of an index in the IN_ROW_DATA allocation unit.

NULL zurück, wenn Modus = LIMITED.NULL when mode = LIMITED.
min_record_size_in_bytesmin_record_size_in_bytes intint Minimale Datensatzgröße in Bytes.Minimum record size in bytes.

Bei einem Index bezieht sich die minimale Datensatzgröße auf die aktuelle B-Strukturebene in der IN_ROW_DATA-Zuordnungseinheit.For an index, minimum record size applies to the current level of the b-tree in the IN_ROW_DATA allocation unit.

Bei einem Heap auf die minimale Datensatzgröße in der IN_ROW_DATA-Zuordnungseinheit.For a heap, the minimum record size in the IN_ROW_DATA allocation unit.

Bei LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheiten auf die minimale Datensatzgröße in der gesamten Zuordnungseinheit.For LOB_DATA or ROW_OVERFLOW_DATA allocation units, the minimum record size in the complete allocation unit.

NULL zurück, wenn Modus = LIMITED.NULL when mode = LIMITED.
max_record_size_in_bytesmax_record_size_in_bytes intint Maximale Datensatzgröße in Bytes.Maximum record size in bytes.

Bei einem Index bezieht sich die maximale Datensatzgröße auf die aktuelle B-Strukturebene in der IN_ROW_DATA-Zuordnungseinheit.For an index, the maximum record size applies to the current level of the b-tree in the IN_ROW_DATA allocation unit.

Bei einem Heap auf die maximale Datensatzgröße in der IN_ROW_DATA-Zuordnungseinheit.For a heap, the maximum record size in the IN_ROW_DATA allocation unit.

Bei LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheiten auf die maximale Datensatzgröße in der gesamten Zuordnungseinheit.For LOB_DATA or ROW_OVERFLOW_DATA allocation units, the maximum record size in the complete allocation unit.

NULL zurück, wenn Modus = LIMITED.NULL when mode = LIMITED.
avg_record_size_in_bytesavg_record_size_in_bytes floatfloat Durchschnittliche Datensatzgröße in Bytes.Average record size in bytes.

Bei einem Index bezieht sich die durchschnittliche Datensatzgröße auf die aktuelle B-Strukturebene in der IN_ROW_DATA-Zuordnungseinheit.For an index, the average record size applies to the current level of the b-tree in the IN_ROW_DATA allocation unit.

Bei einem Heap auf die durchschnittliche Datensatzgröße in der IN_ROW_DATA-Zuordnungseinheit.For a heap, the average record size in the IN_ROW_DATA allocation unit.

Bei LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheiten auf die durchschnittliche Datensatzgröße in der gesamten Zuordnungseinheit.For LOB_DATA or ROW_OVERFLOW_DATA allocation units, the average record size in the complete allocation unit.

NULL zurück, wenn Modus = LIMITED.NULL when mode = LIMITED.
forwarded_record_countforwarded_record_count bigintbigint Anzahl der Datensätze in einem Heap, die weiterleitungszeiger auf einen anderen Datenspeicherort besitzen.Number of records in a heap that have forward pointers to another data location. (Dieser Status tritt während eines Updates auf, wenn nicht genügend Speicherplatz vorhanden ist, um die neue Zeile am ursprünglichen Speicherort zu speichern.)(This state occurs during an update, when there is not enough room to store the new row in the original location.)

NULL für eine beliebige Zuordnungseinheit außer IN_ROW_DATA-Zuordnungseinheiten für einen Heap.NULL for any allocation unit other than the IN_ROW_DATA allocation units for a heap.

NULL für heaps, wenn Modus = LIMITED.NULL for heaps when mode = LIMITED.
compressed_page_countcompressed_page_count bigintbigint Die Anzahl der komprimierten Seiten.The number of compressed pages.

Bei Heaps sind neu zugeordnete Seiten nicht mit PAGE seitenkomprimiert.For heaps, newly allocated pages are not PAGE compressed. Ein Heap wird nur unter zwei besonderen Bedingungen PAGE-komprimiert: wenn Massendaten importiert werden oder wenn ein Heap neu erstellt wird.A heap is PAGE compressed under two special conditions: when data is bulk imported or when a heap is rebuilt. Typische DML-Vorgänge, die Seitenzuordnungen hervorrufen, werden nicht PAGE-komprimiert.Typical DML operations that cause page allocations will not be PAGE compressed. Erstellen Sie einen Heap neu, wenn der compressed_page_count-Wert den gewünschten Schwellenwert überschreitet.Rebuild a heap when the compressed_page_count value grows larger than the threshold you want.

Für Tabellen mit gruppiertem Index gibt der compressed_page_count-Wert die Wirksamkeit der PAGE-Komprimierung an.For tables that have a clustered index, the compressed_page_count value indicates the effectiveness of PAGE compression.
hobt_idhobt_id bigintbigint Gilt für: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis zur aktuellen Version), Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version), Azure SQL-DatenbankAzure SQL Database.

Für columnstore-Indizes ist dies die ID für ein Rowset, das die internen columnstore-Daten für eine Partition nachverfolgt.For columnstore indexes only, this is the ID for a rowset that tracks internal columnstore data for a partition. Die Rowsets sind, wie Daten heaps gespeicherte oder binäre Strukturen.The rowsets are stored as data heaps or binary trees. Sie verfügen über dieselbe Index-ID wie der übergeordnete columnstore-Index.They have the same index ID as the parent columnstore index. Weitere Informationen finden Sie unter sys.internal_partitions (Transact-SQL).For more information, see sys.internal_partitions (Transact-SQL).

NULL, wennNULL if
column_store_delete_buffer_statecolumn_store_delete_buffer_state tinyinttinyint Gilt für: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis zur aktuellen Version), Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version), Azure SQL-DatenbankAzure SQL Database.

0 = NOT_APPLICABLE0 = NOT_APPLICABLE

1 = OPEN1 = OPEN

2 = EIN AUSGLEICH DURCHGEFÜHRT2 = DRAINING

3 = LEEREN3 = FLUSHING

4 = ABKOPPELN4 = RETIRING

5 = BEREIT5 = READY
column_store_delete_buff_state_desccolumn_store_delete_buff_state_desc Gilt für: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis zur aktuellen Version), Azure SQL-DatenbankAzure SQL Database.Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version), Azure SQL-DatenbankAzure SQL Database.

NOT_APPLICABLE – der Index der übergeordneten ist kein columnstore-Index.NOT_APPLICABLE –the parent index is not a columnstore index.

Öffnen – Löschvorgänge und Scanner verwenden Sie diese.OPEN – deleters and scanners use this.

BELASTUNG – Löschvorgänge werden ein Ausgleich durchgeführt aber Scanner jedoch verwendet werden.DRAINING – deleters are draining out but scanners still use it.

Das leeren – Puffer wird geschlossen, und Zeilen im Puffer für die Delete-Bitmap geschrieben werden.FLUSHING – buffer is closed and rows in the buffer are being written to the delete bitmap.

ABKOPPELN – von Zeilen in der geschlossenen löschungspuffers geschrieben wurden, für die Delete-Bitmap, aber der Puffer wurde nicht abgeschnitten, da Scanner verwendet werden.RETIRING – rows in the closed delete buffer have been written to the delete bitmap, but the buffer has not been truncated because scanners are still using it. Neue Scanner müssen nicht die Abschaltung Puffer verwendet werden, da der geöffnete Puffer ausreichend ist.New scanners don’t need to use the retiring buffer because the open buffer is enough.

Soweit sind – diese löschungspuffers verwendet werden kann.READY – This delete buffer is ready for use.

HinweiseRemarks

Die dynamische Verwaltungsfunktion sys.dm_db_index_physical_stats ersetzt die DBCC SHOWCONTIG-Anweisung.The sys.dm_db_index_physical_stats dynamic management function replaces the DBCC SHOWCONTIG statement.

ScanmodiScanning Modes

Der Modus, in dem die Funktion ausgeführt wird, bestimmt die Scanebene, die zum Abrufen der statistischen Daten von der Funktion verwendet wird.The mode in which the function is executed determines the level of scanning performed to obtain the statistical data that is used by the function. Modus wird als LIMITED, SAMPLED oder DETAILED angegeben.mode is specified as LIMITED, SAMPLED, or DETAILED. Die Funktion durchsucht die Seitenketten nach den Zuordnungseinheiten, aus denen die angegebenen Partitionen der Tabelle oder des Indexes bestehen.The function traverses the page chains for the allocation units that make up the specified partitions of the table or index. Sys. dm_db_index_physical_stats erfordert nur eine beabsichtigte freigegebene Tabellensperre (IS) Tabellensperre, unabhängig vom Modus in ausgeführt wird.sys.dm_db_index_physical_stats requires only an Intent-Shared (IS) table lock, regardless of the mode that it runs in.

Der Modus LIMITED ist am schnellsten und durchsucht am wenigsten Seiten.The LIMITED mode is the fastest mode and scans the smallest number of pages. Bei einem Index werden nur die Seiten der übergeordneten B-Strukturebene (d. h. die Seiten oberhalb der Blattebene) gescannt.For an index, only the parent-level pages of the B-tree (that is, the pages above the leaf level) are scanned. Bei einem Heap werden nur die zugehörigen PFS- und IAM-Seiten untersucht; die Datenseiten des Heaps werden im Modus LIMITED gescannt.For a heap, the associated PFS and IAM pages are examined and the data pages of a heap are scanned in LIMITED mode.

Mit dem Modus LIMITED ist compressed_page_count NULL, da der DatenbankmodulDatabase Engine nur Nicht- Blattseiten der B-Struktur und die IAM- und PFS-Seiten des Heaps scannt.With LIMITED mode, compressed_page_count is NULL because the DatenbankmodulDatabase Engine only scans non-leaf pages of the B-tree and the IAM and PFS pages of the heap. Verwenden Sie den Modus SAMPLED, um einen geschätzten Wert für Compressed_page_count abzurufen, und verwenden Sie Modus DETAILED, um den tatsächlichen Wert für Compressed_page_count abzurufen.Use SAMPLED mode to get an estimated value for compressed_page_count, and use DETAILED mode to get the actual value for compressed_page_count. Der Modus SAMPLED gibt Statistiken basierend auf einer Stichprobe von 1 % aller Seiten im Index oder Heap zurück.The SAMPLED mode returns statistics based on a 1 percent sample of all the pages in the index or heap. Ergebnisse im SAMPLED-Modus sollten als ungefähre Werte angesehen werden.Results in SAMPLED mode should be regarded as approximate. Falls der Index oder Heap weniger als 10.000 Seiten aufweist, wird anstelle des Modus SAMPLED der Modus DETAILED verwendet.If the index or heap has fewer than 10,000 pages, DETAILED mode is used instead of SAMPLED.

Der Modus DETAILED durchsucht alle Seiten und gibt alle Statistiken zurück.The DETAILED mode scans all pages and returns all statistics.

Die Geschwindigkeit der Modi nimmt von LIMITED zu DETAILED schrittweise ab, weil im jeweils nächsten Modus mehr Arbeitsschritte ausgeführt werden.The modes are progressively slower from LIMITED to DETAILED, because more work is performed in each mode. Verwenden Sie den Modus LIMITED, wenn Sie die Größe oder die Fragmentierungsebene einer Tabelle oder eines Indexes schnell messen möchten.To quickly gauge the size or fragmentation level of a table or index, use the LIMITED mode. Dies ist der schnellste Modus und gibt nicht für jede Nichtblattebene in der IN_ROW_DATA-Zuordnungseinheit des Indexes eine Zeile zurück.It is the fastest and will not return a row for each nonleaf level in the IN_ROW_DATA allocation unit of the index.

Verwenden von Systemfunktionen zum Angeben von ParameterwertenUsing System Functions to Specify Parameter Values

Können Sie die Transact-SQLTransact-SQL Funktionen DB_ID und OBJECT_ID , geben Sie einen Wert für die Database_id und Object_id Parameter.You can use the Transact-SQLTransact-SQL functions DB_ID and OBJECT_ID to specify a value for the database_id and object_id parameters. Das Übergeben von Werten, die für diese Funktionen nicht gültig sind, kann jedoch zu unerwarteten Ergebnissen führen.However, passing values that are not valid to these functions may cause unintended results. Falls z. B. die Datenbank oder der Objektname nicht gefunden wird, weil er nicht vorhanden oder falsch geschrieben ist, geben beide Funktionen NULL zurück.For example, if the database or object name cannot be found because they do not exist or are spelled incorrectly, both functions will return NULL. Die sys.dm_db_index_physical_stats-Funktion interpretiert NULL als Platzhalterwert, mit dem alle Datenbanken oder alle Objekte angegeben werden.The sys.dm_db_index_physical_stats function interprets NULL as a wildcard value specifying all databases or all objects.

Darüber hinaus die OBJECT_ID-Funktion wird verarbeitet, bevor die Sys. dm_db_index_physical_stats-Funktion aufgerufen wird, und daher im Kontext der aktuellen Datenbank ausgewertet wird, nicht in die Datenbank angegeben, Database_id.Additionally, the OBJECT_ID function is processed before the sys.dm_db_index_physical_stats function is called and is therefore evaluated in the context of the current database, not the database specified in database_id. Dadurch gibt die OBJECT_ID-Funktion unter Umständen einen NULL-Wert zurück, oder es wird eine Fehlermeldung zurückgegeben, falls der Objektname sowohl im aktuellen Datenbankkontext als auch in der angegebenen Datenbank vorhanden ist.This behavior may cause the OBJECT_ID function to return a NULL value; or, if the object name exists in both the current database context and the specified database, an error message may be returned. In den folgenden Beispielen werden diese nicht beabsichtigten Ergebnisse veranschaulicht.The following examples demonstrate these unintended results.

USE master;  
GO  
-- In this example, OBJECT_ID is evaluated in the context of the master database.   
-- Because Person.Address does not exist in master, the function returns NULL.  
-- When NULL is specified as an object_id, all objects in the database are returned.  
-- The same results are returned when an object that is not valid is specified.  
SELECT * FROM sys.dm_db_index_physical_stats  
    (DB_ID(N'AdventureWorks'), OBJECT_ID(N'Person.Address'), NULL, NULL , 'DETAILED');  
GO  
-- This example demonstrates the results of specifying a valid object name  
-- that exists in both the current database context and  
-- in the database specified in the database_id parameter of the   
-- sys.dm_db_index_physical_stats function.  
-- An error is returned because the ID value returned by OBJECT_ID does not  
-- match the ID value of the object in the specified database.  
CREATE DATABASE Test;  
GO  
USE Test;  
GO  
CREATE SCHEMA Person;  
GO  
CREATE Table Person.Address(c1 int);  
GO  
USE AdventureWorks2012;  
GO  
SELECT * FROM sys.dm_db_index_physical_stats  
    (DB_ID(N'Test'), OBJECT_ID(N'Person.Address'), NULL, NULL , 'DETAILED');  
GO  
-- Clean up temporary database.  
DROP DATABASE Test;  
GO  

Bewährte MethodenBest Practice

Stellen Sie stets sicher, dass bei der Verwendung von DB_ID oder OBJECT_ID eine gültige ID zurückgegeben wird.Always make sure that a valid ID is returned when you use DB_ID or OBJECT_ID. Beispielsweise bei Verwendung von OBJECT_ID Geben Sie einen dreiteiligen Namen wie z. B. OBJECT_ID(N'AdventureWorks2012.Person.Address'), oder testen Sie den Wert, der von der Funktion zurückgegebenen werden, bevor Sie sie in der Sys. dm_db_index_physical_stats-Funktion verwenden.For example, when you use OBJECT_ID, specify a three-part name such as OBJECT_ID(N'AdventureWorks2012.Person.Address'), or test the value returned by the functions before you use them in the sys.dm_db_index_physical_stats function. In den nachstehenden Beispielen A und B wird eine sichere Möglichkeit zur Angabe von Datenbank- und Objekt-IDs aufgezeigt.Examples A and B that follow demonstrate a safe way to specify database and object IDs.

Erkennen der FragmentierungDetecting Fragmentation

Die Fragmentierung wird durch Datenänderungen (mithilfe der Anweisungen INSERT, UPDATE oder DELETE) in Bezug auf die Tabelle und dadurch an den für diese Tabelle definierten Indizes hervorgerufen.Fragmentation occurs through the process of data modifications (INSERT, UPDATE, and DELETE statements) that are made against the table and, therefore, to the indexes defined on the table. Da diese Änderungen normalerweise nicht gleichmäßig über alle Zeilen der Tabelle und Indizes verteilt vorgenommen werden, kann sich mit der Zeit der Füllgrad jeder Seite ändern.Because these modifications are not ordinarily distributed equally among the rows of the table and indexes, the fullness of each page can vary over time. Diese Tabellenfragmentierung kann bei Abfragen, bei denen die Indizes einer Tabelle teilweise oder ganz gescannt werden, zu zusätzlichen Seitenlesevorgängen führen.For queries that scan part or all of the indexes of a table, this kind of fragmentation can cause additional page reads. Dies behindert das parallele Scannen von Daten.This hinders parallel scanning of data.

Die Fragmentierungsebene eines Indexes oder Heaps wird in der avg_fragmentation_in_percent-Spalte angezeigt.The fragmentation level of an index or heap is shown in the avg_fragmentation_in_percent column. Bei Heaps stellt dieser Wert die Blockfragmentierung des Heaps dar.For heaps, the value represents the extent fragmentation of the heap. Bei Indizes stellt dieser Wert die logische Fragmentierung des Indexes dar.For indexes, the value represents the logical fragmentation of the index. Im Gegensatz zu DBCC SHOWCONTIG wird bei den Algorithmen zur Fragmentierungsberechnung in beiden Fällen Speicherplatz berücksichtigt, der sich über mehrere Dateien erstreckt; folglich sind diese Algorithmen genauer.Unlike DBCC SHOWCONTIG, the fragmentation calculation algorithms in both cases consider storage that spans multiple files and, therefore, are accurate.

Die logische FragmentierungLogical Fragmentation

Dies ist der Prozentsatz der Seiten, die auf den Blattseiten eines Indexes nicht ordnungsgemäß sortiert sind.This is the percentage of out-of-order pages in the leaf pages of an index. Eine nicht ordnungsgemäß einsortierte Seite ist eine Seite, für die die nächste physische Seite, die dem Index zugeordnet ist, nicht die Seite ist, auf die der Zeiger für die nächste Seite auf der aktuellen Blattseite zeigt.An out-of-order page is a page for which the next physical page allocated to the index is not the page pointed to by the next-page pointer in the current leaf page.

BlockfragmentierungExtent Fragmentation

Dies ist der Prozentsatz der Blöcke, die auf den Blattseiten eines Heaps nicht ordnungsgemäß sortiert sind.This is the percentage of out-of-order extents in the leaf pages of a heap. Ein nicht ordnungsgemäß sortierter Block ist ein Block, für den der Block, der die aktuelle Seite eines Heaps enthält, physisch nicht der nächste Block nach dem Block ist, der die vorherige Seite enthält.An out-of-order extent is one for which the extent that contains the current page for a heap is not physically the next extent after the extent that contains the previous page.

Der Wert für avg_fragmentation_in_percent sollte möglichst nahe bei null liegen, um eine optimale Leistung sicherzustellen.The value for avg_fragmentation_in_percent should be as close to zero as possible for maximum performance. Werte zwischen 0 und 10 % sind jedoch akzeptabel.However, values from 0 percent through 10 percent may be acceptable. Um diese Werte zu verringern, können alle Methoden zur Reduzierung der Fragmentierung verwendet werden, wie z. B. Neuerstellung oder Neuorganisierung.All methods of reducing fragmentation, such as rebuilding, reorganizing, or re-creating, can be used to reduce these values. Weitere Informationen zum Analysieren des Grad der Fragmentierung in einem Index finden Sie unter Neuorganisieren und Neuerstellen von Indizes.For more information about how to analyze the degree of fragmentation in an index, see Reorganize and Rebuild Indexes.

Reduzieren der Fragmentierung in einem IndexReducing Fragmentation in an Index

Wenn ein Index derart fragmentiert ist, dass die Fragmentierung die Abfrageleistung beeinträchtigt, gibt es drei Möglichkeiten, um die Fragmentierung zu reduzieren:When an index is fragmented in a way that the fragmentation is affecting query performance, there are three choices for reducing fragmentation:

  • Löschen Sie den gruppierten Index, und erstellen Sie ihn neu.Drop and re-create the clustered index.

    Durch das erneute Erstellen eines gruppierten Indexes werden die Daten neu verteilt, was zu vollen Datenseiten führt.Re-creating a clustered index redistributes the data and results in full data pages. Der Füllungsgrad kann über die Option FILLFACTOR in CREATE INDEX konfiguriert werden.The level of fullness can be configured by using the FILLFACTOR option in CREATE INDEX. Diese Methode hat den Nachteil, dass der Index während des Löschens und Neuerstellens offline und der Vorgang atomar ist.The drawbacks in this method are that the index is offline during the drop and re-create cycle, and that the operation is atomic. Wenn die Indexerstellung unterbrochen wird, wird der Index nicht neu erstellt.If the index creation is interrupted, the index is not re-created. Weitere Informationen finden Sie unter CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).

  • Verwenden Sie ALTER INDEX REORGANIZE (der Ersatz für DBCC INDEXDEFRAG), um die Indexseiten auf Blattebene in einer logischen Reihenfolge neu anzuordnen.Use ALTER INDEX REORGANIZE, the replacement for DBCC INDEXDEFRAG, to reorder the leaf level pages of the index in a logical order. Da es sich hierbei um einen Onlinevorgang handelt, steht der Index während der Ausführung der Anweisung zur Verfügung.Because this is an online operation, the index is available while the statement is running. Der Vorgang kann auch ohne Verlust bereits abgeschlossener Arbeitsschritte unterbrochen werden.The operation can also be interrupted without losing work already completed. Diese Methode hat den Nachteil, dass die Daten nicht so gut neu organisiert werden wie bei einem Indexneuerstellungsvorgang, und außerdem werden die Statistiken nicht aktualisiert.The drawback in this method is that it does not do as good a job of reorganizing the data as an index rebuild operation, and it does not update statistics.

  • Verwenden Sie ALTER INDEX REBUILD (der Ersatz für DBCC DBREINDEX), um den Index im Online- oder Offlinemodus neu zu erstellen.Use ALTER INDEX REBUILD, the replacement for DBCC DBREINDEX, to rebuild the index online or offline. Weitere Informationen finden Sie unter ALTER INDEX (Transact-SQL).For more information, see ALTER INDEX (Transact-SQL).

    Die Fragmentierung alleine ist kein ausreichender Grund, um einen Index neu zu organisieren oder neu zu erstellen.Fragmentation alone is not a sufficient reason to reorganize or rebuild an index. Durch die Fragmentierung wird in erster Linie der Read-Ahead-Durchsatz von Seiten während Indexscans reduziert.The main effect of fragmentation is that it slows down page read-ahead throughput during index scans. Dies verursacht langsamere Antwortzeiten.This causes slower response times. Falls die Abfragearbeitsauslastung für eine fragmentierte Tabelle oder einen fragmentierten Index keine Scans enthält, weil es sich bei der Arbeitsauslastung in erster Linie um Singleton-Suchvorgänge handelt, hat das Beseitigen der Fragmentierung möglicherweise keine Auswirkungen.If the query workload on a fragmented table or index does not involve scans, because the workload is primarily singleton lookups, removing fragmentation may have no effect. Weitere Informationen finden Sie in diesem Microsoft-Website.For more information, see this Microsoft Web site.

Hinweis

Ausführen von DBCC SHRINKFILE oder DBCC SHRINKDATABASE kann zur Fragmentierung führen, wenn ein Index während des Verkleinerungsvorgangs teilweise oder vollständig verschoben wird.Running DBCC SHRINKFILE or DBCC SHRINKDATABASE may introduce fragmentation if an index is partly or completely moved during the shrink operation. Wenn ein Verkleinerungsvorgang ausgeführt werden muss, sollten Sie diesen deshalb vor dem Beseitigen der Fragmentierung vornehmen.Therefore, if a shrink operation must be performed, you should do it before fragmentation is removed.

Reduzieren der Fragmentierung in einem HeapReducing Fragmentation in a Heap

Um die Blockfragmentierung eines Heaps zu reduzieren, erstellen Sie einen gruppierten Index für die Tabelle, und löschen Sie dann den Index.To reduce the extent fragmentation of a heap, create a clustered index on the table and then drop the index. Dadurch werden die Daten neu verteilt, während der gruppierte Index erstellt wird.This redistributes the data while the clustered index is created. Dabei wird ein möglichst optimaler Zustand in Bezug auf die Verteilung des freien Speicherplatzes in der Datenbank angestrebt.This also makes it as optimal as possible, considering the distribution of free space available in the database. Wenn der gruppierte Index dann gelöscht wird, um den Heap neu zu erstellen, werden die Daten nicht verschoben und verbleiben an ihrer optimalen Position.When the clustered index is then dropped to re-create the heap, the data is not moved and remains optimally in position. Informationen zum Ausführen dieser Vorgänge finden Sie unter CREATE INDEX und DROP INDEX.For information about how to perform these operations, see CREATE INDEX and DROP INDEX.

Achtung

Durch das Erstellen oder Verwerfen eines gruppierten Indexes einer Tabelle werden alle nicht gruppierten Indexes der Tabelle doppelt neu erstellt.Creating and dropping a clustered index on a table, rebuilds all non-clustered indexes on that table twice.

Komprimieren von LOB-DatenCompacting Large Object Data

Standardmäßig komprimiert die ALTER INDEX REORGANIZE-Anweisung Seiten, die LOB-Daten (Large Object) enthalten.By default, the ALTER INDEX REORGANIZE statement compacts pages that contain large object (LOB) data. Die Zuordnung von LOB-Seiten wird nicht aufgehoben, wenn sie leer sind. Deshalb kann durch das Komprimieren dieser Daten der Speicherplatz optimiert werden, falls viele LOB-Daten gelöscht wurden oder eine LOB-Spalte entfernt wird.Because LOB pages are not deallocated when empty, compacting this data can improve disk space use if lots of LOB data have been deleted, or a LOB column is dropped.

Durch das Neuorganisieren eines angegebenen gruppierten Indexes werden alle im gruppierten Index enthaltenen LOB-Spalten komprimiert.Reorganizing a specified clustered index compacts all LOB columns that are contained in the clustered index. Durch das Neuorganisieren eines nicht gruppierten Indexes werden alle LOB-Spalten komprimiert, die (eingeschlossene) Nichtschlüsselspalten im Index sind.Reorganizing a nonclustered index compacts all LOB columns that are nonkey (included) columns in the index. Wenn ALL in der Anweisung angegeben wird, werden alle Indizes, die der angegebenen Tabelle oder Sicht zugeordnet sind, neu organisiert.When ALL is specified in the statement, all indexes that are associated with the specified table or view are reorganized. Darüber hinaus werden alle LOB-Spalten, die dem gruppierten Index, der zugrunde liegenden Tabelle oder dem nicht gruppierten Index mit eingeschlossenen Spalten zugeordnet sind, komprimiert.Additionally, all LOB columns that are associated with the clustered index, underlying table, or nonclustered index with included columns are compacted.

Auswerten der SpeicherplatzverwendungEvaluating Disk Space Use

Die avg_page_space_used_in_percent-Spalte gibt den Seitenfüllgrad an.The avg_page_space_used_in_percent column indicates page fullness. Für eine optimale Speicherplatzverwendung sollte dieser Wert für einen Index ohne viele zufällige Einfügungen nahe bei 100 % liegen.To achieve optimal disk space use, this value should be close to 100 percent for an index that will not have many random inserts. Ein Index mit zahlreichen zufälligen Einfügungen und sehr vollen Seiten verfügt jedoch über eine höhere Anzahl von Seitenteilungen.However, an index that has many random inserts and has very full pages will have an increased number of page splits. Dadurch entsteht mehr Fragmentierung.This causes more fragmentation. Deshalb sollte dieser Wert unter 100 % liegen, um Seitenteilungen zu reduzieren.Therefore, in order to reduce page splits, the value should be less than 100 percent. Durch die Neuerstellung eines Indexes mit angegebener Option FILLFACTOR kann der Seitenfüllgrad an das Abfragemuster für den Index angepasst werden.Rebuilding an index with the FILLFACTOR option specified allows the page fullness to be changed to fit the query pattern on the index. Weitere Informationen zum Füllfaktor finden Sie unter angeben des Füllfaktors für einen Index.For more information about fill factor, see Specify Fill Factor for an Index. Darüber hinaus komprimiert ALTER INDEX REORGANIZE einen Index, indem versucht wird, Seiten bis zum zuletzt angegebenen FILLFACTOR-Wert zu füllen.Also, ALTER INDEX REORGANIZE will compact an index by trying to fill pages to the FILLFACTOR that was last specified. Dadurch erhöht sich der Wert in avg_space_used_in_percent.This increases the value in avg_space_used_in_percent. Beachten Sie, dass der Seitenfüllgrad mit ALTER INDEX REORGANIZE nicht reduziert werden kann.Note that ALTER INDEX REORGANIZE cannot reduce page fullness. Stattdessen muss eine Indexneuerstellung ausgeführt werden.Instead, an index rebuild must be performed.

Auswerten von IndexfragmentenEvaluating Index Fragments

Ein Fragment besteht aus aufeinander folgenden Blattseiten in derselben Datei für eine Zuordnungseinheit.A fragment is made up of physically consecutive leaf pages in the same file for an allocation unit. Ein Index weist mindestens ein Fragment auf.An index has at least one fragment. Die maximale Anzahl von Fragmenten für einen Index entspricht der Anzahl von Seiten auf der Blattebene des Indexes.The maximum fragments an index can have are equal to the number of pages in the leaf level of the index. Größere Fragmente bedeuten, dass weniger Datenträger-E/A-Vorgänge zum Lesen der gleichen Anzahl von Seiten erforderlich sind.Larger fragments mean that less disk I/O is required to read the same number of pages. Deshalb gilt, je höher der Wert für avg_fragment_size_in_pages, desto besser ist die Leistung des Bereichsscans.Therefore, the larger the avg_fragment_size_in_pages value, the better the range scan performance. Die Werte avg_fragment_size_in_pages und avg_fragmentation_in_percent verhalten sich umgekehrt proportional zueinander.The avg_fragment_size_in_pages and avg_fragmentation_in_percent values are inversely proportional to each other. Deshalb sollte durch das Neuerstellen oder Neuorganisieren eines Indexes die Fragmentierung reduziert und die Fragmentgröße erhöht werden.Therefore, rebuilding or reorganizing an index should reduce the amount of fragmentation and increase the fragment size.

EinschränkungenLimitations and Restrictions

Gibt keine Daten für gruppierte columnstore-Indizes zurück.Does not return data for clustered columnstore indexes.

BerechtigungenPermissions

Folgende Berechtigungen sind erforderlich:Requires the following permissions:

  • CONTROL-Berechtigung für das angegebene Objekt innerhalb der Datenbank.CONTROL permission on the specified object within the database.

  • VIEW DATABASE STATE-Berechtigung zum Zurückgeben von Informationen zu allen Objekten innerhalb der angegebenen Datenbank mithilfe des Objekt-Platzhalters @Object_id= NULL.VIEW DATABASE STATE permission to return information about all objects within the specified database, by using the object wildcard @object_id=NULL.

  • VIEW SERVER STATE-Berechtigung zum Zurückgeben von Informationen zu allen Datenbanken mithilfe des Datenbank-Platzhalters @Database_id = NULL.VIEW SERVER STATE permission to return information about all databases, by using the database wildcard @database_id = NULL.

    Wenn die VIEW DATABASE STATE-Berechtigung erteilt wurde, ist die Rückgabe für alle Objekte in der Datenbank zulässig, unabhängig davon, ob CONTROL-Berechtigungen für bestimmte Objekte verweigert wurden.Granting VIEW DATABASE STATE allows all objects in the database to be returned, regardless of any CONTROL permissions denied on specific objects.

    Nach dem Verweigern der VIEW DATABASE STATE-Berechtigung können keine Objekte in der Datenbank zurückgegeben werden, unabhängig von möglicherweise erteilten CONTROL-Berechtigungen für bestimmte Objekte.Denying VIEW DATABASE STATE disallows all objects in the database to be returned, regardless of any CONTROL permissions granted on specific objects. Auch wenn dem Datenbank-Platzhalter @Database_id= NULL angegeben wird, wird die Datenbank ausgelassen.Also, when the database wildcard @database_id=NULL is specified, the database is omitted.

    Weitere Informationen finden Sie unter dynamische Verwaltungssichten und-Funktionen (Transact-SQL).For more information, see Dynamic Management Views and Functions (Transact-SQL).

BeispieleExamples

A.A. Zurückgeben von Informationen zu einer angegebenen TabelleReturning information about a specified table

Im folgenden Beispiel werden die Größen- und Fragmentierungsstatistiken für alle Indizes und Partitionen der Person.Address-Tabelle zurückgegeben.The following example returns size and fragmentation statistics for all indexes and partitions of the Person.Address table. Als Scanmodus ist 'LIMITED' festgelegt, um eine optimale Leistung sicherzustellen und die zurückgegebenen Statistiken zu begrenzen.The scan mode is set to 'LIMITED' for best performance and to limit the statistics that are returned. Für die Ausführung dieser Abfrage wird zumindest die CONTROL-Berechtigung für die Person.Address-Tabelle benötigt.Executing this query requires, at a minimum, CONTROL permission on the Person.Address table.

DECLARE @db_id SMALLINT;  
DECLARE @object_id INT;  

SET @db_id = DB_ID(N'AdventureWorks2012');  
SET @object_id = OBJECT_ID(N'AdventureWorks2012.Person.Address');  

IF @db_id IS NULL  
BEGIN;  
    PRINT N'Invalid database';  
END;  
ELSE IF @object_id IS NULL  
BEGIN;  
    PRINT N'Invalid object';  
END;  
ELSE  
BEGIN;  
    SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , 'LIMITED');  
END;  
GO  

B.B. Zurückgeben von Informationen zu einem HeapReturning information about a heap

Im folgenden Beispiel werden alle Statistiken für den dbo.DatabaseLog-Heap in der AdventureWorks2012AdventureWorks2012-Datenbank zurückgegeben.The following example returns all statistics for the heap dbo.DatabaseLog in the AdventureWorks2012AdventureWorks2012 database. Da die Tabelle LOB-Daten enthält, wird eine Zeile für die LOB_DATA-Zuordnungseinheit zurückgegeben. Dies geschieht zusätzlich zu der Zeile, die für IN_ROW_ALLOCATION_UNIT zurückgegeben wird und in der die Datenseiten des Heaps gespeichert sind.Because the table contains LOB data, a row is returned for the LOB_DATA allocation unit in addition to the row returned for the IN_ROW_ALLOCATION_UNIT that is storing the data pages of the heap. Für die Ausführung dieser Abfrage wird zumindest die CONTROL-Berechtigung für die dbo.DatabaseLog-Tabelle benötigt.Executing this query requires, at a minimum, CONTROL permission on the dbo.DatabaseLog table.

DECLARE @db_id SMALLINT;  
DECLARE @object_id INT;  
SET @db_id = DB_ID(N'AdventureWorks2012');  
SET @object_id = OBJECT_ID(N'AdventureWorks2012.dbo.DatabaseLog');  
IF @object_id IS NULL   
BEGIN;  
    PRINT N'Invalid object';  
END;  
ELSE  
BEGIN;  
    SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, 0, NULL , 'DETAILED');  
END;  
GO  

C.C. Zurückgeben von Informationen zu allen DatenbankenReturning information for all databases

Im folgenden Beispiel werden alle Statistiken für alle Tabellen und Indizes innerhalb der Instanz von SQL ServerSQL Server zurückgegeben, indem der Platzhalter NULL für alle Parameter angegeben wird.The following example returns all statistics for all tables and indexes within the instance of SQL ServerSQL Server by specifying the wildcard NULL for all parameters. Zum Ausführen dieser Abfrage erfordert die VIEW SERVER STATE-Berechtigung.Executing this query requires the VIEW SERVER STATE permission.

SELECT * FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, NULL);  
GO  

D.D. Verwenden von "sys.dm_db_index_physical_stats" in einem Skript, um Indizes neu zu erstellen oder neu zu organisierenUsing sys.dm_db_index_physical_stats in a script to rebuild or reorganize indexes

Im folgenden Beispiel werden automatisch alle Partitionen in einer Datenbank neu angeordnet oder neu erstellt, die eine durchschnittliche Fragmentierung von über 10 % aufweisen.The following example automatically reorganizes or rebuilds all partitions in a database that have an average fragmentation over 10 percent. Zum Ausführen dieser Abfrage ist die VIEW DATABASE STATE-Berechtigung erforderlich.Executing this query requires the VIEW DATABASE STATE permission. In diesem Beispiel wird DB_ID als erster Parameter angegeben, ohne einen Datenbanknamen anzugeben.This example specifies DB_ID as the first parameter without specifying a database name. Ein Fehler wird generiert, wenn die aktuelle Datenbank über einen Kompatibilitätsgrad von 80 oder niedriger verfügt.An error will be generated if the current database has a compatibility level of 80 or lower. Zum Beheben des Fehlers ersetzen Sie DB_ID() durch einen gültigen Datenbanknamen.To resolve the error, replace DB_ID() with a valid database name. Weitere Informationen zu Kompatibilitätsgraden von Datenbanken finden Sie unter ALTER DATABASE Kompatibilitätsgrad (Transact-SQL).For more information about database compatibility levels, see ALTER DATABASE Compatibility Level (Transact-SQL).

-- Ensure a USE <databasename> statement has been executed first.  
SET NOCOUNT ON;  
DECLARE @objectid int;  
DECLARE @indexid int;  
DECLARE @partitioncount bigint;  
DECLARE @schemaname nvarchar(130);   
DECLARE @objectname nvarchar(130);   
DECLARE @indexname nvarchar(130);   
DECLARE @partitionnum bigint;  
DECLARE @partitions bigint;  
DECLARE @frag float;  
DECLARE @command nvarchar(4000);   
-- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function   
-- and convert object and index IDs to names.  
SELECT  
    object_id AS objectid,  
    index_id AS indexid,  
    partition_number AS partitionnum,  
    avg_fragmentation_in_percent AS frag  
INTO #work_to_do  
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')  
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;  

-- Declare the cursor for the list of partitions to be processed.  
DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;  

-- Open the cursor.  
OPEN partitions;  

-- Loop through the partitions.  
WHILE (1=1)  
    BEGIN;  
        FETCH NEXT  
           FROM partitions  
           INTO @objectid, @indexid, @partitionnum, @frag;  
        IF @@FETCH_STATUS < 0 BREAK;  
        SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)  
        FROM sys.objects AS o  
        JOIN sys.schemas as s ON s.schema_id = o.schema_id  
        WHERE o.object_id = @objectid;  
        SELECT @indexname = QUOTENAME(name)  
        FROM sys.indexes  
        WHERE  object_id = @objectid AND index_id = @indexid;  
        SELECT @partitioncount = count (*)  
        FROM sys.partitions  
        WHERE object_id = @objectid AND index_id = @indexid;  

-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.  
        IF @frag < 30.0  
            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';  
        IF @frag >= 30.0  
            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';  
        IF @partitioncount > 1  
            SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));  
        EXEC (@command);  
        PRINT N'Executed: ' + @command;  
    END;  

-- Close and deallocate the cursor.  
CLOSE partitions;  
DEALLOCATE partitions;  

-- Drop the temporary table.  
DROP TABLE #work_to_do;  
GO  

E.E. Anzeigen der Anzahl von Seiten mit Seitenkomprimierung mithilfe von "sys.dm_db_index_physical_stats"Using sys.dm_db_index_physical_stats to show the number of page-compressed pages

Im folgenden Beispiel wird gezeigt, wie die Gesamtanzahl von Seiten angezeigt und den Seiten mit Zeilen- und Seitenkomprimierung gegenüber gestellt wird.The following example shows how to display and compare the total number of pages against the pages that are row and page compressed. Mithilfe dieser Informationen kann ermittelt werden, welche Vorteile diese Komprimierung für einen Index oder eine Tabelle hat.This information can be used to determine the benefit that compression is providing for an index or table.

SELECT o.name,  
    ips.partition_number,  
    ips.index_type_desc,  
    ips.record_count, ips.avg_record_size_in_bytes,  
    ips.min_record_size_in_bytes,  
    ips.max_record_size_in_bytes,  
    ips.page_count, ips.compressed_page_count  
FROM sys.dm_db_index_physical_stats ( DB_ID(), NULL, NULL, NULL, 'DETAILED') ips  
JOIN sys.objects o on o.object_id = ips.object_id  
ORDER BY record_count DESC;  

F.F. Verwenden von „sys.dm_db_index_physical_stats“ im Modus SAMPLEDUsing sys.dm_db_index_physical_stats in SAMPLED mode

Im folgenden Beispiel wird gezeigt, wie vom Modus SAMPLED ein ungefährer Wert zurückgegeben wird, der sich von den Ergebnissen des Modus DETAILED unterscheidet.The following example shows how SAMPLED mode returns an approximate that is different than the DETAILED mode results.

CREATE TABLE t3 (col1 int PRIMARY KEY, col2 varchar(500)) WITH(DATA_COMPRESSION = PAGE);  
GO  
BEGIN TRAN  
DECLARE @idx int = 0;  
WHILE @idx < 1000000  
BEGIN  
    INSERT INTO t3 (col1, col2)   
    VALUES (@idx,   
    REPLICATE ('a', 100) + CAST (@idx as varchar(10)) + REPLICATE ('a', 380))  
    SET @idx = @idx + 1  
END  
COMMIT;  
GO  
SELECT page_count, compressed_page_count, forwarded_record_count, *   
FROM sys.dm_db_index_physical_stats (db_id(),   
    object_id ('t3'), null, null, 'SAMPLED');  
SELECT page_count, compressed_page_count, forwarded_record_count, *   
FROM sys.dm_db_index_physical_stats (db_id(),   
    object_id ('t3'), null, null, 'DETAILED');  

G.G. Abfragen von Service Broker-Warteschlangen für IndexfragmentierungQuerying service broker queues for index fragmentation

||
|-|
|Gilt für: SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL ServerSQL Server.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL ServerSQL Server.|

In den folgenden Beispielen wird gezeigt, wie Server Broker-Warteschlangen Fragmentierung abgefragt wird.The following examples shows how to query server broker queues for fragmentation.

--Using queue internal table name   
select * from sys.dm_db_index_physical_stats (db_id(), object_id ('sys.queue_messages_549576996'), default, default, default)   

--Using queue name directly  
select * from sys.dm_db_index_physical_stats (db_id(), object_id ('ExpenseQueue'), default, default, default)  

Siehe auchSee Also

Dynamische Verwaltungssichten und -funktionen (Transact-SQL) Dynamic Management Views and Functions (Transact-SQL)
Index Related Dynamic Management Views and Functions (Transact-SQL) (Indexbezogene dynamische Verwaltungssichten und -funktionen (Transact-SQL)) Index Related Dynamic Management Views and Functions (Transact-SQL)
sys.dm_db_index_operational_stats (Transact-SQL) sys.dm_db_index_operational_stats (Transact-SQL)
sys.dm_db_index_usage_stats (Transact-SQL) sys.dm_db_index_usage_stats (Transact-SQL)
sys.dm_db_partition_stats (Transact-SQL) sys.dm_db_partition_stats (Transact-SQL)
sys.allocation_units (Transact-SQL) sys.allocation_units (Transact-SQL)
Systemsichten (Transact-SQL)System Views (Transact-SQL)