Heaps (Tabellen ohne gruppierte Indizes)Heaps (Tables without Clustered Indexes)

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL DatabaseAnwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database

Ein Heap ist eine Tabelle ohne gruppierten Index.A heap is a table without a clustered index. Ein oder mehrere nicht gruppierte Indizes können für Tabellen erstellt werden, die als Heap gespeichert sind.One or more nonclustered indexes can be created on tables stored as a heap. Daten werden ohne bestimmte Reihenfolge im Heap gespeichert.Data is stored in the heap without specifying an order. Normalerweise werden Daten anfänglich in der Reihenfolge gespeichert, in der die Zeilen in die Tabelle eingefügt werden. Datenbank-EngineDatabase Engine kann die Daten jedoch im Heap verschieben, um die Zeilen effizienter zu speichern; daher kann die Reihenfolge der Daten nicht vorhergesagt werden.Usually data is initially stored in the order in which is the rows are inserted into the table, but the Datenbank-EngineDatabase Engine can move data around in the heap to store the rows efficiently; so the data order cannot be predicted. Um die von einem Heap zurückgegebene Zeilenreihenfolge zu garantieren, müssen Sie die ORDER BY-Klausel verwenden.To guarantee the order of rows returned from a heap, you must use the ORDER BY clause. Erstellen Sie einen gruppierten Index für die Tabelle, damit die Tabelle kein Heap ist, um eine permanente logische Reihenfolge für die Speicherung von Zeilen festzulegen.To specify a permanent logical order for storing the rows, create a clustered index on the table, so that the table is not a heap.

Hinweis

In bestimmten Fällen gibt es gute Gründe, eine Tabelle als einen Heap zu belassen, statt einen gruppierten Index zu erstellen. Die effektive Verwendung von Heaps ist jedoch Benutzern mit fortgeschrittenen Kenntnissen vorbehalten.There are sometimes good reasons to leave a table as a heap instead of creating a clustered index, but using heaps effectively is an advanced skill. Die meisten Tabellen sollten über einen sorgfältig ausgewählten gruppierten Index verfügen, es sei denn, es gibt gute Gründe, die Tabelle als Heap beizubehalten.Most tables should have a carefully chosen clustered index unless a good reason exists for leaving the table as a heap.

Verwendungsbereiche für HeapsWhen to Use a Heap

Wenn eine Tabelle als Heap gespeichert wird, werden einzelne Zeilen durch einen 8-Byte-Zeilenbezeichner (RID, Row Identifier) gekennzeichnet, der aus der Dateinummer, der Datenseitennummer und einem Slot auf der Seite (FileID:PageID:SlotID) besteht.When a table is stored as a heap, individual rows are identified by reference to an 8-byte row identifier (RID) consisting of the file number, data page number, and slot on the page (FileID:PageID:SlotID). Die Zeilen-ID ist eine kleine und effiziente Struktur.The row ID is a small and efficient structure.

Heaps können als Stagingtabellen für große, unsortierte Einfügevorgänge verwendet werden.Heaps can be used as staging tables for large, unordered insert operations. Da beim Einfügen von Daten keine strikte Reihenfolge erzwungen wird, ist der Einfügevorgang hier in der Regel schneller als beim Einfügen in einen gruppierten Index.Because data is inserted without enforcing a strict order, the insert operation is usually faster than the equivalent insert into a clustered index. Wenn die Heapdaten gelesen und im endgültigen Ziel verarbeitet werden, kann es hilfreich sein, einen schmalen, nicht gruppierten Index mit dem Suchprädikat der Leseabfrage zu erstellen.If the heap's data will be read and processed into a final destination, it may be useful to create a narrow nonclustered index that covers the search predicate used by the read query.

Hinweis

Die Daten werden aus einem Heap in der Reihenfolge der Datenseiten abgerufen. Diese muss jedoch nicht notwendigerweise mit der Reihenfolge übereinstimmen, in der die Daten eingefügt wurden.Data is retrieved from a heap in order of data pages, but not necessarily the order in which data was inserted.

In einigen Fällen verwenden Datenexperten Heaps, wenn immer über nicht gruppierte Indizes auf Daten zugegriffen wird und die RID kleiner als der Schlüssel eines gruppierten Indexes ist.Sometimes data professionals also use heaps when data is always accessed through nonclustered indexes, and the RID is smaller than a clustered index key.

Wenn eine Tabelle ein Heap ist und nicht über nicht gruppierte Indizes verfügt, muss die gesamte Tabelle gelesen werden (mit einem Tabellenscan), um eine Zeile zu finden.If a table is a heap and does not have any nonclustered indexes, then the entire table must be read (a table scan) to find any row. SQL ServerSQL Server kann die RID nicht direkt auf dem Heap suchen.cannot seek a RID directly on the heap. Dies kann akzeptabel sein, wenn die Tabelle klein ist.This can be acceptable when the table is small.

Keine Verwendungsbereiche für HeapsWhen Not to Use a Heap

Verwenden Sie keinen Heap, wenn die Daten häufig in einer sortierten Reihenfolge zurückgegeben werden.Do not use a heap when the data is frequently returned in a sorted order. Mit einem gruppierten Index für die Sortierspalte kann der Sortiervorgang vermieden werden.A clustered index on the sorting column could avoid the sorting operation.

Verwenden Sie keinen Heap, wenn die Daten häufig zusammen gruppiert werden.Do not use a heap when the data is frequently grouped together. Daten müssen vor dem Gruppieren sortiert werden, und ein gruppierter Index für die Sortierspalte kann den Sortiervorgang vermeiden.Data must be sorted before it is grouped, and a clustered index on the sorting column could avoid the sorting operation.

Verwenden Sie keinen Heap, wenn häufig Datenbereiche aus der Tabelle abgefragt werden.Do not use a heap when ranges of data are frequently queried from the table. Mit einem gruppierten Index für die Bereichsspalte kann der Sortiervorgang für den gesamten Heap vermieden werden.A clustered index on the range column will avoid sorting the entire heap.

Verwenden Sie keinen Heap, wenn keine nicht gruppierten Indizes vorliegen und die Tabelle groß ist, es sei denn, Sie planen, den gesamten Tabelleninhalt ohne festgelegte Reihenfolge zurückzugeben.Do not use a heap when there are no nonclustered indexes and the table is large, unless you intend to return the entire table content without any specified order. In einem Heap müssen alle Zeilen des Heaps gelesen werden, um eine Zeile zu finden.In a heap, all rows of the heap must be read to find any row.

Verwenden Sie keinen Heap, wenn die Daten regelmäßig aktualisiert werden.Do not use a heap if the data is frequently updated. Wenn Sie einen Datensatz aktualisieren und dafür mehr Speicherplatz in den Datenseiten benötigen, als diese derzeit verwenden, muss der Datensatz auf eine Datenseite verschoben werden, die über ausreichend freien Speicherplatz verfügt.If you update a record and the update uses more space in the data pages than they are currently using, the record has to be moved to a data page that has enough free space. Dadurch wird ein weitergeleiteter Datensatz erstellt, der auf den neuen Speicherort der Daten verweist, und ein weiterleitender Zeiger muss in die Seite geschrieben werden, die die Daten zuvor enthalten hat, um den neuen physischen Ort anzugeben.This creates a forwarded record pointing to the new location of the data, and forwarding pointer has to be written in the page that held that data previously, to indicate the new physical location. Dies führt zu Fragmentierung im Heap.This introduces fragmentation in the heap. Beim Scannen eines Heaps muss diesen Zeigern gefolgt werden, was die Leistung beim Vorauslesen einschränkt und zu zusätzlichen E/A-Vorgängen führen kann, wodurch wiederum die Leistung des Scans reduziert wird.When scanning a heap, these pointers must be followed which limits read-ahead performance, and can incur additional I/O which reduces scan performance.

Verwalten von HeapsManaging Heaps

Erstellen Sie zum Anlegen eines Heaps eine Tabelle ohne gruppierten Index.To create a heap, create a table without a clustered index. Alternativ dazu können Sie den gruppierten Index löschen, wenn die Tabelle bereits über einen gruppierten Index verfügt, damit die Tabelle wieder ein Heap ist.If a table already has a clustered index, drop the clustered index to return the table to a heap.

Erstellen Sie zum Löschen eines Heaps auf dem Heap einen gruppierten Index.To remove a heap, create a clustered index on the heap.

So erstellen Sie einen Heap neu, um nicht verwendeten Speicherplatz freizugeben:To rebuild a heap to reclaim wasted space:

  • Erstellen Sie auf dem Heap einen gruppierten Index, und löschen Sie den ihn dann wieder.Create a clustered index on the heap, and then drop that clustered index.
  • Verwenden Sie den Befehl ALTER TABLE ... REBUILD, um den Heap neu zu erstellen.Use the ALTER TABLE ... REBUILD command to rebuild the heap.

Warnung

Das Erstellen oder Löschen von gruppierten Indizes erfordert, dass die gesamte Tabelle neue geschrieben werden muss.Creating or dropping clustered indexes requires rewriting the entire table. Wenn die Tabelle über nicht gruppierte Indizes verfügt, müssen alle nicht gruppierten Indizes immer dann neu erstellt werden, wenn der gruppierte Index geändert wird.If the table has nonclustered indexes, all the nonclustered indexes must all be recreated whenever the clustered index is changed. Aus diesem Grund kann es sehr lange dauern, von einem Heap zu einem gruppierten Index zu wechseln und umgekehrt, sowie viel Festplattenspeicher zum Neuordnen der Daten in tempdb erfordern.Therefore, changing from a heap to a clustered index structure or back can take a lot of time and require disk space for reordering data in tempdb.

HeapstrukturenHeap Structures

Ein Heap ist eine Tabelle ohne gruppierten Index.A heap is a table without a clustered index. Heaps haben eine Zeile in sys.partitions, mit index_id = 0 für jede vom Heap verwendete Partition.Heaps have one row in sys.partitions, with index_id = 0 for each partition used by the heap. Standardmäßig verfügt ein Heap über eine einzelne Partition.By default, a heap has a single partition. Wenn ein Heap über mehrere Partitionen verfügt, hat jede Partition eine Heapstruktur, in der die Daten für die jeweilige Partition enthalten sind.When a heap has multiple partitions, each partition has a heap structure that contains the data for that specific partition. Wenn ein Heap z. B. über vier Partitionen verfügt, gibt es vier Heapstrukturen – jeweils eine in jeder Partition.For example, if a heap has four partitions, there are four heap structures; one in each partition.

Je nach den im Heap enthaltenen Datentypen weist jede Heapstruktur eine oder mehrere Zuordnungseinheiten auf, um die Daten für eine bestimmte Partition zu speichern und zu verwalten.Depending on the data types in the heap, each heap structure will have one or more allocation units to store and manage the data for a specific partition. Zumindest verfügt jeder Heap über eine IN_ROW_DATA -Zuordnungseinheit pro Partition.At a minimum, each heap will have one IN_ROW_DATA allocation unit per partition. Der Heap hat außerdem eine LOB_DATA -Zuordnungseinheit pro Partition, wenn diese LOB-Spalten (Large OBject) enthält.The heap will also have one LOB_DATA allocation unit per partition, if it contains large object (LOB) columns. Außerdem ist eine ROW_OVERFLOW_DATA -Zuordnungseinheit pro Partition vorhanden, wenn der Index Spalten variabler Länge aufweist, die die Zeilengrößenbegrenzung von 8.060 Byte übersteigen.It will also have one ROW_OVERFLOW_DATA allocation unit per partition, if it contains variable length columns that exceed the 8,060 byte row size limit.

Die Spalte first_iam_page in der Systemsicht sys.system_internals_allocation_units verweist auf die erste IAM-Seite in der Kette der IAM-Seiten, die den Speicherplatz auf dem Heap in einer bestimmten Partition verwalten.The column first_iam_page in the sys.system_internals_allocation_units system view points to the first IAM page in the chain of IAM pages that manage the space allocated to the heap in a specific partition. SQL ServerSQL Server verwendet die IAM-Seiten, um den Heap zu durchlaufen.uses the IAM pages to move through the heap. Die Datenseiten und die Zeilen innerhalb eines Heaps weisen keine bestimmte Reihenfolge auf und sind nicht verknüpft.The data pages and the rows within them are not in any specific order and are not linked. Die einzige logische Verbindung zwischen den Datenseiten sind die Informationen, die auf den IAM-Seiten aufgezeichnet sind.The only logical connection between data pages is the information recorded in the IAM pages.

Wichtig

Die Systemsicht sys.system_internals_allocation_units ist nur für die interne Verwendung von SQL ServerSQL Server vorgesehen.The sys.system_internals_allocation_units system view is reserved for SQL ServerSQL Server internal use only. Zukünftige Kompatibilität wird nicht sichergestellt.Future compatibility is not guaranteed.

Tabellenscans oder serielle Lesevorgänge in einem Heap können durchgeführt werden, indem die IAM-Seiten gescannt werden, um auf diese Weise die Blöcke zu ermitteln, die Seiten des Heaps enthalten.Table scans or serial reads of a heap can be performed by scanning the IAM pages to find the extents that are holding pages for the heap. Da die IAM die Blöcke in derselben Reihenfolge darstellt, in der sie in der Datendatei vorliegen, werden serielle Heapscans immer sequenziell durch jede Datei ausgeführt.Because the IAM represents extents in the same order that they exist in the data files, this means that serial heap scans progress sequentially through each file. Das Verwenden der IAM-Seiten zum Festlegen der Scanfolge bedeutet weiterhin, dass Zeilen aus dem Heap nicht notwendigerweise in der Reihenfolge zurückgegeben werden, in der sie eingefügt wurden.Using the IAM pages to set the scan sequence also means that rows from the heap are not typically returned in the order in which they were inserted.

Die folgende Abbildung zeigt, wie in SQL Server-Datenbank-EngineSQL Server Database Engine die IAM-Seiten zum Abrufen von Datenzeilen in einem Heap mit einer einzelnen Partition verwendet werden.The following illustration shows how the SQL Server-Datenbank-EngineSQL Server Database Engine uses IAM pages to retrieve data rows in a single partition heap.

iam_heap

CREATE INDEX (Transact-SQL) CREATE INDEX (Transact-SQL)
DROP INDEX (Transact-SQL) DROP INDEX (Transact-SQL)
Beschreibung von gruppierten und nicht gruppierten IndizesClustered and Nonclustered Indexes Described