FIX: Parziale dei risultati in una query di un indice cluster columnstore in SQL Server 2014

IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l’obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 3067257
In questo articolo viene descritto un problema che si verifica durante una query di un indice cluster columnstore in Microsoft SQL Server 2014. In questo articolo vengono fornite una risoluzione a questo problema.
Sommario
Quando si utilizza una query che esegue la scansione un indice cluster columnstore in Microsoft SQL Server 2014, è possibile, in rare circostanze, ricevere risultati parziali.

Questo problema si verifica quando si esegue l'operazione seguente.
Passaggio 1
Un'istruzione Transact-SQL [INSERT o inserimento di massa] inserisce dati in una tabella con indice columnstore in cluster. Durante questa operazione, si applicano le seguenti condizioni:
  • Quando l'istruzione Transact-SQL raggiunge la soglia di rowgroup, consente di chiudere rowgroup R1 con segmento S1.
  • Segmento S1 punta al dizionario locale D1.
  • L'istruzione continua di inserire righe a nuova rowgroup R2.
  • Quando rowgroup R1 viene chiuso, il dizionario locale D1 non è presente essere chiuso. Se il dizionario D1 è ancora disponibile spazio, lasciare aperta e riutilizzarlo per il nuovo rowgroup R2.
Passaggio 2
Se l'istruzione Transact-SQL è terminata in modo anomalo o annullato prima che venga chiuso il nuovo rowgroup R2, si applicano le seguenti condizioni:
  • ColumnStore dei metadati di variazioni di sottotransazione riuscita commit indipendentemente dalla transazione esterna.
  • A questo punto, rowgroup che R1 persiste nella tabella di sistema in un "in fase di allestimento" o lo stato di INVISIBILE e segmento S1 fa riferimento a dizionario D1.
  • Non sono presenti righe create nella tabella di sistema per il dizionario D1. Infatti, l'istruzione Transact-SQL non è mai possibile chiudere la riga esistente. Di conseguenza, la riga esistente viene mantenuto.
Passaggio 3
In una situazione tipica, se l'attività in background mover tupla viene avviato al termine dell'istruzione Transact-SQL, l'attività in background consente di rimuovere il rowgroup invisibile R1 e il segmento S1. Se una nuova istruzione Transact-SQL è iniziata ora e crea rowgroup R3 con un nuovo segmento S3 che richiede un nuovo dizionario locale, è possibile riutilizzare l'ID interno del dizionario D1. Infatti, lo stato in memoria della columnstore tiene traccia del dizionario ID utilizzati. Pertanto, il segmento S3 farà riferimento a nuovo dizionario D2.

Nota La condizione in questo passaggio è una condizione comune. Pertanto, si verifica alcun danno.
Passaggio 4
Se SQL Server perde lo stato in memoria del dizionario D1 prima l'attività di mover tupla ha effetto (e le prestazioni come descritto nel passaggio 3), si verifica il problema descritto in questo articolo.

Note
  • Questo evento si verifica per uno dei seguenti motivi:
    • SQL Server verifica overload di memoria e il contenuto in memoria del dizionario D1 viene rimosso dalla memoria.
    • L'istanza di SQL Server viene riavviato.
    • Il database che contiene l'indice cluster columnstore non è in linea e quindi ritorna in linea.
  • Dopo uno di questi eventi si verificano e SQL Server consente di ricaricare le strutture in memoria, non sono presenti record che un dizionario D1 e interno ID esistente. Infatti, non è stata conservata la dizionario D1 nelle tabelle di sistema quando l'istruzione Transact-SQL è stata chiusa o conceled.
  • Se l'attività in background mover tupla inizia a questo punto, non si verificano errori perché si applicano le condizioni descritte nel passaggio 3.
  • Se prima dell'avvio attività in background mover tupla (per il punto precedente), viene creato un nuovo rowgroup R3, SQL Server viene assegnato lo stesso ID interno nuovo dizionario D1 e fa riferimento a dizionario D1 per segmento S3 rowgroup R3.
  • Quando l'attività in background mover tupla inizia dopo l'azione precedente, la quantità scende invisibile rowgroup R1 e i relativi segmenti S1 con nuovo dizionario D1. Ciò si verifica perché l'utilità di spostamento tupla considera tale nuovo dizionario D1 e del dizionario originale D1 che S1 riferimenti sono uguali.

    Nota Quando si verifica questa condizione, è possibile eseguire una query il contenuto di rowgroup R3.
Risoluzione
Il problema è stato innanzitutto corretto nei seguenti aggiornamenti cumulativi per SQL Server:


La correzione di questo problema è incluso anche negli aggiornamenti di versione (GDR) distribuzione generale seguente:

Aggiornamento della protezione per SQL Server 2014 QFE
Questo aggiornamento include gli aggiornamenti di protezione necessari MS15-058, questa correzione importante e 8 aggiornamento cumulativo.

Aggiornamento della protezione per SQL Server 2014 GDR
Questo aggiornamento comprende questo importante aggiornamento e correzioni per la protezione cumulativa tramite MS15-058.

Aggiornamento non correlato alla protezione per SQL Server Service Pack 1 per 2014 GDR
Questo aggiornamento include solo questa correzione importante.

Informazioni sugli aggiornamenti cumulativi per SQL Server

Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutti gli hotfix e tutte le correzioni di protezione che sono stati incluse nell'aggiornamento cumulativo precedente. Vedere aggiornamenti cumulativi per SQL Server:
Informazioni

Messaggi di errore

In un database attualmente interessato, se si esegue DBCC CHECKDB dopo avere applicato questa correzione, viene visualizzato il seguente messaggio di errore:
Msg 5289, livello 16, stato 1, riga 1
Cluster columnstore di indice 'ICC' tabella ' T' ' ha uno o più valori di dati che non corrispondono a valori di dati in un dizionario. Ripristinare i dati da un backup.

In un database attualmente interessato, quando si esegue una query che consente di analizzare le tabelle interessate dopo avere applicato questa correzione, viene visualizzato il seguente messaggio di errore:
Msg 5288, livello 16, stato 1, riga 1
ColumnStore indice dispone di uno o più valori di dati che non corrispondono a valori di dati in un dizionario. Per ulteriori informazioni, eseguire DBCC CHECKDB.

Se si ricevono questi errori, è possibile salvare i dati non danneggiati dalla massa, esportare i dati delle colonne/rowgroups interessata e quindi ricaricare i dati dopo la creazione dell'indice cluster columnstore o drop. È consigliabile attivare il flag di traccia 10207 eliminare l'errore 5288 e ripristinare il comportamento precedente di rowgroups danneggiato verrà ignorato.

Nota Vengono generati messaggi di errore 5288 e 5289 per questo rowgroup R3 con segmento S3. Flag di traccia 10207 viene utilizzato per estrarre i segmenti di rowgroup R3 non sono interessati dal dizionario manca D1.

Query di database interessati

Per determinare se il database che contiene gli indici di columnstore è già interessato 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 ogni database che contiene gli indici di columnstore sul server che esegue SQL Server. Un set di risultati vuoto indica che il database non è interessato.
  • Durante un periodo di esecuzione della query quando non esiste alcuna attività che creano rowgroups nuovo o modificare lo stato di rowgroups esistente. Ad esempio, le seguenti attività possono modificare lo stato di rowgroups: creazione dell'indice, indice riorganizza, l'inserimento di massa, mover tupla compressione delta archivi.

    Prima di eseguire la query è possibile disattivare l'attività in background tupla mover utilizzando il flag di traccia 634. Utilizzare questo comando per disattivare l'attività in background: DBCC TRACEON (634, -1). Al termine della query in esecuzione, ricordarsi di riattivare l'attività in background utilizzando il comando: DBCC TRACEOFF (634, -1).

    Assicurarsi inoltre che non sono disponibili comandi BULK INSERT/BCP/SELECT-nell'inserimento dei dati in tabelle che utilizzano l'indice di columnstore durante l'esecuzione di questa query.

    Si consiglia di utilizzare questa procedura per impedire che la query restituisca i falsi positivi.
Status
Microsoft ha confermato che questo è un problema nei prodotti Microsoft elencati nella sezione "Si applica a".

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 3067257 - Ultima revisione: 07/23/2015 02:39:00 - Revisione: 3.0

Microsoft SQL Server 2014 Service Pack 1, Microsoft SQL Server 2014 Developer, Microsoft SQL Server 2014 Enterprise, Microsoft SQL Server 2014 Standard

  • kbqfe kbsurveynew kbexpertiseadvanced kbfix kbmt KB3067257 KbMtit
Feedback