CHECK_SUM
Содержание раздела
Запрос позволяет рассчитать контрольную сумму данных в указанной дельте. Дельта может быть любой: как закрытой, так и открытой (горячей).
Расчет контрольной суммы возможен по следующим данным:
- отдельным столбцам логической таблицы или материализованного представления,
- всем столбцам логической таблицы или материализованного представления,
- всем логическим таблицам логической базы данных.
При проверке по отдельным столбцам таблицы или представления рекомендуется включать первичный ключ в список проверяемых столбцов. Это позволит снизить вероятность получения одинаковых контрольных сумм по разным наборам данных.
Контрольная сумма рассчитывается по каждой СУБД хранилища, в которой размещаются данные проверяемой логической сущности. Расчет выполняется в порядке, описанном ниже.
Если контрольные суммы логической сущности различаются между СУБД хранилища, в ответе возвращается исключение Consistency breach detected for <entity_name>
с перечислением контрольных сумм сущности во всех проверенных СУБД. При расчете контрольной суммы по логической БД система останавливает расчет и возвращает исключение при первом найденном расхождении.
В ответе возвращается:
- объект ResultSet с одной записью, содержащей контрольную сумму данных, при успешном выполнении запроса и отсутствии расхождений между СУБД хранилища;
- исключение при наличии расхождений или неуспешном выполнении запроса.
Значения типа FLOAT и DOUBLE могут иметь разные контрольные суммы из-за разницы в точности типов. Чтобы избежать расхождения в контрольных суммах, используйте для значений с плавающей точкой только тип DOUBLE (как более распространенный среди СУБД) или исключайте столбцы типа FLOAT и DOUBLE из запросов CHECK_SUM
.
Синтаксис
CHECK_SUM(delta_num[, normalization][, [db_name.]entity_name[, square-bracketed_column_list]])
Параметры:
delta_num
— номер открытой (горячей) или закрытой дельты, в которой рассчитывается контрольная сумма таблицы, представления или логической БД. Если других аргументов в запросе нет, контрольная сумма рассчитывается по всем логическим таблицам логической БД;normalization
(опциональный) — коэффициент, который повышает максимально допустимое количество записей таблицы (или представления) в дельте, но снижает уникальность контрольных сумм. Может принимать любое положительное целочисленное значение, начиная с 1. Значение по умолчанию — 1. Если коэффициент не указан или равен 1, проверяемая таблица (представление) может содержать до4'294'967'298
записей в дельте; при увеличении коэффициента допустимое количество записей увеличивается пропорционально. Если количество записей какой-либо таблицы (или представления) в дельте больше допустимого, в ответе возвращается исключение;entity_name
(опциональный) — имя логической таблицы или материализованного представления, по которым рассчитывается контрольная сумма;square-bracketed_column_list
(опциональный) — список имен столбцов указанной таблицы или представления, по которым рассчитывается контрольная сумма. Элементы списка перечисляются внутри квадратных скобок через запятую. Если список столбцов не указан, контрольная сумма рассчитывается по всем столбцам логической таблицы или материализованного представления.
Ограничения
- Контрольная сумма логической базы данных рассчитывается только по данным логических таблиц и не учитывает данные материализованных представлений.
- Существует математическая вероятность получения одинаковых контрольных сумм для разных наборов данных.
- Максимально допустимое количество записей таблицы (или представления) в дельте, для которых контрольная сумма рассчитывается корректно, пропорционально коэффициенту нормализации. Если коэффициент не указан или равен 1, каждая из проверяемых таблиц или представлений может содержать до
4'294'967'298
записей в дельте; при увеличении коэффициента допустимое количество записей также увеличивается.
Примеры
Запрос по некоторым столбцам логической таблицы
Расчет контрольной суммы по трем столбцам таблицы sales
в десятой дельте:
CHECK_SUM(10,sales.sales,[id, transaction_date, product_code])
На рисунках ниже показаны примеры ответов на запрос CHECK_SUM
с перечислением столбцов: на первом — ответ при отсутствии расхождений в данных между СУБД хранилища, на втором — ответ при наличии расхождений.
Запрос по всем столбцам логической таблицы
Расчет контрольной суммы по всей таблице sales
в десятой дельте:
CHECK_SUM(10,sales.sales)
На рисунке ниже показан пример ответа на запрос CHECK_SUM
по логической таблице.
Запрос по всем столбцам материализованного представления
Расчет контрольной суммы по всему материализованному представлению sales_by_stores
в десятой дельте:
CHECK_SUM(10,sales.sales_by_stores)
Запрос по логической базе данных
Расчет контрольной суммы по всей логической базе данных sales
в десятой дельте:
-- выбор логической базы данных sales в качестве базы данных по умолчанию
USE sales;
-- расчет контрольной суммы логической БД
CHECK_SUM(10);
На рисунке ниже показан пример ответа на запрос CHECK_SUM
по логической базе данных.
Запрос по логической базе данных с коэффициентом нормализации
Расчет контрольной суммы по логической базе данных sales
с коэффициентом нормализации, равным 100:
-- выбор логической базы данных sales в качестве базы данных по умолчанию
USE sales;
-- расчет контрольной суммы логической БД с указанным коэффициентом нормализации
CHECK_SUM(7, 100);
На рисунке ниже показан пример ответа на такой запрос.
Порядок расчета контрольных сумм
Расчет контрольной суммы по логической таблице (материализованному представлению)
Контрольная сумма логической таблицы или материализованного представления рассчитывается, как описано в разделе CHECK_DATA.
Расчет контрольной суммы по логической базе данных
Контрольная сумма логической базы данных рассчитывается в следующем порядке:
- По каждой логической таблице логической БД рассчитывается контрольная сумма, как описано в разделе CHECK_DATA.
- Контрольные суммы всех логических таблиц суммируются — получается 64-битная контрольная сумма логической базы данных.
Пример расчета контрольной суммы по таблице
Рассмотрим пример расчета контрольной суммы по таблице sales
в дельте, содержащей две операции записи. Для простоты примера по каждой из записей возьмем заранее рассчитанную 32-битную контрольную сумму: 165074672 (см. пример расчета в разделе CHECK_DATA) и 87891666.
Контрольная сумма таблицы равна 165074672 + 87891666 = 252966338
.