Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
Een heap is een tabel zonder een geclusterde index. Een of meer niet-geclusterde indexen kunnen worden gemaakt op tabellen die zijn opgeslagen als een heap. Gegevens worden opgeslagen in de heap zonder een order op te geven. Meestal worden gegevens in eerste instantie opgeslagen in de volgorde waarin de rijen worden ingevoegd. De Database Engine kan echter gegevens binnen de heap verplaatsen om de rijen efficiënt op te slaan. In queryresultaten kan de gegevensvolgorde niet worden voorspeld. Gebruik de ORDER BY component om de volgorde van rijen te garanderen die worden geretourneerd door een heap. Als u een permanente logische volgorde wilt opgeven voor het opslaan van de rijen, maakt u een geclusterde index in de tabel, zodat de tabel geen heap is.
Note
Er zijn soms goede redenen om een tabel als een heap te laten in plaats van een geclusterde index te maken, maar het effectief gebruiken van heaps vereist een geavanceerde vaardigheid. De meeste tabellen moeten een zorgvuldig gekozen geclusterde index hebben, tenzij er een goede reden bestaat om de tabel als heap te behouden.
Wanneer een heap gebruiken
Een heap is ideaal voor tabellen die vaak worden afgekapt en opnieuw worden geladen. De database-engine optimaliseert geheugen in een heap door eerst de beschikbare ruimte te vullen.
Houd rekening met het volgende:
- Het vinden van vrije ruimte in een heap kan tijdrovend zijn, vooral als er veel verwijderingen of updates hebben plaatsgevonden.
- Geclusterde indexen bieden stabiele prestaties voor tabellen die niet vaak worden afgekapt.
Voor tabellen die regelmatig worden afgekapt of opnieuw worden gemaakt, zoals tijdelijke of opslagtabellen, is het vaak efficiënter om een heap te gebruiken.
De keuze tussen het gebruik van een heap en een geclusterde index kan de prestaties en efficiëntie van uw database aanzienlijk beïnvloeden.
Wanneer een tabel wordt opgeslagen als een heap, worden afzonderlijke rijen geïdentificeerd met een verwijzing naar een 8-byterij-id (RID) die bestaat uit het bestandsnummer, het gegevenspaginanummer en de sleuf op de pagina (FileID:PageID:SlotID). De rij-ID is een kleine en efficiënte structuur.
Heaps kunnen worden gebruikt als tussentabellen voor grote, ongeordende invoegbewerkingen. Omdat gegevens worden ingevoegd zonder een strikte volgorde af te dwingen, is de invoegbewerking meestal sneller dan de equivalente invoegbewerking in een geclusterde index. Als de gegevens van de heap worden gelezen en verwerkt in een eindbestemming, kan het handig zijn om een smalle niet-geclusterde index te maken die betrekking heeft op het zoekpredicaat dat door de query wordt gebruikt.
Note
Gegevens worden opgehaald uit een heap in volgorde van gegevenspagina's, maar niet noodzakelijkerwijs de volgorde waarin gegevens zijn ingevoegd.
Soms gebruiken gegevensprofessionals ook heaps wanneer gegevens altijd worden geopend via niet-geclusterde indexen en de RID kleiner is dan een geclusterde indexsleutel.
Als een tabel een heap is en geen niet-geclusterde indexen heeft, moet de hele tabel worden gelezen (een tabelscan) om een rij te vinden. SQL Server kan geen RID rechtstreeks op de heap zoeken. Dit gedrag kan acceptabel zijn wanneer de tabel klein is.
Wanneer u geen heap gebruikt
Gebruik geen heap als de gegevens vaak in gesorteerde volgorde moeten worden geretourneerd. Een geclusterde index in de sorteerkolom kan de sorteerbewerking voorkomen.
Gebruik geen heap wanneer de gegevens vaak worden gegroepeerd. Gegevens moeten worden gesorteerd voordat ze worden gegroepeerd en een geclusterde index in de sorteerkolom kan de sorteerbewerking voorkomen.
Gebruik geen heap wanneer gegevensbereiken vaak vanuit de tabel worden opgevraagd. Een geclusterde index op de bereikkolom voorkomt het sorteren van de hele heap.
Gebruik geen heap als er geen niet-geclusterde indexen zijn en de tabel groot is. De enige toepassing voor dit ontwerp is het retourneren van de volledige inhoud van de tabel zonder opgegeven volgorde. In een heap leest de Database Engine alle rijen om willekeurige rijen te vinden.
Gebruik geen heap als de gegevens regelmatig worden bijgewerkt. Als u een record bijwerkt en de update meer ruimte in de gegevenspagina's gebruikt dan ze momenteel gebruiken, moet de record worden verplaatst naar een gegevenspagina met voldoende vrije ruimte. Hiermee maakt u een doorgestuurde record die verwijst naar de nieuwe locatie van de gegevens en moet de doorsturende aanwijzer worden geschreven op de pagina waarin die gegevens eerder zijn opgeslagen, om de nieuwe fysieke locatie aan te geven. Dit introduceert fragmentatie in de heap. Wanneer de Database Engine een heap scant, volgt deze pointers. Deze actie beperkt de prestaties van vooruit lezen en kan zorgen voor extra I/O, waardoor de scanprestaties worden verminderd.
Heaps beheren
Als u een heap wilt maken, maakt u een tabel zonder een geclusterde index. Als een tabel al een geclusterde index heeft, zet u de geclusterde index neer om de tabel terug te zetten naar een heap.
Als u een heap wilt verwijderen, maakt u een geclusterde index op de heap.
Een heap herbouwen om verspilde ruimte vrij te maken:
- Maak een geclusterde index op de heap en verwijder die geclusterde index.
- Gebruik de
ALTER TABLE ... REBUILDopdracht om de heap opnieuw te bouwen.
Warning
Voor het maken of verwijderen van geclusterde indexen moet de hele tabel opnieuw worden geschreven. Als de tabel niet-geclusterde indexen bevat, moeten alle niet-geclusterde indexen opnieuw worden gemaakt wanneer de geclusterde index wordt gewijzigd. Het wijzigen van een heap in een geclusterde indexstructuur of terug kan daarom veel tijd in beslag nemen en schijfruimte vereisen voor het opnieuw ordenen van gegevens in tempdb.
Heaps identificeren
De volgende query retourneert een lijst van heaps uit de huidige database. De lijst bevat:
- Tabelnamen
- Schemanamen
- Aantal rijen
- Tabelgrootte in kB
- Indexgrootte in kB
- Ongebruikte ruimte
- Een kolom om een heap te identificeren
SELECT t.name AS 'Your TableName',
s.name AS 'Your SchemaName',
p.rows AS 'Number of Rows in Your Table',
SUM(a.total_pages) * 8 AS 'Total Space of Your Table (KB)',
SUM(a.used_pages) * 8 AS 'Used Space of Your Table (KB)',
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS 'Unused Space of Your Table (KB)',
CASE
WHEN i.index_id = 0
THEN 'Yes'
ELSE 'No'
END AS 'Is Your Table a Heap?'
FROM sys.tables t
INNER JOIN sys.indexes i
ON t.object_id = i.object_id
INNER JOIN sys.partitions p
ON i.object_id = p.object_id
AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a
ON p.partition_id = a.container_id
LEFT JOIN sys.schemas s
ON t.schema_id = s.schema_id
WHERE i.index_id <= 1 -- 0 for Heap, 1 for Clustered Index
GROUP BY t.name,
s.name,
i.index_id,
p.rows
ORDER BY 'Your TableName';
Structuren van de heap
Een heap is een tabel zonder een geclusterde index. Heaps hebben één rij in sys.partitions, met index_id = 0 voor elke partitie die wordt gebruikt door de heap. Standaard heeft een heap één partitie. Wanneer een heap meerdere partities heeft, heeft elke partitie een heap-structuur die de gegevens voor die specifieke partitie bevat. Als een heap bijvoorbeeld vier partities heeft, zijn er vier heapstructuren; één in elke partitie.
Afhankelijk van de gegevenstypen in de heap heeft elke heap-structuur een of meer toewijzingseenheden voor het opslaan en beheren van de gegevens voor een specifieke partitie. Elke heap heeft minimaal één IN_ROW_DATA allocatie-eenheid per partitie. De heap heeft ook één LOB_DATA toewijzingseenheid per partitie, als deze grote objectkolommen (LOB) bevat. Het heeft ook één ROW_OVERFLOW_DATA toewijzingseenheid per partitie, als deze kolommen met een variabele lengte bevat die de limiet van 8.060 byterijen overschrijden.
De kolom first_iam_page in de sys.system_internals_allocation_units systeemweergave verwijst naar de eerste IAM-pagina in de keten van IAM-pagina's die de ruimte beheren die is toegewezen aan de heap in een specifieke partitie. SQL Server gebruikt de IAM-pagina's om door de heap te navigeren. De gegevenspagina's en de rijen erin bevinden zich niet in een specifieke volgorde en zijn niet gekoppeld. De enige logische verbinding tussen gegevenspagina's is de informatie die is vastgelegd op de IAM-pagina's.
Important
De sys.system_internals_allocation_units systeemweergave is alleen gereserveerd voor intern gebruik van SQL Server. Toekomstige compatibiliteit is niet gegarandeerd.
Tabelscans of seriële leesbewerkingen van een heap kunnen worden uitgevoerd door de IAM-pagina's te scannen om de gebieden te vinden die pagina's voor de heap bevatten. Omdat de IAM de extenties in dezelfde volgorde als in de gegevensbestanden vertegenwoordigt, betekent dit dat seriële heap-scans opeenvolgend door elk bestand voortgaan. Als u de IAM-pagina's gebruikt om de scanvolgorde in te stellen, betekent dit ook dat rijen van de heap doorgaans niet worden geretourneerd in de volgorde waarin ze zijn ingevoegd.
In de volgende afbeelding ziet u hoe de SQL Server Database Engine IAM-pagina's gebruikt om gegevensrijen op te halen in één partitie-heap.
Verwante inhoud
MAAK INDEX AAN (Transact-SQL)
DROPINDEX (Transact-SQL)
geclusterde en niet-geclusterde indexen beschreven