REVISIÓN: Parcial da como resultado una consulta de un índice agrupado columnstore en 2014 de SQL Server

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 3067257
Este artículo describe un problema que se produce durante una consulta de un índice agrupado columnstore en 2014 de Microsoft SQL Server. Este artículo proporciona una resolución a este problema.
Resumen
Cuando se utiliza una consulta que recorre un índice agrupado columnstore en 2014 de Microsoft SQL Server, puede, en condiciones poco frecuentes, recibir resultados de la consulta parcial.

Este problema se produce cuando se ejecuta la operación siguiente.
Paso 1
Una instrucción de Transact-SQL [INSERT o INSERCIÓN masiva] inserta datos en una tabla que ha agrupado columnstore índice. Durante esta operación, se aplicarán las siguientes condiciones:
  • Cuando la instrucción Transact-SQL alcanza el umbral rowgroup, cierra rowgroup R1 con segmento S1.
  • El segmento S1 señala al diccionario local D1.
  • La instrucción continúa insertar filas nueva rowgroup R2.
  • Cuando se cierra rowgroup R1, el diccionario local D1 no tiene también se cierre. Si el diccionario D1 todavía tiene espacio disponible, puede dejarla abierta y volver a utilizar en el nuevo rowgroup R2.
Paso 2
Si la instrucción de Transact-SQL se terminó de forma anormal o se cancela antes de que cierre el nuevo rowgroup R2, se aplican las siguientes condiciones:
  • Cambios en los metadatos ColumnStore ocurren en subtransacciones que compromete independientemente de la transacción externa.
  • En este punto, rowgroup, que R1 se conserva en la tabla del sistema en un "en construcción" o estado INVISIBLE y segmento S1 referencias diccionario D1.
  • No hay ninguna fila creada en la tabla del sistema para diccionario de D1. Esto es porque la instrucción de Transact-SQL nunca tiene la oportunidad de cerrar la fila existente. Por lo tanto, se conserva la fila existente.
Paso 3
En una situación típica, si se inicia la tarea en segundo plano tupla mover después de que finaliza la instrucción de Transact-SQL, la tarea en segundo plano elimina el rowgroup invisible R1 y el segmento S1. Si una nueva instrucción de Transact-SQL se inicia ahora y crea rowgroup R3 que tiene un nuevo segmento S3 que requiere un nuevo diccionario local, no se puede reutilizar el identificador interno del diccionario D1. Esto es porque el estado de la memoria de la columnstore realiza un seguimiento de diccionario de identificadores que se utilizan. Por lo tanto, segmento S3 hará referencia el nuevo diccionario D2.

Nota: La condición de este paso es una condición común. Por lo tanto, se produce ningún daño.
Paso 4
Si SQL Server se pierde el estado de la memoria de diccionario D1 antes de que la tarea de mover tupla surte efecto (y se realiza como se describe en el paso 3), se produce el problema que se describe en este artículo.

Notas:
  • Este evento se produce para cualquiera de las siguientes razones:
    • SQL Server experimenta la sobrecarga de memoria y el contenido en memoria del diccionario D1 se desechen de la memoria.
    • La instancia de SQL Server se reinicia.
    • La base de datos que contiene el índice agrupado columnstore quede sin conexión y, a continuación, vuelve a estar conectado.
  • Después de cualquiera de estos eventos se producen y SQL Server vuelve a cargar las estructuras en memoria, no hay ningún registro que un diccionario D1 y su interno existía el ID. Esto es porque el diccionario D1 no se mantiene en las tablas del sistema cuando se terminó la instrucción de Transact-SQL o conceled.
  • Si la tarea en segundo plano mover tupla se inicia en este momento, no se producen errores porque se aplican las condiciones que se describen en el paso 3.
  • Si se crea un nuevo rowgroup R3 antes de que comience la tarea en segundo plano tupla mover (por el elemento de viñeta anterior), SQL Server asigna el mismo identificador interno para el nuevo diccionario D1 y que hace referencia el diccionario D1 para segmento S3 en rowgroup R3.
  • Cuando se inicia la tarea en segundo plano tupla mover después de la acción anterior, coloca rowgroup invisible R1 y sus segmentos S1 junto con el nuevo diccionario D1. Esto ocurre porque el movedor de tupla tiene en cuenta ese nuevo diccionario D1 y el diccionario original D1 que las referencias S1 son los mismos.

    Nota: Cuando se produce esta condición, no se puede consultar el contenido de rowgroup R3.
Solución
El problema se solucionó primero en las siguientes actualizaciones acumulativas de SQL Server:


La solución a este problema también se incluye en las siguientes actualizaciones de distribución general (GDR) de la versión:

Actualización de seguridad para QFE de SQL Server de 2014
Esta actualización incluye las actualizaciones de seguridad MS15-058, esta corrección importante y 8 de actualización acumulativa.

Actualización de seguridad para el RDA de SQL Server de 2014
Esta actualización incluye esta corrección importante y revisiones de seguridad acumulativas a través de MS15-058.

Actualización de otra índole para RDA de SQL Server Service Pack 1 de 2014
Esta actualización incluye sólo esta corrección importante.

Acerca de las actualizaciones acumulativas de SQL Server

Cada nueva actualización acumulativa para SQL Server contiene todas las revisiones y todas revisiones de la seguridad que se incluyeron en la actualización acumulativa anterior. Consulte las actualizaciones acumulativas más recientes para SQL Server:
Más información

Mensajes de error

En una base de datos está afectado si ejecuta DBCC CHECKDB después de aplicar esta revisión, recibirá mensaje de error siguiente:
Msj 5289, nivel 16, estado 1, línea 1
Índice agrupado columnstore 'cci' en la tabla ' t ' tiene uno o más valores de datos que no coinciden con los valores de datos en un diccionario. Restaurar los datos desde una copia de seguridad.

En una base de datos actualmente afectado al ejecutar una consulta que analiza las tablas afectadas después de aplicar esta revisión, recibirá el siguiente mensaje de error:
Msj 5288, nivel 16, estado 1, línea 1
Índice de ColumnStore tiene uno o más valores de datos que no coinciden con los valores de datos en un diccionario. Ejecute DBCC CHECKDB para obtener más información.

Si recibe estos errores, puede guardar los datos no dañados a granel, exportar los datos de las columnas/rowgroups afectadas y, a continuación, volver a cargar los datos después de crear el índice agrupado columnstore o colocar. Debe habilitar el indicador de traza 10207 suprimir el error 5288 y revertir al comportamiento anterior omitiendo rowgroups dañado.

Nota: Se generan mensajes de error 5288 y 5289 para este rowgroup R3 con segmento S3. El indicador de traza 10207 se utiliza para extraer los segmentos del rowgroup R3 que no se ven afectados por el diccionario falta D1.

Consulta de bases de datos afectadas

Para determinar si la base de datos que contiene los índices de columnstore ya está afectado por este problema, ejecute la siguiente consulta:
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 

Notas:
  • Debe ejecutar esta consulta en cada base de datos que contiene los índices de columnstore en el servidor que está ejecutando SQL Server. Un conjunto de resultados vacío indica que la base de datos no se vea afectado.
  • Ejecute esta consulta durante un período cuando no hay ninguna actividad que creará rowgroups nueva o cambiar el estado de rowgroups existente. Por ejemplo, las siguientes actividades pueden modificar el estado de rowgroups: generación de índice, reorganizar índice, inserción masiva, mover tupla compresión delta almacenes.

    Antes de ejecutar la consulta, que puede deshabilitar la tarea mover tupla en segundo plano mediante el indicador de traza 634. Utilice este comando para deshabilitar la tarea en segundo plano: DBCC TRACEON (634, -1). Después de que la consulta termine de ejecutarse, recuerde volver a habilitar la tarea en segundo plano mediante el comando: DBCC TRACEOFF (634, -1).

    También asegúrese de que no hay ningún comando BULK INSERT/BCP/SELECT-en Insertar datos en las tablas que utiliza columnstore índice mientras se ejecuta esta consulta.

    Se recomienda utilizar estos pasos para evitar que la consulta devuelva los falsos positivos.
Estado
Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 3067257 - Última revisión: 07/22/2015 17:39:00 - Revisión: 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 KbMtes
Comentarios