CHECK_DATA

Содержание раздела
  1. Синтаксис
  2. Параметры
  3. Ограничения
  4. Примеры
    1. Запрос без перечисления столбцов
    2. Запрос с перечислением столбцов
  5. Порядок проверки данных
  6. Алгоритм расчета контрольной суммы
    1. Пример расчета контрольной суммы

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

Алгоритм проверки зависит от параметров запроса:

  • если столбцы указаны, по каждой операции записи в каждой из целевых СУБД рассчитывается контрольная сумма на основе значений этих столбцов и полученные суммы сравниваются между СУБД;
  • если столбцы не указаны, по каждой операции записи в каждой из целевых СУБД рассчитывается количество записей и полученные значения сравниваются между СУБД.

Подробнее о порядке проверки данных см. в секции Порядок проверки данных. Примеры запросов и ответов см. в секции Примеры.

Примечание: в проверке участвуют целевые СУБД хранилища — те СУБД, в которых размещены данные проверяемой логической таблицы. Если такая СУБД одна, проверка все равно проходит и считается успешной (см. рисунок ниже).

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

  • объект 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.

Ответ CHECK_DATA с проверкой только в ADB

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

Проверка целостности данных столбцов identification_number и transaction_date таблицы sales:

CHECK_DATA(sales.sales, 4, [identification_number, transaction_date])

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

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

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

Идентичность данных проверяется в следующем порядке:

  1. В каждой из целевых СУБД:
    1. Выбираются проверяемые дельты: от указанной в запросе до последней закрытой (обе включительно).
    2. По каждой дельте выбираются все операции записи, совершенные в логической таблице, которая указана в запросе.
    3. По каждой операции записи — в зависимости от параметров запроса — рассчитывается количество или контрольная сумма загруженных записей. Алгоритм расчета контрольной суммы см. ниже.
  2. Значения по каждой операции записи сравниваются в целевых СУБД.
  3. Если запрос обработан успешно, но хотя бы одно из значений отсутствует или не соответствует другим, в ответе возвращается сообщение о расхождениях в данных. Иначе возвращается сообщение об успешной проверке.

Алгоритм расчета контрольной суммы

Контрольная сумма по операции записи рассчитывается по следующему алгоритму:

  1. По каждой записи, загруженной в логическую таблицу в операции записи, формируется текстовая строка: значения столбцов конвертируются в зависимости от типа данных (см. таблицу ниже) и записываются через точку с запятой. Значение NULL записывается как пустая строка.
  2. Для полученной строки вычисляется MD5-хеш в виде байтовой последовательности в шестнадцатеричном формате.
  3. Хеш интерпретируется как ASCII-строка в нижнем регистре.
  4. Из строки выбираются первые 4 символа строки, выстраиваются в порядке от младшего к старшему (little endian) и конвертируются в целочисленную 32-битную контрольную сумму записи.
  5. Контрольные суммы всех записей, загруженных в одной операции записи, суммируются — получается 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.

Контрольная сумма рассчитывается в следующем порядке:

  1. Формируется строка для хеш-функции: 10021;1605647472000000;ABC1830.
  2. Вычисляется MD5-хеш: bedbead6aea8ca373d8f0a15713639c1.
  3. Выбираются первые 4 символа хеша: bedb.
  4. Символы интерпретируются как ASCII-строка в нижнем регистре: 98 101 100 98.
  5. Строка конвертируется в целое 32-битное число: 98*20 + 101*28 + 100*216 + 98*224 = 1650746722.

Контрольная сумма записи по рассмотренным столбцам равна 1650746722.