Heap (tabelle senza indici cluster)Heaps (Tables without Clustered Indexes)

In questo argomento si applica a: SìSQL ServerSìDatabase SQL di AzurenonAzure SQL Data Warehouse non Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Un heap è una tabella per cui non è disponibile un indice cluster.A heap is a table without a clustered index. Nelle tabelle archiviate come heap è possibile creare uno o più indici non cluster.One or more nonclustered indexes can be created on tables stored as a heap. I dati vengono archiviati nell'heap senza un ordine specificato.Data is stored in the heap without specifying an order. In genere i dati vengono inizialmente archiviati nell'ordine in cui le righe vengono inserite nella tabella, tuttavia Motore di databaseDatabase Engine può spostare i dati nell'heap in modo da archiviare le righe in modo efficiente, pertanto non è possibile prevedere l'ordine dei dati.Usually data is initially stored in the order in which is the rows are inserted into the table, but the Motore di databaseDatabase Engine can move data around in the heap to store the rows efficiently; so the data order cannot be predicted. Per garantire l'ordine delle righe restituite da un heap, è necessario utilizzare la clausola ORDER BY .To guarantee the order of rows returned from a heap, you must use the ORDER BY clause. Per specificare l'ordine di archiviazione delle righe, creare un indice cluster nella tabella, in modo che essa non sia un heap.To specify the order for storage of the rows, create a clustered index on the table, so that the table is not a heap.

Nota

Esistono talvolta motivi per i quali è preferibile lasciare una tabella come heap invece di creare un indice cluster, tuttavia l'utilizzo efficiente degli heap richiede competenze avanzate.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. Alla maggior parte delle tabelle deve essere associato un indice cluster selezionato con attenzione a meno che non sussista un motivo valido per cui la tabella debba rimanere un heap.Most tables should have a carefully chosen clustered index unless a good reason exists for leaving the table as a heap.

Quando utilizzare un heapWhen to Use a Heap

Se una tabella è un heap e non dispone di indici non cluster, per individuare qualsiasi riga è necessario esaminare l'intera tabella (analisi della tabella).If a table is a heap and does not have any nonclustered indexes, then the entire table must be examined (a table scan) to find any row. Ciò può risultare accettabile in caso di tabelle di piccole dimensioni, ad esempio un elenco di 12 sedi locali di una società.This can be acceptable when the table is tiny, such as a list of the 12 regional offices of a company.

Quando si archivia una tabella come heap, le singole righe sono identificate mediante il riferimento a un identificatore di riga (RID) costituito dal numero del file, dal numero della pagina di dati e dallo slot nella pagina.When a table is stored as a heap, individual rows are identified by reference to a row identifier (RID) consisting of the file number, data page number, and slot on the page. L'ID della riga è una struttura piccola ed efficiente.The row id is a small and efficient structure. Talvolta gli architetti specializzati utilizzano gli heap quando l'accesso ai dati avviene sempre tramite indici non cluster e il RID risulta più piccolo di una chiave di indice cluster.Sometimes data architects use heaps when data is always accessed through nonclustered indexes and the RID is smaller than a clustered index key.

Quando non utilizzare un heapWhen Not to Use a Heap

Non utilizzare un heap quando i dati vengono restituiti di frequente con un ordinamento.Do not use a heap when the data is frequently returned in a sorted order. Un indice cluster nella colonna di ordinamento può evitare l'esecuzione dell'operazione di ordinamento.A clustered index on the sorting column could avoid the sorting operation.

Non utilizzare un heap quando i dati vengono spesso raggruppati insieme.Do not use a heap when the data is frequently grouped together. I dati devono essere ordinati prima di essere raggruppati, pertanto un indice cluster nella colonna di ordinamento può evitare l'esecuzione dell'operazione di ordinamento.Data must be sorted before it is grouped, and a clustered index on the sorting column could avoid the sorting operation.

Non utilizzare un heap quando si eseguono spesso query su intervalli di dati della tabella.Do not use a heap when ranges of data are frequently queried from the table. Un indice cluster nella colonna dell'intervallo evita la necessità di ordinare l'intero heap.A clustered index on the range column will avoid sorting the entire heap.

Non utilizzare un heap quando non sono presenti indici non cluster e la tabella è di grandi dimensioni.Do not use a heap when there are no nonclustered indexes and the table is large. Per individuare qualsiasi riga in un heap, è necessario leggerne tutte le righe.In a heap, all rows of the heap must be read to find any row.

Gestione di heapManaging Heaps

Per creare un heap, creare una tabella senza un indice cluster.To create a heap, create a table without a clustered index. Se la tabella dispone già di un indice cluster, rimuoverlo per restituire la tabella a un heap.If a table already has a clustered index, drop the clustered index to return the table to a heap.

Per rimuovere un heap, creare un indice cluster nell'heap.To remove a heap, create a clustered index on the heap.

Per ricompilare un heap in modo da recuperare spazio sprecato, creare un indice cluster nell'heap, quindi rimuovere quell'indice.To rebuild a heap to reclaim wasted space, create a clustered index on the heap, and then drop that clustered index.

Avviso

Per la creazione o la rimozione di indici cluster è richiesta la riscrittura dell'intera tabella.Creating or dropping clustered indexes requires rewriting the entire table. Se la tabella dispone di indici non cluster, è necessario ricrearli tutti ogni volta che l'indice cluster viene modificato.If the table has nonclustered indexes, all the nonclustered indexes must all be recreated whenever the clustered index is changed. Pertanto, il passaggio da un heap a una struttura di indice cluster o viceversa può richiedere molto tempo e spazio su disco per riordinare i dati in tempdb.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.

Struttura degli heapHeap Structures

Un heap è una tabella per cui non è disponibile un indice cluster.A heap is a table without a clustered index. Agli heap corrisponde una riga in sys.partitionscon index_id = 0 per ogni partizione usata dall'heap.Heaps have one row in sys.partitions, with index_id = 0 for each partition used by the heap. Per impostazione predefinita, a ogni heap è associata una singola partizione.By default, a heap has a single partition. Se a un heap sono associate più partizioni, ognuna di esse ha una struttura di heap contenente i dati per la partizione specifica.When a heap has multiple partitions, each partition has a heap structure that contains the data for that specific partition. Ad esempio, se a un heap sono associate quattro partizioni, saranno presenti quattro strutture di heap, una per ogni partizione.For example, if a heap has four partitions, there are four heap structures; one in each partition.

A seconda dei tipi di dati dell'heap, ogni struttura di heap conterrà una o più unità di allocazione per l'archiviazione e la gestione dei dati di una partizione specifica.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. Ogni heap conterrà almeno un'unità di allocazione IN_ROW_DATA per partizioneAt a minimum, each heap will have one IN_ROW_DATA allocation unit per partition. e un'unità di allocazione LOB_DATA per partizione, se l'heap include colonne LOB (Large Object).The heap will also have one LOB_DATA allocation unit per partition, if it contains large object (LOB) columns. Conterrà anche un'unità di allocazione ROW_OVERFLOW_DATA per partizione, se include colonne a lunghezza variabile che superano il limite della lunghezza di riga di 8.060.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.

La colonna first_iam_page nella vista di sistema sys.system_internals_allocation_units punta alla prima pagina IAM nella catena di pagine IAM che gestiscono lo spazio allocato all'heap in una partizione specifica.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 Server usa le pagine IAM per spostarsi all'interno dell'heap.SQL Server uses the IAM pages to move through the heap. Le pagine di dati e le righe in esse incluse non sono disposte in base a un ordine specifico e non sono collegate tra loro.The data pages and the rows within them are not in any specific order and are not linked. L'unico collegamento logico tra le pagine di dati sono le informazioni registrate nelle pagine IAM.The only logical connection between data pages is the information recorded in the IAM pages.

Importante

La vista di sistema sys.system_internals_allocation_units è riservata per il solo uso interno a Microsoft SQL Server.The sys.system_internals_allocation_units system view is reserved for Microsoft SQL Server internal use only. Non è garantita la compatibilità con le versioni future.Future compatibility is not guaranteed.

Le analisi di tabella o le letture seriali dell'heap possono essere eseguite mediante l'analisi delle pagine IAM allo scopo di individuare gli extent che includono le pagine dell'heap.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. Poiché le pagine IAM rappresentano gli extent nello stesso ordine in cui sono disposti nel file di dati, le analisi seriali dell'heap vengono eseguite progressivamente in ogni file.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. Inoltre, se si imposta la sequenza di analisi tramite le pagine IAM, le righe dell'heap non vengono in genere restituite in base all'ordine in cui sono state inserite.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.

La figura seguente illustra l'uso delle pagine IAM nel motore di database di SQL Server per recuperare le righe di dati di un heap relativo a una singola partizione.The following illustration shows how the SQL 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)

Descrizione di indici cluster e non cluster.Clustered and Nonclustered Indexes Described