KB3067257-FIX: risultati parziali in una query di un indice columnstore raggruppato in SQL Server 2014

In questo articolo vengono illustrati i problemi che si verificano durante una query di un indice columnstore raggruppato in Microsoft SQL Server 2014. Questo articolo fornisce una soluzione a questo problema.

Riepilogo

Quando si usa una query che analizza un indice columnstore raggruppato in Microsoft SQL Server 2014, in rare condizioni, è possibile ricevere risultati parziali della query. Questo problema si verifica quando viene eseguita l'operazione seguente.

Passaggio 1

Un'istruzione Transact-SQL [INSERT o BULK-INSERT] inserisce i dati in una tabella con indice columnstore raggruppato. Durante questa operazione si applicano le condizioni seguenti:

  • Quando l'istruzione Transact-SQL raggiunge la soglia rowgroup, chiude rowgroup R1 con segmento S1.

  • Il segmento S1 punta al dizionario locale D1.

  • L'istruzione continua a inserire righe nel nuovo rowgroup R2.

  • Quando rowgroup R1 viene chiuso, anche il dizionario locale D1 non deve essere chiuso. Se il dizionario D1 contiene ancora spazio disponibile, è possibile lasciarlo aperto e riutilizzarlo per il nuovo rowgroup R2.

Passaggio 2

Se l'istruzione Transact-SQL viene terminata in modo anomalo o annullata prima di chiudere il nuovo rowgroup R2, si applicano le condizioni seguenti:

  • Le modifiche ai metadati columnstore si verificano nelle sottotransazioni che si commettono indipendentemente dalla transazione esterna.

  • A questo punto, rowgroup R1 persiste nella tabella di sistema in un "in costruzione" o in uno stato invisibile e fa riferimento al dizionario D1 del segmento S1.

  • Non è stata creata alcuna riga nella tabella di sistema per il dizionario D1. Il motivo è che l'istruzione Transact-SQL non ha mai l'opportunità di chiudere la riga esistente. Di conseguenza, la riga esistente persiste.

Passaggio 3

In una situazione tipica, se l'attività in background di tupla Mover viene avviata dopo la fine dell'istruzione Transact-SQL, l'attività in background rimuove l'Invisible rowgroup R1 e il segmento S1. Se è già stata avviata una nuova istruzione Transact-SQL e viene creato rowgroup R3 con un nuovo segmento S3 che richiede un nuovo dizionario locale, non è possibile riutilizzare l'ID interno del dizionario D1. Il motivo è che lo stato in memoria di columnstore tiene traccia degli ID del dizionario usati. Di conseguenza, il segmento S3 farà riferimento al nuovo dizionario D2.Nota La condizione in questo passaggio è una condizione comune. Non si verifica quindi alcun danneggiamento.

Passaggio 4

Se SQL Server perde lo stato in memoria del dizionario D1 prima che l'attività di creazione della tupla abbia effetto ed esegua come descritto nel passaggio 3, il problema descritto in questo articolo si verifica.Note

  • Questo evento si verifica per uno dei motivi seguenti:

    • L'overload della memoria delle esperienze di SQL Server e il contenuto in memoria di Dictionary D1 vengono rimossi dalla memoria.

    • Viene riavviata l'istanza di SQL Server.

    • Il database che contiene l'indice columnstore cluster passa offline e quindi torna online.

  • Dopo che si verifica uno di questi eventi e SQL Server ricarica le strutture in memoria, non esiste alcun record che esista un dizionario D1 e il relativo ID interno. Il motivo è che il dizionario D1 non è stato mantenuto nelle tabelle di sistema quando l'istruzione Transact-SQL è stata terminata o conceled.

  • Se l'attività in background di tupla Mover viene avviata a questo punto, non si verificano errori perché vengono applicate le condizioni descritte nel passaggio 3.

  • Se viene creato un nuovo rowgroup R3 prima che l'attività in background di tupla Mover venga avviata (per l'elemento punto elenco precedente), SQL Server assegna lo stesso ID interno al nuovo dizionario D1 e fa riferimento al dizionario D1 per il segmento S3 in rowgroup R3.

  • Quando l'attività in background di tupla Mover viene avviata dopo l'azione precedente, Elimina l'Invisible rowgroup R1 e i relativi segmenti S1 insieme al nuovo dizionario D1. Questo si verifica perché il Mover della tupla ritiene che il nuovo dizionario D1 e il dizionario originale D1 che i riferimenti S1 siano gli stessi.Nota Quando si verifica questa condizione, non è possibile eseguire query sul contenuto di rowgroup R3.

Risoluzione

Il problema è stato risolto per la prima volta nei seguenti aggiornamenti cumulativi per SQL Server:

Aggiornamento cumulativo 1 per SQL server 2014 SP1 aggiornamento cumulativo 8 per SQL Server 2014La correzione per questo problema è inclusa anche nei seguenti aggiornamenti della versione di distribuzione generale (GDR):

Aggiornamento della sicurezza per SQL Server 2014 QFE  Questo aggiornamento include l'aggiornamento cumulativo 8, questa correzione importante e gli aggiornamenti della sicurezza MS15-058 necessari.Aggiornamento della sicurezza per SQL Server 2014 GDR  Questo aggiornamento include questo importante Fix e le correzioni cumulative per la sicurezza tramite MS15-058.Aggiornamento di nonsecurity per SQL Server 2014 Service Pack 1 GDR  Questo aggiornamento include solo questa correzione importante.

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

Messaggi di erroreIn un database attualmente interessato, se si esegue DBCC CHECKDB dopo avere applicato questa correzione, viene visualizzato il messaggio di errore seguente:

Msg 5289, livello 16, stato 1, riga 1 l'indice columnstore raggruppato "CCI" nella tabella "t" contiene uno o più valori di dati che non corrispondono ai valori dei dati in un dizionario. Ripristinare i dati da un backup.

In un database attualmente interessato, quando si esegue una query che analizza le tabelle interessate dopo avere applicato questa correzione, viene visualizzato il messaggio di errore seguente:

Msg 5288, livello 16, stato 1, indice columnstore linea 1 ha uno o più valori di dati che non corrispondono ai valori dei dati in un dizionario. Eseguire DBCC CHECKDB per altre info.

Se si ricevono questi errori, è possibile salvare i dati non danneggiati eseguendo l'esportazione in blocco dei dati delle colonne/RowGroups non affette e quindi ricaricando i dati dopo l'eliminazione o la creazione dell'indice columnstore cluster. Dovresti abilitare il flag di traccia 10207 per eliminare l'errore 5288 e ripristinare il vecchio comportamento di omissione di RowGroups danneggiato. Nota I messaggi di errore 5288 e 5289 vengono generati per questo rowgroup R3 con segmento S3. Il flag di traccia 10207 viene usato per estrarre i segmenti di rowgroup R3 che non sono interessati dal dizionario D1 mancante.

Query per i database interessatiPer determinare se il database che contiene indici columnstore è già influenzato da questo problema, eseguire la query seguente:

select         object_name(i.object_id) as table_name,        i.name as index_name,        p.partition_number,        count(distinct s.segment_id) as damaged_rowgroups from        sys.indexes i        join sys.partitions p on p.object_id = i.object_id and p.index_id = i.index_id        join sys.column_store_row_groups g on g.object_id = i.object_id and g.index_id = i.index_id and g.partition_number = p.partition_number        join sys.column_store_segments s on s.partition_id = p.partition_id and s.segment_id = g.row_group_id where         i.type in (5, 6)        and s.secondary_dictionary_id <> -1         and g.state_description = 'COMPRESSED'        and s.secondary_dictionary_id not in        (               select dictionary_id from sys.column_store_dictionaries d               where d.hobt_id = p.hobt_id and d.column_id = s.column_id        ) group by         object_name(i.object_id),        i.name,        p.partition_number 

Note

  • È necessario eseguire questa query in tutti i database che contengono indici columnstore nel server che esegue SQL Server. Un set di risultati vuoto indica che il database non è interessato.

  • Esegui questa query durante un periodo in cui non ci sono attività che creeranno nuovi RowGroups o cambieranno lo stato di RowGroups esistente. Ad esempio, le attività seguenti possono modificare lo stato di RowGroups: index Build, INDEX REORGANIZE, BULK INSERT, Tuple Mover comprimendo gli archivi Delta. Prima di eseguire la query, è possibile disabilitare l'attività della tupla in background tramite il flag di traccia 634. Usare questo comando per disabilitare l'attività in background: DBCC TRACEON (634,-1). Al termine dell'esecuzione della query, ricordarsi di riabilitare l'attività in background usando il comando: DBCC TRACEOFF (634,-1). Verificare inoltre che non ci siano comandi BULK INSERT/BCP/SELECT-INTO per l'inserimento di dati nelle tabelle che usano l'indice columnstore durante l'esecuzione della query. È consigliabile usare questi passaggi per evitare che la query restituisca i falsi positivi.

Stato

Microsoft ha confermato che questo problema si verifica nei prodotti elencati nella sezione "Si applica a".

Serve aiuto?

Amplia le tue competenze
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa a Microsoft Insider

Queste informazioni sono risultate utili?

Grazie per il feedback!

Grazie per il tuo feedback! Potrebbe essere utile metterti in contatto con uno dei nostri operatori del supporto di Office.

×