Applies ToSQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

У цій статті розповідається про проблему, яка виникає під час запиту кластерного індексу стовпчисховища в Microsoft SQL Server 2014. У цій статті наведено вирішення цієї проблеми.

Загальні відомості

Якщо ви використовуєте запит, який сканує Кластерний індекс стовпців у Microsoft SQL Server 2014, ви можете в умовах рідкісних умов отримувати часткові результати запиту. Ця проблема виникає, коли запущено таку операцію.

Крок 1

Оператор Transact-SQL [вставлення або ГРУПОВЕ вставлення] вставляє дані до таблиці, яка містить Кластерний індекс стовпців. Під час цієї операції застосовано такі умови:

  • Коли оператор Transact-SQL досягає порогу rowgroup, він закриває rowgroup R1, що має сегмент S1.

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

  • Оператор продовжує вставляти рядки в нову групу rowgroup R2.

  • Якщо закрити групу rowgroup R1, локальний словник D1 також не має бути закрито. Якщо словник D1 все ще має вільний простір, ви можете його відкрити та повторно використати для нової групи rowgroup R2.

Крок 2

Якщо оператор Transact-SQL завершився ненормально або скасовано, перш ніж він закриє новий rowgroup R2, застосовується такі умови:

  • Під час виконання підтранзакцій, які здійснюють незалежно від зовнішньої транзакції, внесені метадані columntstore.

  • На цьому етапі rowgroup R1 зберігається в системному таблиці в розділі "будується" або НЕВИДИМОМУ стані, а сегмент S1 посилається на словник D1.

  • У системній таблиці для словника D1 не створено жодного рядка. Це пояснюється тим, що оператор Transact-SQL ніколи не має можливості закрити наявний рядок. Таким чином, наявний рядок повторюється.

Крок 3

У типовій ситуації, якщо після виконання інструкції Transact-SQL, завдання, що не відповідає, буде видалено, фонове завдання видаляє невидимий rowgroup R1 і сегмент S1. Якщо новий оператор Transact-SQL запущено зараз, і створюється rowgroup R3, який має новий сегмент S3, який потрібен новий локальний словник, ви не зможете повторно використати внутрішній ІДЕНТИФІКАТОР словника D1. Це пояснюється тим, що стан пам'яті у стовпницях містить відстеження ідентифікаторів словників, які використовуються. Таким чином, сегмент S3 буде посилатися на новий словник D2.Примітка. Умова цього кроку – це звичайна умова. Тому жодна корупція не виникає.

Крок 4

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

  • Ця подія відбувається з будь-якої з наведених нижче причин.

    • На сервері SQL Server зазнає перевантаження пам'яті, а вміст словника, який використовується в ньому, буде виселено з пам'яті.

    • Екземпляр SQL Server буде перезавантажено.

    • База даних, яка містить Кластерний індекс стовпців, перебуває в автономному режимі, а потім знову повертається в онлайні.

  • Після будь-якого з цих подій відбувається, і SQL Server перезавантажується структури пам'яті, немає запису про те, що словник D1 та його внутрішній ІДЕНТИФІКАТОР не існувало. Це пояснюється тим, що словник D1 не збережено в системних таблицях, коли оператор Transact-SQL завершився або conceled.

  • Якщо на цьому етапі почнеться завдання фонової програми кортежу, помилки не виникають, оскільки умови, описані на кроці 3, застосовуватимуться.

  • Якщо новий rowgroup R3 створюється, перш ніж почнеться фонове завдання для рушія кортежу (за попереднім маркером), SQL Server призначає той самий внутрішній ІДЕНТИФІКАТОР для нового словника D1, а це посилання на словник D1 для сегмента S3 в групі rowgroup R3.

  • Коли після попередньої дії після попереднього виконання завдання запускатиметься на задньому плані, він падає невидимий гурт R1 і її сегменти S1 разом із новим словником D1. Це відбувається тому, що засіб кортежу вважає, що новий словник D1 та початковий словник D1, що посилання S1 однакові.Примітка. У разі виникнення цієї умови не можна виконати запит на вміст групи rowgroup R3.

Спосіб вирішення

Цю проблему вирішено в таких сукупних поновленнях для SQL Server:

Сукупне оновлення 1 для SQL server 2014 SP1 накопичувальне оновлення 8 для SQL Server 2014Виправлення для цієї проблеми також наведено в таких оновленні загальних випусків розповсюдження (НДР):

Оновлення системи безпеки для SQL Server 2014 QFE  Це оновлення включає Сукупне оновлення 8, це важливе виправлення та необхідні оновлення системи безпеки MS15-058.Оновлення системи безпеки для SQL Server 2014 НДР  Це оновлення включає в себе цю важливу проблему виправлення та накопичувальне захисту через MS15-058.Оновлення небезпеки для SQL Server 2014 із пакетом оновлень 1 НДР  Це оновлення включає лише це важливе виправлення.

Кожне нове Сукупне оновлення для SQL Server містить усі поточні виправлення та всі виправлення системи безпеки, які були включені до попереднього сукупного оновлення. Ознайомтеся з найновішими сукупними оновленнями для SQL Server:

Додаткові відомості

Повідомлення про помилкиУ поточній базі даних, якщо після інсталяції цього виправлення ви запускала DBCC CHECKDB, з'являється таке повідомлення про помилку:

MSG 5289, рівень 16, стан 1, рядок 1 Кластерний індекс стовпців "CCI" в таблиці "t" містить одне або кілька значень даних, які не збігаються з значеннями даних у словнику. Відновлення даних із резервної копії.

У поточній базі даних під час виконання запиту, який сканує порушені таблиці після застосування цього виправлення, з'являється таке повідомлення про помилку:

MSG 5288, рівень 16, стан 1, індекс у рядку 1 Columtstore має одне або кілька значень даних, які не збігаються з значеннями даних у словнику. Щоб отримати докладні відомості, запустіть DBCC CHECKDB.

Якщо ви отримали ці помилки, ви можете зберегти непошкоджені дані, навчивши дані, які не змінюються, а також не розривні дані, а потім перевантаженні даних після того, як ви перетягуєте або створюєте Кластерний індекс Стовпчасті стовпці. Щоб придушити помилку 5288, потрібно ввімкнути позначку трасування 10207, а потім повернутися до старої поведінки пропускати пошкоджені групи rowgroups. Примітка.Повідомлення про помилки 5288 і 5289 створюються для цієї rowgroup R3, що має сегмент S3. Trace позначку 10207 використовується для видобування сегментів rowgroup R3, які не залежать від відсутнього словника D1.

Запит для постраждалих баз данихЩоб визначити, чи є база даних, яка містить індекси columsstore, ця проблема вже пов'язана з цією проблемою, виконайте такий запит:

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 

Примітки

  • Потрібно виконати цей запит для кожної бази даних, яка містить індекси columstore на сервері, на якому запущено SQL Server. Пусте значення результату вказує на те, що база даних не впливає.

  • Виконайте цей запит протягом періоду, коли немає дій, які створюватимуть нові групи або змінюють стан наявної групи rowgroups. Наприклад, наведені нижче дії можуть змінити стан rowgroups: створення індексу, перевпорядкування індексу, Масова вставка, засіб стискання, що стискається Дельта-магазини. Перш ніж виконати запит, можна вимкнути завдання рушія кортежу, використовуючи прапор трасування 634. Використовуйте цю команду, щоб вимкнути фонове завдання: DBCC TRACEON (634;-1). Після завершення виконання запиту не забувайте повторно ввімкнути фонове завдання за допомогою команди: DBCC TRACEOFF (634;-1). Також переконайтеся, що в командах, які використовують індекс columbstore, не можна ДОДАВАТИ дані до таблиць, у яких використовуються індекси стовпців, і в разі виконання цього запиту. Рекомендується використовувати ці кроки, щоб не допускати запит на повернення помилкових спрацьовувань.

Стан

Корпорація Майкрософт підтвердила, що це проблема в продуктах Microsoft, перелічених у розділі "застосовується до".

Потрібна додаткова довідка?

Потрібні додаткові параметри?

Ознайомтеся з перевагами передплати, перегляньте навчальні курси, дізнайтесь, як захистити свій пристрій тощо.

Спільноти допомагають ставити запитання й відповідати на них, надавати відгуки та дізнаватися думки висококваліфікованих експертів.