CHECK_DATA
Содержание раздела
Поддерживается в версиях: 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
, данные которой размещены в одном датасорсе.
Запрос с перечислением столбцов
Проверка целостности изменений данных в трех столбцах таблицы sales
:
CHECK_DATA(marketing.sales, 0, [id, transaction_date, product_code])
На рисунке ниже показан пример ответа CHECK_DATA
по столбцам таблицы при наличии расхождений: контрольная сумма нулевой дельты в датасорсе adb
отличается от контрольной суммы в других датасорсах.
Запрос с коэффициентом нормализации
Проверка целостности изменений данных в трех столбцах таблицы sales
с коэффициентом нормализации 100:
CHECK_DATA(marketing.sales, 5, 100, [id, transaction_date, product_code])
На рисунке ниже показан пример ответа на такой запрос.
Порядок проверки данных
Целостность изменений данных проверяется в следующем порядке:
- В каждом из активных целевых датасорсов по каждой дельте, начиная с последней закрытой до указанной в запросе (обе включительно), выполняются действия:
- Выбираются все загруженные и обновленные записи логической таблицы, которые имеют метку времени, соответствующую дате и времени закрытия этой дельты.
- Рассчитывается контрольная сумма по выбранным записям. Порядок расчета контрольной суммы см. в разделе CHECK_SUM.
- Значения по каждой дельте сравниваются между активными целевыми датасорсами.
- Возвращается результат проверки:
- Если какая-либо контрольная сумма отсутствует в одном из датасорсов или не соответствует суммам в других датасорсах, проверка останавливается и в ответе возвращается информация обо всех проверенных дельтах и о расхождении в последней проверенной дельте.
- Иначе в ответе возвращается информация об успешной проверке по каждой проверенной дельте.