CHECK_DATA
Запрос позволяет проверить идентичность данных логической таблицы, загруженных за определенный период во все СУБД хранилища. Идентичность проверяется по всем операциям записи таблицы, начиная с дельты, указанной в запросе, и заканчивая последней закрытой дельтой. Обе граничные дельты включаются в проверку.
Алгоритм проверки зависит от параметров запроса:
- если столбцы указаны, по каждой операции записи в каждой из целевых СУБД рассчитывается контрольная сумма на основе значений этих столбцов и полученные суммы сравниваются между СУБД;
- если столбцы не указаны, по каждой операции записи в каждой из целевых СУБД рассчитывается количество записей и полученные значения сравниваются между СУБД.
Подробнее о порядке проверки данных см. в секции Порядок проверки данных. Примеры запросов и ответов см. в секции Примеры.
Примечание: в проверке участвуют целевые СУБД хранилища — те СУБД, в которых размещены данные проверяемой логической таблицы. Если такая СУБД одна, проверка все равно проходит и считается успешной (см. рисунок ниже).
В ответе возвращается:
- объект ResultSet с одной записью, содержащей результаты проверки, при успешном выполнении запроса;
- исключение при неуспешном выполнении запроса.
Если запрос выполнен успешно, ответ содержит сообщение об успешной проверке или найденных расхождениях, а также список проверенных СУБД хранилища.
Синтаксис
CHECK_DATA([db_name.]table_name, delta_number[, square-bracketed_column_list])
Параметры
db_name
— имя логической базы данных, в которой находится проверяемая логическая таблица. Параметр опционален, если выбрана логическая БД, используемая по умолчанию;table_name
— имя проверяемой логической таблицы;delta_number
— номер дельты, с которой начинается проверка. Должен быть меньше или равен номеру последней закрытой дельты. Номер последней закрытой дельты можно узнать с помощью запроса GET_DELTA_OK;square_bracketed_column_list
— список проверяемых столбцов таблицы. Элементы списка должны быть указаны в квадратных скобках через запятую, например[identification_number, transaction_date]
. Если столбцы указаны, проверяется контрольная сумма записей по каждой операции записи во всех целевых СУБД хранилища, иначе — количество таких записей.
Ограничения
- Разные наборы данных могут иметь одинаковую контрольную сумму, поэтому возможен ложноположительный результат проверки.
- Количество записей в проверяемых операциях записи не должно превышать
4'294'967'298
, иначе выдается исключение.
Примеры
Запрос без перечисления столбцов
Проверка целостности данных логической таблицы stores75
в диапазоне [дельта 0, последняя закрытая дельта]:
CHECK_DATA(sales.stores75, 0)
На рисунке ниже показан пример ответа CHECK_DATA
при успешной проверке логической таблицы stores75
, данные которой размещены только в ADB.
Запрос с перечислением столбцов
Проверка целостности данных столбцов identification_number
и transaction_date
таблицы sales
:
CHECK_DATA(sales.sales, 4, [identification_number, transaction_date])
На рисунке ниже показан пример ответа на запрос CHECK_DATA
по столбцам таблицы при наличии расхождений: контрольная сумма в ADB отличается от контрольной суммы в ADG и ADQM.
Порядок проверки данных
Идентичность данных проверяется в следующем порядке:
- В каждой из целевых СУБД:
- Выбираются проверяемые дельты: от указанной в запросе до последней закрытой (обе включительно).
- По каждой дельте выбираются все операции записи, совершенные в логической таблице, которая указана в запросе.
- По каждой операции записи — в зависимости от параметров запроса — рассчитывается количество или контрольная сумма загруженных записей. Алгоритм расчета контрольной суммы см. ниже.
- Значения по каждой операции записи сравниваются в целевых СУБД.
- Если запрос обработан успешно, но хотя бы одно из значений отсутствует или не соответствует другим, в ответе возвращается сообщение о расхождениях в данных. Иначе возвращается сообщение об успешной проверке.
Алгоритм расчета контрольной суммы
Контрольная сумма по операции записи рассчитывается по следующему алгоритму:
- По каждой записи, загруженной в логическую таблицу в операции записи, формируется текстовая строка: значения столбцов конвертируются в зависимости от типа данных (см. таблицу ниже) и записываются через точку с запятой. Значение NULL записывается как пустая строка.
- Для полученной строки вычисляется MD5-хеш в виде байтовой последовательности в шестнадцатеричном формате.
- Хеш интерпретируется как ASCII-строка в нижнем регистре.
- Из строки выбираются первые 4 символа строки, выстраиваются в порядке от младшего к старшему (little endian) и конвертируются в целочисленную 32-битную контрольную сумму записи.
- Контрольные суммы всех записей, загруженных в одной операции записи, суммируются — получается 64-битная контрольная сумма операции записи.
В таблице ниже показано, как значения столбцов (column_value
), указанных в запросе, конвертируются в зависимости от их типа данных.
Тип данных | Порядок конвертации | Пример |
---|---|---|
BOOLEAN | (column_value)::int | true -> 1 |
DATE | column_value - make_date(1970, 01, 01) | 2021-03-15 -> 18701 |
TIME | (extract(epoch from column_value)*1000000)::bigint | 13:01:44 -> 46904000000 |
TIMESTAMP | (extract(epoch from column_value)*1000000)::bigint | 2020-11-17 21:11:12 -> 1605647472000000 |
Другие типы данных | column_value | Иванов -> Иванов |
Пример расчета контрольной суммы
Рассмотрим пример расчета контрольной суммы для одной записи таблицы sales
со следующими значениями:
identification_number
= 10021,transaction_date
= 2020-11-17 21:11:12,product_code
= ABC1830.
Контрольная сумма рассчитывается в следующем порядке:
- Формируется строка для хеш-функции:
10021;1605647472000000;ABC1830
. - Вычисляется MD5-хеш:
bedbead6aea8ca373d8f0a15713639c1
. - Выбираются первые 4 символа хеша:
bedb
. - Символы интерпретируются как ASCII-строка в нижнем регистре:
98 101 100 98
. - Строка конвертируется в целое 32-битное число: 98*20 + 101*28 + 100*216 + 98*224 = 1650746722.
Контрольная сумма записи по рассмотренным столбцам равна 1650746722
.