#sql-server
Вопрос:
У меня есть три таблицы Table1, Table2, Table3. Каждый день данные в этих таблицах будут обновляться. Для полного обновления таблицы 1 требуется 30 минут, таблицы 2-45 минут, а таблицы 3-1 час. Я должен показывать обновленные данные пользователю только после завершения процесса обновления всех таблиц.
Каков был бы возможный способ достичь этого?
Комментарии:
1. Я предполагаю, что таблицы обновляются только с помощью длительных пакетных процессов. Вы хотите, чтобы пользователи видели исходные (устаревшие) данные во время обновления?
2. Вы могли бы записать где -нибудь в своем процессе ETL шаги в таблице. Затем вы можете просто запросить таблицу, чтобы убедиться, что журнал завершения для таблиц 1, 2 и 3 существует.
3. Предполагая, что ваш ежедневный процесс-это единственное, что записывается в эти таблицы, вы можете загрузить данные в отдельные таблицы и переключить их все сразу, когда все таблицы будут обновлены. Смотрите это и это ; вы также можете использовать синонимы или представления, которые вы изменили после ETL. (Также см. Идеи Кендры Литтл об использовании правильного переключения разделов .)
Ответ №1:
Ваш наиболее вероятный подход здесь заключается в использовании триггеров в таблицах для создания журналов. Но есть некоторые предупреждения, которые сопровождают это.
Во-первых, триггеры похожи на скрытую функциональность, их часто упускают из виду, и в будущем вполне вероятно, что кто-то будет чесать голову, задаваясь вопросом, откуда взялись данные журнала. Это неплохая практика, но такова человеческая природа.
Во-вторых, триггеры увеличивают накладные расходы на процесс. каждая вставка/обновление/удаление в начальных таблицах вызовет событие для записи в журналы, и эти записи действительно требуют ресурсов.
В-третьих, в зависимости от того, как вы решите создавать свои журналы, будут накладные расходы на сравнение таблиц «вставлено» и «удалено» за каждой начальной записью.
Следует учитывать следующее: хотите ли вы сохранить всю предыдущую запись и всю новую запись? Вы хотите хранить только изменения? Сколько места займет этот журнал в базе данных? Вы хотите, чтобы эти триггеры были активны только во время процесса или 24/7?
Триггеры могут вызвать проблемы, но, скорее всего, это лучший вариант, если вы будете осторожны.