Перейти к основному контенту
Поддержка
Войдите с помощью учетной записи Майкрософт
Войдите или создайте учетную запись.
Здравствуйте,
Выберите другую учетную запись.
У вас несколько учетных записей
Выберите учетную запись, с помощью которой нужно войти.

В этой статье рассматривается проблема, возникающая во время запроса кластеризованного индекса columnstore в Microsoft SQL Server 2014. В этой статье описано решение этой проблемы.

Аннотация

При использовании запроса, проверяющего кластеризованный индекс columnstore в Microsoft SQL Server 2014, вы можете в некоторых случаях получать результаты частичных запросов. Эта проблема возникает при выполнении следующей операции.

Шаг 1

Инструкция Transact-SQL [INSERT или масс-INSERT] вставляет данные в таблицу, которая содержит кластеризованный индекс columnstore. При выполнении этой операции применяются следующие условия:

  • Когда инструкция Transact-SQL достигает порогового значения rowgroup, она закрывает rowgroup R1 с сегментом S1.

  • Сегмент S1 указывает на местный словарь D1.

  • Инструкция продолжает вставку строк в новую rowgroup R2.

  • Когда rowgroup R1 закрыт, местный словарь D1 также не нужно закрывать. Если в списке D1 по-прежнему есть доступное пространство, вы можете оставить его открытым и повторно использовать для нового rowgroup R2.

Этап 2

Если выполнение инструкции Transact-SQL завершилось аварийно или отменено перед закрытием нового rowgroup R2, применяются указанные ниже условия.

  • Изменения метаданных columnstore происходят во всех подтранзакциях, которые зафиксированы независимо от внешней транзакции.

  • На этом этапе rowgroup R1 сохраняется в системной таблице в разделе "строительство" или "невидимое состояние", а сегмент S1 ссылается на словарь D1.

  • В системной таблице не создано ни одной строки для словаря D1. Это связано с тем, что инструкция Transact-SQL никогда не имеет возможности закрыть существующую строку. Таким образом, существующая строка сохраняется.

Шаг 3

В типичной ситуации, если фоновая задача перемещения кортежа начинается после завершения инструкции Transact-SQL, фоновая задача удаляет невидимые rowgroup R1 и сегмент S1. Если в данный момент запускается новая инструкция Transact-SQL и создается rowgroup R3 с новым сегментом S3, для которого требуется новый локальный словарь, нельзя использовать внутренний идентификатор словаря D1. Это связано с тем, что в состоянии в памяти для columnstore сохраняется Отслеживание используемых идентификаторов словарей. Следовательно, сегмент S3 будет ссылаться на новый словарь D2.Примечание. Условие на этом этапе является типичным условием. Следовательно, никаких повреждений не возникает.

Шаг 4

Проблема, описанная в этой статье, возникает в том случае, если SQL Server теряет состояние в памяти словаря D1 до того, как будет применена задача перемещения кортежа (как описано в шаге 3).Примечания.

  • Это событие возникает по одной из указанных ниже причин.

    • Сервер SQL Server погружает память, а содержимое словаря D1 в памяти удаляется из памяти.

    • Экземпляр SQL Server перезапускается.

    • База данных, содержащая кластеризованный индекс columnstore, переключается в автономный режим, а затем снова появляется в сети.

  • После возникновения какого-либо из этих событий и SQL Server перезагружает структуру из памяти, не существует записи, в которой существовал словарь D1 и внутренний идентификатор. Это происходит потому, что словарь D1 не был сохранен в системных таблицах при завершении или conceledии инструкции Transact-SQL.

  • Если в этой точке начинается фоновая задача перемещения кортежа, ошибки не возникают, поскольку применяются условия, описанные в шаге 3.

  • Если вы создаете новый rowgroup R3 перед началом фоновой задачи перемещения кортежа (для предыдущего элемента маркированного списка), SQL Server назначает один и тот же внутренний идентификатор новому словарю D1 и ссылается на словарь D1 для сегмента S3 в rowgroup R3.

  • Когда фоновая задача перемещения кортежа начинается после предыдущего действия, она удаляет невидимые rowgroup R1 и его сегменты S1 вместе с новым словарем D1. Это объясняется тем, что в списке "перемещаются" кортежа рассматривается этот новый словарь D1 и исходный словарь D1, на котором находятся ссылки S1.Примечание. При выполнении этого условия вы не можете запросить содержимое rowgroup R3.

Решение

Эта проблема впервые устранена в следующих накопительных обновлениях для SQL Server:

Накопительное обновление 1 для SQL server 2014 SP1, накопительное обновление 8 для SQL Server 2014Исправление для этой проблемы также включено в следующие обновления выпусков исправлений для общего распространения (GDR).

Обновление для системы безопасности SQL Server 2014 QFE  Это обновление включает накопительное обновление 8, важное исправление и необходимые обновления для системы безопасности MS15-058.Обновление для системы безопасности сервера SQL Server 2014 GDR  Это обновление содержит эти важные исправления для системы безопасности с помощью MS15-058.Обновление не для системы безопасности для SQL Server 2014 с пакетом обновления 1 (SP1) GDR  Это обновление содержит только это важное исправление.

Все новые накопительные обновления для SQL Server содержат все исправления и все исправления для системы безопасности, которые были включены в предыдущий накопительный пакет обновления. Ознакомьтесь с последними накопительными обновлениями для SQL Server.

Дополнительная информация

Сообщения об ошибкахЕсли в данный момент вы затронули базу данных DBCC CHECKDB после применения этого исправления, появится следующее сообщение об ошибке:

Сообщение 5289, уровень 16, состояние 1, строка 1 кластеризованный индекс columnstore "CCI" для таблицы 't имеет одно или несколько значений данных, которые не соответствуют значениям данных в словаре. Восстановите данные из резервной копии.

В текущей базе данных при выполнении запроса, проверяющего затронутые таблицы после применения этого исправления, появляется следующее сообщение об ошибке:

Сообщение 5288, уровень 16, состояние 1, индекс columnstore на строке 1 содержит одно или несколько значений данных, которые не соответствуют значениям данных в словаре. Выполните DBCC CHECKDB для получения дополнительных сведений.

Если вы получаете эти ошибки, вы можете сохранить неповрежденные данные с помощью массового экспорта данных незадействованных столбцов или RowGroups, а затем перезагрузить данные после удаления или создания кластеризованного индекса columnstore. Включите флаг трассировки 10207, чтобы отключить ошибку 5288 и вернуться к старому поведению при пропуске поврежденного RowGroups. Примечание.Сообщения об ошибках 5288 и 5289 генерируются для этого rowgroup R3, в котором сегмент S3. Флаг трассировки 10207 используется для извлечения сегментов rowgroup R3, на которые не влияет отсутствующий словарь D1.

Запрос к затронутым базам данныхЧтобы определить, влияет ли на базу данных, содержащую индексы columnstore, эту проблему, выполните следующий запрос:

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 

Примечания.

  • Этот запрос необходимо запускать для всех баз данных, содержащих индексы columnstore на сервере, на котором запущен SQL Server. Пустой результирующий набор указывает на то, что база данных не изменяется.

  • Выполните этот запрос в течение периода, когда отсутствуют действия, которые могут создать новый RowGroups или изменить состояние существующего RowGroups. Например, описанные ниже действия могут изменить состояние RowGroups: построение индекса, переупорядочение индексов, массовой вставки, а также с помощью кортежей сжатие разностных хранилищ. Перед выполнением запроса вы можете отключить задачу перемещения по кортеже фона с помощью флага трассировки 634. Используйте эту команду, чтобы отключить фоновую задачу: DBCC TRACEON (634,-1). После завершения выполнения запроса не забудьте повторно включить фоновую задачу с помощью команды DBCC TRACEOFF (634,-1). Кроме того, убедитесь, что команды МАССовой вставки, импорта и выбора не поддерживают вставку данных в таблицы, которые используют индекс columnstore во время выполнения запроса. Рекомендуется выполнить эти действия, чтобы избежать возвращения ложных результатов в запросе.

Статус

Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.

Были ли сведения полезными?

Насколько вы удовлетворены качеством перевода?
Что повлияло на вашу оценку?
После нажатия кнопки "Отправить" ваш отзыв будет использован для улучшения продуктов и служб Майкрософт. Эти данные будут доступны для сбора ИТ-администратору. Заявление о конфиденциальности.

Спасибо за ваш отзыв!

×