CHECK_SUM_SNAPSHOT

Содержание раздела
  1. Поддерживаемые сущности
  2. Режимы расчета контрольной суммы
  3. Учитываемые датасорсы
  4. Особенности расчета для значений типа FLOAT и DOUBLE
  5. Как работает запрос
  6. Синтаксис
  7. Варианты ответа
  8. Ограничения
    1. Ограничения сущностей
    2. Ограничения точности
    3. Другие ограничения
  9. Примеры
    1. Расчет по отдельным столбцам логической таблицы
    2. Расчет по всем столбцам логической таблицы
    3. Расчет по всем столбцам материализованного представления
    4. Расчет по всем столбцам логического представления
    5. Запрос по всем столбцам партиции
    6. Расчет по всем столбцам прокси-таблицы
    7. Расчет по логической базе данных
    8. Расчет по логической базе данных с коэффициентом нормализации
  10. Порядок расчета контрольных сумм
    1. Порядок расчета по таблице или представлению
    2. Особенности расчета по логическому представлению
    3. Порядок расчета по логической базе данных

Поддерживается в версиях:  6.6 / 6.5 / 6.4 / 6.3 / 6.2 / 6.1 / 6.0 / 5.8 / 5.7 / 5.6 / 5.5 / 5.4.

Запрос возвращает контрольную сумму данных по состоянию на указанную дельту или момент времени. Дельта может быть закрытой или открытой (горячей).

Если нужно рассчитать контрольную сумму по внесенным изменениям, а не по итоговому состоянию данных, используйте CHECK_SUM.

Поддерживаемые сущности

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

При расчете контрольной суммы по прокси-таблице следует указать номер любой существующей дельты в логической БД.

Расчет контрольной суммы в горячей дельте доступен только для логических таблиц.

Расчет контрольной суммы для партиционированных таблиц недоступен. Для таких таблиц запрос возвращает 0.

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

Контрольную сумму можно рассчитать в следующих режимах:

  • по отдельным столбцам сущности,
  • по всем столбцам сущности,
  • по всем столбцам всех логических таблиц и прокси-таблиц логической базы данных.

При расчете контрольной суммы по отдельным столбцам рекомендуется добавлять первичный ключ в список столбцов. Это повысит уникальность контрольных сумм, рассчитываемых по разным данных.

Учитываемые датасорсы

Контрольная сумма рассчитывается по каждому активному датасорсу, который хранит данные проверяемой логической сущности.

Неактивные датасорсы пропускаются при расчете без возврата ошибки и не отображаются в ответе.

Особенности расчета для значений типа FLOAT и DOUBLE

Значения с типами 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

Опциональный список имен столбцов, по которым рассчитывается контрольная сумма. Элементы списка перечисляются в квадратных скобках через запятую.
Если столбцы не указаны, система рассчитывает контрольную сумму по всем столбцам таблицы или представления.

Варианты ответа

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

  • объект ResultSet с контрольной суммой при успешном выполнении запроса и отсутствии расхождений между датасорсами;
  • исключение при наличии расхождений или неуспешном выполнении запроса.

Если контрольные суммы различаются между датасорсами, система возвращает исключение Consistency breach detected for <entity_name>. Исключение содержит список контрольных сумм по всем проверенным датасорсам.

Ограничения

Ограничения сущностей

  • Контрольная сумма логической базы данных рассчитывается только по данным логических таблиц и прокси-таблиц, без учета данных логических и материализованных представлений.
  • Расчет контрольной суммы недоступен:
    • для логических представлений, основанных на standalone-таблицах;
    • для партиционированных таблиц.
  • Количество записей в одной сущности, по которым можно рассчитать контрольную сумму, ограничено и регулируется коэффициентом нормализации.

Ограничения точности

  • Есть небольшая вероятность, что контрольные суммы совпадут для разных наборов данных.
  • Значения типа FLOAT и DOUBLE могут приводить к расхождениям в контрольных суммах из-за разницы в точности типов.

Другие ограничения

  • Расчет контрольной суммы в горячей дельте доступен только для логических таблиц.
  • Запрос не учитывает данные, добавленные после дельты, по состоянию на которую рассчитывается контрольная сумма.
  • При обработке запроса все неактивные датасорсы пропускаются без возврата ошибки. Ошибка возвращается, если не осталось ни одного активного датасорса, подходящего для исполнения запроса.

Примеры

Расчет по отдельным столбцам логической таблицы

Расчет контрольной суммы по трем столбцам таблицы basic_stores_table в седьмой дельте:

CHECK_SUM_SNAPSHOT(7,marketing.basic_stores_table,[id, category, region])

На рисунке ниже показан пример ответа CHECK_SUM_SNAPSHOT с перечислением столбцов таблицы.

Ответ CHECK_SUM_SNAPSHOT по отдельным столбцам таблицы

Расчет по всем столбцам логической таблицы

Расчет контрольной суммы по всей таблице basic_stores_table в седьмой дельте:

CHECK_SUM_SNAPSHOT(7,marketing.basic_stores_table)

На рисунке ниже показан пример ответа CHECK_SUM_SNAPSHOT по логической таблице при наличии расхождений.

Ответ 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.sales_jan_2023 во второй дельте:

CHECK_SUM_SNAPSHOT(2, marketing.sales_jan_2023)

Расчет по всем столбцам прокси-таблицы

Расчет контрольной суммы по всей таблице payments_proxy (для прокси-таблиц дельта неважна, поэтому можно указать любую существующую дельту):

CHECK_SUM_SNAPSHOT(0, marketing.payments_proxy)

Расчет по логической базе данных

Расчет контрольной суммы по всем таблицам логической базы данных marketing_new в нулевой дельте:

-- выбор логической базы данных marketing_new в качестве базы данных по умолчанию
USE marketing_new;

-- расчет контрольной суммы логической БД
CHECK_SUM_SNAPSHOT(0);

На рисунке ниже показан пример ответа CHECK_SUM_SNAPSHOT по логической базе данных.

Ответ CHECK_SUM_SNAPSHOT по логической базе данных

Расчет по логической базе данных с коэффициентом нормализации

Расчет контрольной суммы по всем таблицам логической базы данных marketing_new с коэффициентом нормализации, равным 100:

-- выбор логической базы данных marketing_new в качестве базы данных по умолчанию
USE marketing_new;

-- расчет контрольной суммы логической БД с указанным коэффициентом нормализации
CHECK_SUM_SNAPSHOT(0, 100);

На рисунке ниже показан пример ответа на такой запрос.

CHECK_SUM_SNAPSHOT с коэффициентом нормализации

Порядок расчета контрольных сумм

Порядок расчета по таблице или представлению

Контрольная сумма логической таблицы, логического и материализованного представления рассчитывается, как описано в разделе CHECK_SUM, с тем отличием, что контрольные суммы в шаге 1 рассчитываются не по записям с определенной меткой времени, а по записям, действовавшим в заданный момент времени.

Особенности расчета по логическому представлению

Если логическое представление принадлежит одной (основной) логической БД, а его таблицы-источники принадлежат другой логической БД, контрольная сумма такого представления рассчитывается по версии данных, актуальной на дату и время закрытия дельты в основной логической БД. При этом учитывается совпадение меток времени дельт, а не их номеров. Например, из одной логической базы данных могут быть выбраны данные, актуальные на дельту 2, а из другой — данные, актуальные на дельту 11.

Порядок расчета по логической базе данных

Контрольная сумма логической базы данных рассчитывается так:

  1. По каждой логической таблице и прокси-таблице логической базы данных рассчитывается контрольная сумма (см. выше).
  2. Контрольные суммы всех логических таблиц и прокси-таблиц суммируются — получается 64-битная контрольная сумма логической базы данных.