CHECK_SUM_SNAPSHOT
Содержание раздела
Поддерживается в версиях: 6.1 / 6.0 / 5.8 / 5.7 / 5.6.1 / 5.5 / 5.4.
Запрос возвращает контрольную сумму данных по состоянию на указанную дельту или момент времени. Дельта может быть закрытой или открытой (горячей).
Контрольную сумму можно рассчитать по следующим данным:
- отдельным столбцам логической таблицы, логического или материализованного представления,
- всем столбцам логической таблицы, логического или материализованного представления,
- всем логическим таблицам логической базы данных.
Расчет контрольной суммы в горячей дельте доступен только для логических таблиц.
Чтобы рассчитать контрольную сумму по внесенным изменениям, а не по итоговому состоянию данных, используйте CHECK_SUM.
Контрольная сумма рассчитывается по каждому датасорсу, который хранит данные проверяемой логической сущности. Порядок расчета описан ниже.
Контрольная сумма рассчитывается по состоянию на дельту: указанную (если запрос содержит номер дельты) или ту, которая была закрыта последней на указанный момент времени (если запрос содержит момент времени). В расчете участвуют все данные по состоянию на эту дельту, включая все изменения данных, внесенные в этой дельте и до нее. Изменения, внесенные после дельты, при расчете суммы не учитываются.
В ответе возвращается:
- объект ResultSet с контрольной суммой при успешном выполнении запроса и отсутствии расхождений между датасорсами;
- исключение при наличии расхождений или неуспешном выполнении запроса.
Если контрольные суммы различаются между датасорсами, система возвращает исключение Consistency breach detected for <entity_name>
. Исключение содержит список контрольных сумм по всем проверенным датасорсам. При расчете контрольной суммы по логической базе данных система возвращает исключение по первому найденному расхождению и не проверяет следующие сущности.
Значения типа FLOAT и DOUBLE могут иметь разные контрольные суммы из-за разницы в точности типов. Чтобы избежать расхождения в контрольных суммах, используйте для всех значений с плавающей точкой тип DOUBLE (как более распространенный среди СУБД) или исключайте столбцы типа FLOAT и DOUBLE из запросов CHECK_SUM_SNAPSHOT
.
При расчете контрольной суммы по отдельным столбцам рекомендуется добавлять первичный ключ в список столбцов. Это повысит уникальность контрольных сумм, рассчитываемых по разным данных.
Синтаксис
Расчет контрольной суммы данных по состоянию на дельту:
CHECK_SUM_SNAPSHOT(delta_num[, normalization][, [db_name.]entity_name[, square_bracketed_column_list]])
Расчет контрольной суммы данных по состоянию на указанный момент:
CHECK_SUM_SNAPSHOT(date_time[, normalization][, [db_name.]entity_name[, square_bracketed_column_list]])
Параметры:
delta_num
-
Номер дельты, по состоянию на которую рассчитывается контрольная сумма. Дельта может быть закрытой или открытой.
date_time
-
Дата и время в формате
YYYY-MM-DD hh:mm:ss
, по состоянию на которые рассчитывается контрольная сумма. Система определяет последнюю закрытую дельту на указанный момент времени и рассчитывает контрольную сумму данных по состоянию на эту дельту. normalization
-
Опциональный коэффициент, который повышает лимит на количество проверяемых записей в одной сущности, но снижает уникальность контрольных сумм. Может принимать любое целое значение, начиная с 1. Значение по умолчанию — 1.
Если коэффициент не указан или равен 1, запрос может проверить до4'294'967'298
записей в одной сущности; при увеличении коэффициента лимит увеличивается пропорционально. db_name
-
Имя логической базы данных, которой принадлежит проверяемая сущность. Опционально, если выбрана логическая БД, используемая по умолчанию.
entity_name
-
Имя логической сущности, по которой рассчитывается контрольная сумма: логической таблицы, логического представления или материализованного представления. Опциональный параметр.
square_bracketed_column_list
-
Опциональный список имен столбцов, по которым рассчитывается контрольная сумма. Элементы списка перечисляются в квадратных скобках через запятую.
Если столбцы не указаны, система рассчитывает контрольную сумму по всем столбцам таблицы или представления.
Ограничения
Ограничения сущностей
- Контрольная сумма логической базы данных рассчитывается только по данным логических таблиц и не учитывает данные логических и материализованных представлений.
- Расчет контрольной суммы недоступен для логических представлений, основанных на standalone-таблицах.
- Количество записей в одной сущности, по которым можно рассчитать контрольную сумму, ограничено и регулируется коэффициентом нормализации.
Ограничения точности
- Есть небольшая вероятность, что контрольные суммы совпадут для разных наборов данных.
- Значения типа FLOAT и DOUBLE могут приводить к расхождениям в контрольных суммах из-за разницы в точности типов.
Другие ограничения
- Расчет контрольной суммы в горячей дельте доступен только для логических таблиц.
- Запрос не учитывает данные, добавленные после дельты, по состоянию на которую рассчитывается контрольная сумма.
Примеры
Расчет по отдельным столбцам логической таблицы
Расчет контрольной суммы по трем столбцам таблицы basic_stores_table
в седьмой дельте:
CHECK_SUM_SNAPSHOT(7,marketing.basic_stores_table,[id, category, region])
На рисунке ниже показан пример ответа CHECK_SUM_SNAPSHOT
с перечислением столбцов таблицы.
Расчет по всем столбцам логической таблицы
Расчет контрольной суммы по всей таблице basic_stores_table
в седьмой дельте:
CHECK_SUM_SNAPSHOT(7,marketing.basic_stores_table)
На рисунке ниже показан пример ответа CHECK_SUM_SNAPSHOT
по логической таблице при наличии расхождений.
Расчет по всем столбцам материализованного представления
Расчет контрольной суммы по всему материализованному представлению sales_by_stores
в седьмой дельте:
CHECK_SUM_SNAPSHOT(7,marketing.sales_by_stores)
Расчет по всем столбцам логического представления
Расчет контрольной суммы по всему логическому представлению agreements_with_client_info
на указанный момент времени:
CHECK_SUM_SNAPSHOT('2022-03-25 07:30:32', marketing.agreements_with_client_info)
Расчет по логической базе данных
Расчет контрольной суммы по всем таблицам логической базы данных marketing_new
в нулевой дельте:
-- выбор логической базы данных marketing_new в качестве базы данных по умолчанию
USE marketing_new;
-- расчет контрольной суммы логической БД
CHECK_SUM_SNAPSHOT(0);
На рисунке ниже показан пример ответа CHECK_SUM_SNAPSHOT
по логической базе данных.
Расчет по логической базе данных с коэффициентом нормализации
Расчет контрольной суммы по всем таблицам логической базы данных marketing_new
с коэффициентом нормализации, равным 100:
-- выбор логической базы данных marketing_new в качестве базы данных по умолчанию
USE marketing_new;
-- расчет контрольной суммы логической БД с указанным коэффициентом нормализации
CHECK_SUM_SNAPSHOT(0, 100);
На рисунке ниже показан пример ответа на такой запрос.
Порядок расчета контрольных сумм
Порядок расчета по таблице или представлению
Контрольная сумма логической таблицы, логического и материализованного представления рассчитывается, как описано в разделе CHECK_SUM, с тем отличием, что контрольные суммы в шаге 1 рассчитываются не по записям с определенной меткой времени, а по записям, действовавшим в заданный момент времени.
Если логическое представление принадлежит одной (основной) логической БД, а его таблицы-источники принадлежат другой логической БД, контрольная сумма такого представления рассчитывается по версии данных, актуальной на дату и время закрытия дельты в основной логической БД.
Учитывается совпадение времени дельт, а не их номеров. Например, из одной логической базы данных могут быть выбраны данные, актуальные на дельту 2, а из другой — данные, актуальные на дельту 11.
Порядок расчета по логической базе данных
Контрольная сумма логической базы данных рассчитывается так:
- По каждой логической таблице логической базы данных рассчитывается контрольная сумма (см. выше).
- Контрольные суммы всех логических таблиц суммируются — получается 64-битная контрольная сумма логической базы данных.