SQL Server 2008r2 обновление записей в DW

SnakeBlg
Дата: 15.06.2011 11:18:48
Доброе время суток. Есть большая база данных (назовем ее условно DW) отражающая состояние бухгалтерских счетов и хранящая данные в таблице вида Дата|Счет|Сумма (это конечно упрощено для премера). Каждый день в DW должны загружаться свежие данные из другой базы (назовем ее Источник). Все было бы хорошо если бы старые данные не изменялись. Тогда можно было просто грузить записи за новую дату и все. Но дело в том, что данные за прошлые даты в Источники могут меняться (например бухгалтера скорректировали проводку или провели операцию задним числом). Мы точно можем быть уверенны только в загруженных данных за предыдущие месяцы. Загруженные данные за текущий месяц могут стать недостоверными.

Сейчас данная проблема решена мной путем постоянной перезаписи всех значений за текущий месяц значениями из источника. Что скорее всего является оптимальным решением в данном случае (учитывая объем перезаписываемых данных).

Но что делать, если мы не можем быть уверены и в данных за прошлые месяцы? Постоянно убивать в DW десятки а то и сотни Миллионов строк и перезаписывать их? Я думаю, что существует какой-то механизм "умной" загрузки данных, когда существующие записи перезаписываются только в случае несовпадения.

Можно конечно написать свой скрипт, который будет сравнивать все строки и потом перезаписывать только нужные, но это будет очень не рационально на мой взгляд. Проще будет полностью загрузить новые строки из источника (поправте если не прав).

В общем вопрос такой: существует ли такая технология позволяющая решить проблему обновления строк в большой базе данных при загрузке обновленных данных? Если да, то укажите плиз ссылочкой глде можно почитать. Уж больно интересно решение этой проблемы.
KORSA
Дата: 15.06.2011 11:34:38
http://dimensionmergescd.codeplex.com/

это то что тебе нужно
SnakeBlg
Дата: 15.06.2011 11:43:17
Спасибо! Сегодня вечером почитаю и поэкспериментирую.
Ivan Durak
Дата: 15.06.2011 14:50:32
SnakeBlg
В общем вопрос такой: существует ли такая технология позволяющая решить проблему обновления строк в большой базе данных при загрузке обновленных данных?.

Сделать в источнике поле "UpdatedDate" и заполнять его тригерром как gertdate() при редактировании записи.
Ну а потом грузить в DW всё у чего UpdatedDate больше чем дата предыдущей загрузки.
Это самое правильное решение!
Fire83
Дата: 15.06.2011 17:08:15
SnakeBlg,
Если источник тоже на 2008R2 то тогда выбирайте:
1) Change Tracking
2) CDC
DeColo®es
Дата: 15.06.2011 17:15:01
Можете посмотреть про технологии CDC/CT тут.
Примерно последняя треть доклада.
Критик
Дата: 15.06.2011 17:18:44
Вариант Ivan Durak +1

или

создать в источике таблицу из полей "Счет", "ДатаОбновления".
Повесить на таблицу-источник триггер, который будет апдейтить поле "ДатаОбновления".
Перезагружать в хранилище данные по счету, начиная с указанной даты.

или

по выходным запускать процедуру сравнения за 3 месяца/полгода/год, которая будет искать расхождения и править только их.
KORSA
Дата: 15.06.2011 17:49:58
Ivan Durak
SnakeBlg
В общем вопрос такой: существует ли такая технология позволяющая решить проблему обновления строк в большой базе данных при загрузке обновленных данных?.

Сделать в источнике поле "UpdatedDate" и заполнять его тригерром как gertdate() при редактировании записи.
Ну а потом грузить в DW всё у чего UpdatedDate больше чем дата предыдущей загрузки.
Это самое правильное решение!



в таком случии будут дублириватса те строки которые не изменялись а это уже денежка но сторидж
Ivan Durak
Дата: 15.06.2011 18:30:14
KORSA
Ivan Durak
пропущено...

Сделать в источнике поле "UpdatedDate" и заполнять его тригерром как gertdate() при редактировании записи.
Ну а потом грузить в DW всё у чего UpdatedDate больше чем дата предыдущей загрузки.
Это самое правильное решение!



в таком случии будут дублириватса те строки которые не изменялись а это уже денежка но сторидж

что куда будет дублироваться?? не понял
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 Может кому-нибудь будет интересно.

Всем спасибо за ответы!