Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнение таблиц и их обновления  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
Есть таблица порядка 300 мб данных(справочник названия,улица,дом и.т.д), необходимо периодически сравнивать на изменения с данными в исходной БД.На исходной БД нет возможности делать логирования изменений, в таблицах нет флага обновления данных, и соответвенно выборка из исходной БД идет сразу всей таблицы без условий и такая же выборка в моей таблицы без условий,сравнию через except, соответсвенно там почти 200 мегов и в моей таблицы 200 мегов, и либо табле скан либо индекс скан, чтобы проверить на то, изменилось ли что-то и обновить данные.

Кам можно это реализовать менее ресурсоемкостно?
Делать выборку порциями, но толь как , там же нет ни ID, чтобы как-то фильтровать.
5 сен 11, 11:43    [11227166]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение таблиц и их обновления  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
Slava_Nik
Кам можно это реализовать менее ресурсоемкостно?
Никак - вам же запрещено делать изменения в исходной БД.

Вариант только оптимизировать сам процесс.

Например, выгружать используя bcp, считать какой нибуть хэш, его уже загружать в БД и сравнивать (находить изменённые строки).
5 сен 11, 12:00    [11227349]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение таблиц и их обновления  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
таблицу которую нельзя изменять я выгрузил к себе.
теперь у меня есть таблица1, которую нужно сравнить, таблица2,с данными импорта, данные в таблицу2 запихнул с полем инкрементом id.
Как их сравнивать и обновить при необходимости данные в таблице1?
Если делать напрямую сравнение через except,то 15000-20000 строк разница каждый раз и их нужно будет обновить в таблице1,при том, что таблица1 используется довольно часто юзерами . Минус больше по времени блокировка на таблицу1 на большое коллличество строк

Второй вариант сравнивать через except порциями из таблицы2 по id, к примеру по 3000 записей таблицы2, тогда идет nested loops к таблице 1, ну и обновлять результат сравнения этих 3000 строк . Здесь, будет меньше по объему строк блокировка, но из-за тех же блокировок цикл по обновления может не всегда пройти, соотвественно не всегда все данные сравнятся и обновятся.
Либо какие еще варианты?
5 сен 11, 12:27    [11227530]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение таблиц и их обновления  [new]
Mgvlad
Member

Откуда: Минск
Сообщений: 97
Slava_Nik,

Вариантов несколько:

1. Можно взять хэш (точнее контрольную сумму от всей таблицы):
Select CHECKSUM_AGG ( -- контрольная сумма от построчных сумм
CHECKSUM(*) -- построчная контрольная сумма от всех полей
) from ВАША_ТАБЛИЦА
Вариант довольно ресурсоёмкий, зато позволяет определить даже какие строчки обновлены (если хранить исходные суммы от всех строк в другой таблице).

Вариант 2:
Отслеживание времени последнего обновления индексов
SELECT   OBJECT_NAME(OBJECT_ID) AS TableName,
         MAX(last_user_update) AS LastUpdateDate
FROM sys.dm_db_index_usage_stats
where object_id = OBJECT_ID('ВАША_ТАБЛИЦА')
GROUP BY OBJECT_NAME(OBJECT_ID)
ORDER BY OBJECT_NAME(OBJECT_ID)
Сей метод ресурсов потребляет мизер, но позволяет только ответить на вопрос - менялась таблица или нет.
2 ограничения:
1. В таблице должен быть хотя бы один индекс.
2. Эта информация обнуляется при рестарте сервера.
5 сен 11, 12:42    [11227640]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение таблиц и их обновления  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
Slava_Nik
Либо какие еще варианты?
Третий вариант я вам предложил.
5 сен 11, 14:20    [11228479]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение таблиц и их обновления  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
Mgvlad
Сей метод ресурсов потребляет мизер, но позволяет только ответить на вопрос - менялась таблица или нет.
Задача, как я понимаю, определить, какие именно строки поменялись.
5 сен 11, 14:21    [11228492]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение таблиц и их обновления  [new]
Mgvlad
Member

Откуда: Минск
Сообщений: 97
alexeyvg,

Да, именно так. Поэтому комбинация моих вариантов может вполне решить задачу. Т.е:

- через индексы отслеживаем изменение таблицы с минимальными затратами.
- если таблица изменилась - используется метод построчной сверки контрольных сумм, линкуясь по id (должен же быть в таблицах-справочниках хоть какой-то первичный ключ) и сравнивая контрольные суммы в таблице источнике и в целевой таблице. Где суммы не совпали - та строка поменялась.
5 сен 11, 15:00    [11228843]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение таблиц и их обновления  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
Mgvlad
alexeyvg,

- если таблица изменилась - используется метод построчной сверки контрольных сумм, линкуясь по id (должен же быть в таблицах-справочниках хоть какой-то первичный ключ) и сравнивая контрольные суммы в таблице источнике и в целевой таблице. Где суммы не совпали - та строка поменялась.


а разве когда сикуль работает через оператор Hash Match, он не тоже самое делает?
5 сен 11, 16:41    [11229880]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение таблиц и их обновления  [new]
iljy
Member

Откуда:
Сообщений: 8711
Slava_Nik
Mgvlad
alexeyvg,

- если таблица изменилась - используется метод построчной сверки контрольных сумм, линкуясь по id (должен же быть в таблицах-справочниках хоть какой-то первичный ключ) и сравнивая контрольные суммы в таблице источнике и в целевой таблице. Где суммы не совпали - та строка поменялась.


а разве когда сикуль работает через оператор Hash Match, он не тоже самое делает?

С какого перепугу?? Сравниваются значения, просто поиск происходит по организованной по ним хеш-таблице. И для построения этой хеш-таблицы приходится выбрать значения всех полей. А так - сразу выбирается предварительно рассчитанная контрольная сумма, т.е. 4 байта вместо хрен знает скольки.
5 сен 11, 16:55    [11230000]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение таблиц и их обновления  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
что -то я то перепутал.
я правильно понимаю, что есть таблица, со значениями хэш по моим полям таблицы1, затем когда импорт делаем из таблицы 2, мы проверяем значения хэш импортируемых данных, если есть разница то обновляем в таблице2.
5 сен 11, 18:12    [11230590]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение таблиц и их обновления  [new]
Mgvlad
Member

Откуда: Минск
Сообщений: 97
Slava_Nik,

Именно так. Надо только что бы в обеих полях были бы поля по которым две таблицы можно было бы связать один к одному (ну там айдишка какая).

Поскольку эта процедура ест ресурсы (хоть и не так много) лучше её производить только тогда когда установлен факт изменения таблицы.
Например джоб раз в 5 минут проверяет изменилось ли время обновления индексов в таблице. Если изменилось - запускаем построчную сверку/обновление.
5 сен 11, 18:39    [11230700]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить