SnakeBlg
Дата: 15.06.2011 11:18:48
Доброе время суток. Есть большая база данных (назовем ее условно DW) отражающая состояние бухгалтерских счетов и хранящая данные в таблице вида Дата|Счет|Сумма (это конечно упрощено для премера). Каждый день в DW должны загружаться свежие данные из другой базы (назовем ее Источник). Все было бы хорошо если бы старые данные не изменялись. Тогда можно было просто грузить записи за новую дату и все. Но дело в том, что данные за прошлые даты в Источники могут меняться (например бухгалтера скорректировали проводку или провели операцию задним числом). Мы точно можем быть уверенны только в загруженных данных за предыдущие месяцы. Загруженные данные за текущий месяц могут стать недостоверными.
Сейчас данная проблема решена мной путем постоянной перезаписи всех значений за текущий месяц значениями из источника. Что скорее всего является оптимальным решением в данном случае (учитывая объем перезаписываемых данных).
Но что делать, если мы не можем быть уверены и в данных за прошлые месяцы? Постоянно убивать в DW десятки а то и сотни Миллионов строк и перезаписывать их? Я думаю, что существует какой-то механизм "умной" загрузки данных, когда существующие записи перезаписываются только в случае несовпадения.
Можно конечно написать свой скрипт, который будет сравнивать все строки и потом перезаписывать только нужные, но это будет очень не рационально на мой взгляд. Проще будет полностью загрузить новые строки из источника (поправте если не прав).
В общем вопрос такой: существует ли такая технология позволяющая решить проблему обновления строк в большой базе данных при загрузке обновленных данных? Если да, то укажите плиз ссылочкой глде можно почитать. Уж больно интересно решение этой проблемы.
Критик
Дата: 15.06.2011 17:18:44
Вариант Ivan Durak +1
или
создать в источике таблицу из полей "Счет", "ДатаОбновления".
Повесить на таблицу-источник триггер, который будет апдейтить поле "ДатаОбновления".
Перезагружать в хранилище данные по счету, начиная с указанной даты.
или
по выходным запускать процедуру сравнения за 3 месяца/полгода/год, которая будет искать расхождения и править только их.
SnakeBlg
Дата: 16.06.2011 03:36:36
Ivan Durak |
---|
SnakeBlg |
---|
В общем вопрос такой: существует ли такая технология позволяющая решить проблему обновления строк в большой базе данных при загрузке обновленных данных?. |
Сделать в источнике поле "UpdatedDate" и заполнять его тригерром как gertdate() при редактировании записи. Ну а потом грузить в DW всё у чего UpdatedDate больше чем дата предыдущей загрузки. Это самое правильное решение! |
Решение хорошее. Но к сожалению изменять структуру источника нельзя. И вообще к нему доступа нет. Есть только выгружаемые текстовые файлы. Сорри. Забыл сразу написать этот момент.
Спасибо за ссылки! Change Tracking и Change Data Capture это как раз то что нужно, как я понял. Буду подробнее изучать.
Вот еще нашел одно видео полезное на первый взгляд:
http://technet.microsoft.com/en-sg/edge/video/sql-server-day-track-changes-the-easy-way-with-change-data-capture Может кому-нибудь будет интересно.
Всем спасибо за ответы!