Необходимо показывать обновленные данные только после обновления всех таблиц

#sql-server

Вопрос:

У меня есть три таблицы Table1, Table2, Table3. Каждый день данные в этих таблицах будут обновляться. Для полного обновления таблицы 1 требуется 30 минут, таблицы 2-45 минут, а таблицы 3-1 час. Я должен показывать обновленные данные пользователю только после завершения процесса обновления всех таблиц.

Каков был бы возможный способ достичь этого?

Комментарии:

1. Я предполагаю, что таблицы обновляются только с помощью длительных пакетных процессов. Вы хотите, чтобы пользователи видели исходные (устаревшие) данные во время обновления?

2. Вы могли бы записать где -нибудь в своем процессе ETL шаги в таблице. Затем вы можете просто запросить таблицу, чтобы убедиться, что журнал завершения для таблиц 1, 2 и 3 существует.

3. Предполагая, что ваш ежедневный процесс-это единственное, что записывается в эти таблицы, вы можете загрузить данные в отдельные таблицы и переключить их все сразу, когда все таблицы будут обновлены. Смотрите это и это ; вы также можете использовать синонимы или представления, которые вы изменили после ETL. (Также см. Идеи Кендры Литтл об использовании правильного переключения разделов .)

Ответ №1:

Ваш наиболее вероятный подход здесь заключается в использовании триггеров в таблицах для создания журналов. Но есть некоторые предупреждения, которые сопровождают это.

Во-первых, триггеры похожи на скрытую функциональность, их часто упускают из виду, и в будущем вполне вероятно, что кто-то будет чесать голову, задаваясь вопросом, откуда взялись данные журнала. Это неплохая практика, но такова человеческая природа.

Во-вторых, триггеры увеличивают накладные расходы на процесс. каждая вставка/обновление/удаление в начальных таблицах вызовет событие для записи в журналы, и эти записи действительно требуют ресурсов.

В-третьих, в зависимости от того, как вы решите создавать свои журналы, будут накладные расходы на сравнение таблиц «вставлено» и «удалено» за каждой начальной записью.

Следует учитывать следующее: хотите ли вы сохранить всю предыдущую запись и всю новую запись? Вы хотите хранить только изменения? Сколько места займет этот журнал в базе данных? Вы хотите, чтобы эти триггеры были активны только во время процесса или 24/7?

Триггеры могут вызвать проблемы, но, скорее всего, это лучший вариант, если вы будете осторожны.