Iniciar sesión con Microsoft
Iniciar sesión o crear una cuenta
Hola:
Seleccione una cuenta diferente.
Tiene varias cuentas
Elija la cuenta con la que desea iniciar sesión.

En este artículo se describe un problema que se produce durante una consulta de un índice agrupado de almacén de columnas en Microsoft SQL Server 2014. Este artículo proporciona una solución para este problema.

Resumen

Cuando usa una consulta que examina un índice de almacén de columnas agrupado en Microsoft SQL Server 2014, en raras circunstancias, puede recibir resultados parciales de la consulta. Este problema se produce cuando se ejecuta la siguiente operación.

Paso 1

Una instrucción Transact-SQL [INSERT o BULK INSERT] inserta datos en una tabla que tiene un índice agrupado de almacén de columnas. Durante esta operación, se aplican las condiciones siguientes:

  • Cuando la instrucción Transact-SQL alcanza el umbral rowgroup, cierra rowgroup R1 que tiene el segmento S1.

  • El segmento S1 apunta al diccionario local D1.

  • La instrucción continúa insertando filas en New rowgroup R2.

  • Cuando se cierra rowgroup R1, no es necesario cerrar el Diccionario local D1. Si el Diccionario D1 aún tiene espacio disponible, puedes dejarlo abierto y reutilizarlo para el nuevo rowgroup R2.

Paso 2

Si la instrucción Transact-SQL termina de forma anormal o cancelada antes de cerrar el nuevo rowgroup R2, se aplican las siguientes condiciones:

  • Los cambios de metadatos de almacén de columnas se producen en subtransaccións que confirman independientemente de la transacción externa.

  • En este momento, rowgroup R1 continúa en la tabla del sistema en un estado "en construcción" o INVISIBLE, y el segmento S1 hace referencia a Dictionary D1.

  • No hay ninguna fila creada en la tabla del sistema para el Diccionario D1. Esto se debe a que la instrucción Transact-SQL nunca tiene oportunidad de cerrar la fila existente. Por lo tanto, la fila existente persiste.

Paso 3

En una situación típica, si la tarea en segundo plano de la tupla se inicia después de que finalice la instrucción de Transact-SQL, la tarea en segundo plano quita el rowgroup R1 y el segmento S1. Si una nueva instrucción de Transact-SQL se inicia ahora y crea rowgroup R3 que tiene un segmento nuevo S3 que requiere un nuevo Diccionario local, no se puede reutilizar el identificador interno del diccionario D1. Esto se debe a que el estado de la memoria del almacén de columnas realiza un seguimiento de los identificadores de diccionario que se usan. Por lo tanto, el segmento S3 hará referencia al nuevo Diccionario D2.Nota La condición de este paso es una condición común. Por lo tanto, no se daña.

Paso 4

Si SQL Server pierde el estado de la memoria del diccionario D1 antes de que la tarea del organizador de la tupla surta efecto (y funciona como se describe en el paso 3), se produce el problema que se describe en este artículo.Notas

  • Este evento se produce por cualquiera de las razones siguientes:

    • SQL Server experimenta una sobrecarga de memoria y el contenido en la memoria del diccionario D1 se ha expulsado de la memoria.

    • Se reiniciará la instancia de SQL Server.

    • La base de datos que contiene el índice de almacén de columnas agrupado se desconecta y vuelve a estar conectado.

  • Después de que se produzca uno de estos eventos y SQL Server vuelva a cargar las estructuras en memoria, no hay ningún registro de que exista un diccionario D1 y su identificador interno. Esto se debe a que el Diccionario D1 no se reservó en las tablas del sistema cuando la instrucción de Transact-SQL finalizó o conceled.

  • Si la tarea en segundo plano de la tupla de Tuple se inicia en este punto, no se producirán errores porque se aplican las condiciones que se describen en el paso 3.

  • Si se crea un nuevo rowgroup R3 antes de que se inicie la tarea en segundo plano de la tupla de Tuple (según el elemento de viñeta anterior), SQL Server asigna el mismo identificador interno al nuevo Diccionario D1 y hace referencia al diccionario D1 para el segmento S3 en rowgroup R3.

  • Cuando la tarea en segundo plano del organizador de tupla se inicia después de la acción anterior, se elimina la rowgroup R1 y sus segmentos S1 conjuntamente con el nuevo Diccionario D1. Esto se debe a que el Movedor de tupla considera que el nuevo Diccionario D1 y el Diccionario original D1 que las referencias a S1 son iguales.Nota Cuando se produce esta condición, no se puede consultar el contenido de rowgroup R3.

Solución

El problema se solucionó por primera vez en las siguientes actualizaciones acumulativas para SQL Server:

Actualización acumulativa 1 para SQL server 2014 SP1 actualización acumulativa 8 para SQL Server 2014La corrección para este problema también se incluye en las siguientes actualizaciones de publicación de distribución general (GDR):

Actualización de seguridad para SQL Server 2014 QFE  Esta actualización incluye la actualización acumulativa 8, esta corrección importante y las actualizaciones de seguridad necesarias de MS15-058.Actualización de seguridad para SQL Server 2014 GDR  Esta actualización incluye esta corrección importante y correcciones de seguridad acumulativas a través de MS15-058.Actualización no de seguridad para SQL Server 2014 Service Pack 1 GDR  Esta actualización incluye solo esta importante corrección.

Cada actualización acumulativa para SQL Server contiene todas las revisiones y todas las revisiones de seguridad incluidas en la actualización acumulativa anterior. Vea las últimas actualizaciones acumulativas para SQL Server:

Más información

Mensajes de errorEn una base de datos que actualmente está afectada, si ejecuta DBCC CHECKDB después de aplicar esta corrección, recibirá el siguiente mensaje de error:

Msj 5289, nivel 16, estado 1, línea 1 Índice de almacén de columnas agrupado ' ICC ' en la tabla ' t ' tiene uno o más valores de datos que no coinciden con los valores de datos de un diccionario. Restaure los datos desde una copia de seguridad.

En una base de datos que actualmente está afectada, cuando ejecuta una consulta que examina las tablas afectadas después de aplicar esta corrección, recibe el siguiente mensaje de error:

MSG 5288, nivel 16, estado 1, índice de almacén de columnas línea 1 tiene uno o más valores de datos que no coinciden con los valores de datos de un diccionario. Para obtener más información, ejecuta DBCC CHECKDB.

Si recibe estos errores, puede guardar los datos no dañados al exportar en masa los datos de las columnas no afectadas o RowGroups y volver a cargar los datos después de que haya eliminado o creado el índice agrupado de almacén de columnas. Debe habilitar la marca de seguimiento 10207 para suprimir el error 5288 y volver al comportamiento anterior de la omisión de RowGroups dañados. Nota: Los mensajes de error 5288 y 5289 se generan para este rowgroup R3 que tiene el segmento S3. La marca de seguimiento 10207 se usa para extraer los segmentos de rowgroup R3 que no se ven afectados por el diccionario no encontrado D1.

Consultar bases de datos afectadasPara determinar si la base de datos que contiene los índices de almacén de columnas ya está afectada por este problema, ejecute la consulta siguiente:

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 todas las bases de datos que contengan índices de almacén de columnas en el servidor que ejecuta SQL Server. Un conjunto de resultados vacío indica que la base de datos no se ve afectada.

  • Ejecute esta consulta durante un período en el que no hay ninguna actividad que cree nuevas RowGroups o cambie el estado de RowGroups existentes. Por ejemplo, las siguientes actividades pueden modificar el estado de RowGroups: compilación de índice, reorganización de índices, inserción masiva, movimiento de la tupla que comprime tiendas de diferencias. Antes de ejecutar la consulta, puede deshabilitar la tarea de organizador de tupla en segundo plano con la marca de seguimiento 634. Use este comando para deshabilitar la tarea en segundo plano: DBCC TRACEON (634,-1). Una vez que la consulta termine de ejecutarse, recuerde volver a habilitar la tarea en segundo plano con el comando: DBCC TRACEOFF (634,-1). Asegúrese también de que no hay comandos de inserción masiva/BCP/SELECT-INTO que inserten datos en las tablas que usan el índice de almacén de columnas mientras se ejecuta esta consulta. Se recomienda usar estos pasos para evitar que la consulta devuelva falsos positivos.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "Se aplica a".

¿Necesita más ayuda?

¿Quiere más opciones?

Explore las ventajas de las suscripciones, examine los cursos de aprendizaje, aprenda a proteger su dispositivo y mucho más.

Las comunidades le ayudan a formular y responder preguntas, enviar comentarios y leer a expertos con conocimientos extensos.

¿Le ha sido útil esta información?

¿Cuál es tu grado de satisfacción con la calidad del lenguaje?
¿Qué ha afectado a su experiencia?
Si presiona Enviar, sus comentarios se usarán para mejorar los productos y servicios de Microsoft. El administrador de TI podrá recopilar estos datos. Declaración de privacidad.

¡Gracias por sus comentarios!

×