Dati di overflow della riga che superano 8 KB

Una tabella può contenere al massimo 8.060 byte per riga. In SQL Server 2008 questa restrizione non è assoluta per tabelle contenenti dati varchar, nvarchar, varbinary, sql_variant o colonne di tipo CLR definito dall'utente. Anche se la lunghezza di ogni colonna deve comunque rientrare nel limite di 8.000 byte, il valore combinato delle larghezze può essere superiore al limite di 8.060 byte. Questa restrizione si applica alle colonne varchar, nvarchar, varbinary, sql_variant o di tipo CLR definito dall'utente al momento della creazione e della modifica, anche nel caso di aggiornamento o inserimento di dati.

[!NOTA]

La restrizione non si applica invece alle colonne varchar(max), nvarchar(max), varbinary(max), ntext, text, image o xml. Per ulteriori informazioni sull'archiviazione di tali colonne, vedere Utilizzo di tipi di dati per valori di grandi dimensioni, Utilizzo dei dati di tipo text e image e Utilizzo di dati XML.

Considerazioni sull'overflow della riga

Quando si combinano colonne varchar, nvarchar, varbinary, sql_variant o di tipo CLR definito dall'utente che superano gli 8.060 byte per riga, tenere presente quanto segue:

  • Il superamento del limite di 8.060 byte per riga potrebbe influire sulle prestazioni in quanto in SQL Server viene comunque mantenuto il limite di 8 KB per pagina. Quando una combinazione di colonne varchar, nvarchar, varbinary, sql_variant o di tipo CLR definito dall'utente supera questo limite, in Motore di database di SQL Server la colonna del record con la larghezza maggiore viene spostata in un'altra pagina nell'unità di allocazione ROW_OVERFLOW_DATA, mentre nella pagina originale viene mantenuto un puntatore a 24 byte. Lo spostamento di record di grandi dimensioni in un'altra pagina avviene dinamicamente in quanto la lunghezza dei record dipende dalle operazioni di aggiornamento. In seguito a operazioni di aggiornamento che comportano una diminuzione della lunghezza dei record, i record possono venire spostati di nuovo nella pagina originale nell'unità di allocazione IN_ROW_DATA. L'esecuzione di query e di altre operazioni di selezione, ad esempio ordinamenti o join in record di grandi dimensioni contenenti dati di overflow della riga, comporta inoltre il rallentamento dei tempi di esecuzione, in quanto questi record vengono elaborati in modo sincrono anziché asincrono.

    Quando si progetta una tabella con più colonne varchar, nvarchar, varbinary, sql_variant o di tipo CLR definito dall'utente, valutare la percentuale di righe in cui probabilmente di verificherà un overflow e la frequenza con cui potrebbero venire eseguite query su questi dati di overflow. Se è probabile che verranno eseguite di frequente query su molte righe di dati di overflow della riga, valutare la possibilità di normalizzare la tabella in modo che alcune colonne vengano spostate in un'altra tabella. Sarà quindi possibile eseguire query in un'operazione JOIN asincrona.

  • La lunghezza delle singole colonne deve comunque rientrare nel limite di 8.000 byte per le colonne varchar, nvarchar, varbinary, sql_variant o di tipo CLR definito dall'utente. Solo le lunghezze combinate possono superare il limite di 8.060 byte per riga.

  • La somma delle colonne con altri tipi di dati, inclusi i dati char e nchar, deve rientrare nel limite di 8.060 byte per riga. Questo limite non vale inoltre per i dati di oggetti di grandi dimensioni.

  • La chiave di un indice cluster non può contenere colonne varchar per le quali sono presenti dati nell'unità di allocazione ROW_OVERFLOW_DATA. Se viene creato un indice cluster in una colonna varchar e i dati esistenti si trovano nell'unità di allocazione IN_ROW_DATA, le azioni di inserimento o aggiornamento successive eseguite nella colonna che comporterebbero lo spostamento dei dati all'esterno di righe non verranno eseguite correttamente. Per ulteriori informazioni sulle unità di allocazione, vedere Organizzazione di tabelle e indici.

  • È possibile includere colonne contenenti dati di overflow della riga come colonne chiave o non chiave di un indice non cluster.

  • Il limite per le dimensioni dei record per le tabelle che utilizzano colonne di tipo sparse è 8.018 byte. Quando i dati convertiti più i dati dei record esistenti superano 8.018 byte, viene restituito l'errore 576 MSSQLSERVER. Quando le colonne vengono convertite dal tipo sparse al tipo nonsparse e viceversa, il Motore di database mantiene una copia dei dati dei record correnti. In questo modo, lo spazio di archiviazione richiesto per il record viene temporaneamente raddoppiato.

  • Per ottenere informazioni sulle tabelle o gli indici che potrebbero contenere dati di overflow della riga, utilizzare la funzione a gestione dinamica sys.dm_db_index_physical_stats.