CHECK_DATA

Содержание раздела
  1. Поддерживаемые сущности
  2. Особенности проверки значений с плавающей точкой
  3. Как работает запрос
  4. Синтаксис
  5. Варианты ответа
  6. Ограничения
    1. Ограничения сущностей
    2. Ограничения точности
    3. Другие ограничения
  7. Примеры
    1. Запрос без перечисления столбцов
    2. Запрос с перечислением столбцов
    3. Запрос с коэффициентом нормализации
  8. Порядок проверки данных

Поддерживается в версиях:  6.12 / 6.11 / 6.10 / 6.9 / 6.8 / 6.7 / 6.6 / 6.5 / 6.4 / 6.3 / 6.2 / 6.1 / 6.0 / 5.8 / 5.7 / 5.6 / 5.5 / 5.4 / 5.3 / 5.2 / 5.1 / 5.0.

Запрос проверяет целостность изменений данных, внесенных в логическую таблицу с указанной дельты по последнюю закрытую дельту.

Проверка может давать ложноположительный результат. Чтобы снизить частоту ложных срабатываний, рекомендуется включать первичный ключ в список проверяемых столбцов.

Поддерживаемые сущности

Запрос поддерживает проверку обычных логических таблиц и партиций. Для партиционированных таблиц всегда возвращается сообщение об отсутствии расхождений.

Чтобы проверить целостность данных в логическом и материализованном представлении, выполните CHECK_SUM отдельно по каждой дельте: если запрос вернул контрольную сумму, а не ошибку, это означает, что в данных дельты нет расхождений.

Особенности проверки значений с плавающей точкой

Значения с типами FLOAT и DOUBLE могут иметь разные контрольные суммы из-за разницы в точности типов. Чтобы избежать расхождения в контрольных суммах, используйте для всех значений с плавающей точкой тип DOUBLE (как более распространенный среди СУБД) или исключайте столбцы с типами FLOAT и DOUBLE из запросов CHECK_DATA.

Как работает запрос

Изменения проверяются по дельтам в обратном порядке: с последней закрытой до указанной в запросе (обе дельты включительно).

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

В проверке участвуют все активные датасорсы, в которых хранятся данные логической таблицы. Если такой датасорс один, проверка все равно проходит и считается успешной. Неактивные датасорсы пропускаются при проверке без возврата ошибки и не отображаются в результатах проверки.

Подробнее о порядке проверки см. в секции Порядок проверки данных, о расчете контрольной суммы — в разделе CHECK_SUM.

Синтаксис

CHECK_DATA([db_name.]table_name, delta_number[, normalization][, square_bracketed_column_list])

Параметры:

db_name

Имя логической базы данных, которой принадлежит проверяемая логическая таблица. Опционально, если выбрана логическая БД, используемая по умолчанию.

table_name

Имя проверяемой логической таблицы.

delta_number

Номер дельты, с которой проверяются данные. Номер должен быть меньше или равен номеру последней закрытой дельты.

Номер последней закрытой дельты можно получить запросом GET_DELTA_OK или GET-методом /datamarts/{datamart}/deltas/latest/ok.

normalization

Опциональный коэффициент, который повышает лимит на количество проверяемых записей, но снижает уникальность контрольных сумм. Может принимать любое целое значение, начиная с 1. Значение по умолчанию — 1.

Если коэффициент не указан или равен 1, запрос может проверить до 4'294'967'298 измененных (добавленных и удаленных) записей в дельте; при увеличении коэффициента лимит увеличивается пропорционально.

square_bracketed_column_list

Опциональный список проверяемых столбцов таблицы. Элементы списка указываются в квадратных скобках через запятую, например [id, transaction_date].

Если столбцы не указаны, система проверяет контрольную сумму записей по всем столбцам таблицы.

Варианты ответа

В ответе возвращается:

  • объект ResultSet с результатом проверки при успешном выполнении запроса. Результат — это одна строка со списком проверенных дельт, где для каждой дельты указано сообщение об успешной проверке или найденном расхождении;
  • исключение при неуспешном выполнении запроса.

Ограничения

Ограничения сущностей

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

Ограничения точности

  • Есть небольшая вероятность, что контрольные суммы совпадут для разных наборов данных, поэтому возможен ложноположительный результат проверки.
  • Значения типа FLOAT и DOUBLE могут приводить к расхождениям при проверке из-за разницы в точности типов.

Другие ограничения

  • Недоступна проверка изменений, внесенных операциями записи после последней закрытой дельты.
  • При обработке запроса все неактивные датасорсы пропускаются без возврата ошибки. Ошибка возвращается, если не осталось ни одного активного датасорса, подходящего для исполнения запроса.

Примеры

Запрос без перечисления столбцов

Проверка целостности изменений данных в логической таблице sales_july_2021, начиная с дельты 0:

CHECK_DATA(marketing.sales_july_2021, 0)

На рисунке ниже показан пример ответа CHECK_DATA при успешной проверке логической таблицы sales_july_2021, данные которой размещены в одном датасорсе.

Ответ CHECK_DATA с проверкой в одном датасорсе

Запрос с перечислением столбцов

Проверка целостности изменений данных в трех столбцах таблицы sales:

CHECK_DATA(marketing.sales, 0, [id, transaction_date, product_code])

На рисунке ниже показан пример ответа CHECK_DATA по столбцам таблицы при наличии расхождений: контрольная сумма нулевой дельты в датасорсе adb отличается от контрольной суммы в других датасорсах.

Ответ CHECK_DATA с расхождениями

Запрос с коэффициентом нормализации

Проверка целостности изменений данных в трех столбцах таблицы sales с коэффициентом нормализации 100:

CHECK_DATA(marketing.sales, 5, 100, [id, transaction_date, product_code])

На рисунке ниже показан пример ответа на такой запрос.

Запрос CHECK_DATA с коэффициентом нормализации

Порядок проверки данных

Целостность изменений данных проверяется так:

  1. В каждом из активных целевых датасорсов по каждой дельте, начиная с последней закрытой до указанной в запросе (обе включительно), выполняются действия:
    1. Выбираются записи логической таблицы, которые были загружены и (или) обновлены в дельте и операциях записи, выполненных между этой дельтой и предшествующей ей.
    2. Рассчитывается контрольная сумма по выбранным записям. Порядок расчета контрольной суммы см. в разделе CHECK_SUM.
  2. Значения по каждой дельте сравниваются между активными целевыми датасорсами.
  3. Возвращается результат проверки:
    • Если какая-либо контрольная сумма отсутствует в одном из датасорсов или не соответствует суммам в других датасорсах, проверка останавливается и в ответе возвращается информация обо всех проверенных дельтах и о расхождении в последней проверенной дельте.
    • Иначе в ответе возвращается информация об успешной проверке по каждой проверенной дельте.