Sintomi
Si supponga di aggiungere una colonna a una tabella in Microsoft SQL Server 2012 o SQL Server 2014. Quando la dimensione della riga è vicina alla dimensione massima consentita che è di 8.060 byte, l'operazione di aggiunta può richiedere molto tempo.
Causa
Il problema si verifica perché, quando la dimensione totale della riga è vicina alla dimensione massima consentita, SQL Server esegue un'analisi completa della tabella per verificare che l'aggiunta di una nuova colonna non violi l'integrità dei dati. Le versioni precedenti a SQL Server 2012 non eseguono questo controllo e il linguaggio DDL (Data Definition Language) viene eseguito più rapidamente. Tuttavia, questo comportamento genera l'errore delle operazioni successive, ad esempio l'aggiornamento delle righe o la riduzione delle dimensioni delle righe, se la dimensione della riga supera quella consentita.
Risoluzione
L'aggiornamento cumulativo introduce un nuovo flag di traccia 647 per il comportamento di compatibilità con le versioni precedenti. Il problema è stato risolto per la prima volta nel seguente aggiornamento cumulativo di SQL Server.
Aggiornamento cumulativo 5 per SQL Server 2014 /en-us/help/3011055
Aggiornamento cumulativo 12 per SQL Server 2012 SP1 /en-us/help/2991533
Aggiornamento cumulativo 2 per SQL Server 2012 SP2 /en-us/help/2983175
Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutti gli hotfix e tutti gli aggiornamenti della sicurezza inclusi nell'aggiornamento cumulativo precedente. Vedere gli ultimi aggiornamenti cumulativi per SQL Server:
Ulteriori informazioni
-
Puoi attivare il contrassegno di traccia 647 usando il parametro Startup. Per informazioni, vedere Opzioni di avvio del servizio motore di database.
-
Puoi eseguire la query seguente (Sostituisci <nome tabella> con il nome di tabella effettivo) per testare la tabella specifica prima dell'operazione in un sistema di produzione e pianificare l'effetto del problema. Se il risultato è maggiore di 8.060, la tabella è soggetta al problema. Inoltre, se sono state eliminate colonne, è necessario modificare la tabella con l'opzione Rigenera. La ricostruzione della tabella può rendere la query restituire risultati corretti.
select 1+1+2 + 2 + (case when sum (case when leaf_offset < 0 then 1 else 0 end) > 0 then 2 else 0 end) + ( (count (*) + 7)/8 ) + count (case when leaf_offset < 0 then 1 else null end) * 2 + sum( case when max_length=-1 then 24 else max_length end) from sys.system_internals_partition_columns col join sys.partitions par on col.partition_id = par.partition_id where object_id = object_id ('<table name>') and index_id in (0,1) and partition_number =1
-
È possibile valutare l'aggiunta di colonne di lunghezza variabile o colonne di tipo sparse quando l'applicazione aggiunge di frequente nuove colonne alla tabella. Si tratta di un'operazione solo per i metadati, anche se la dimensione totale di tutte le colonne supera i 8.060 byte.
Stato
Microsoft ha confermato che questo problema si verifica nei prodotti elencati nella sezione "Si applica a".