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

Откуда: Russia, Stavropol
Сообщений: 304
Есть две таблицы: t1 и t2 в каждой около 500 000 id-шников. Между собой они синхронизируются.
Как рационально удалить из t2 id-шники, отсутствующие в t1.

Следующий код вроде нерациональный:
delete t2 where [id] not in (select [id] from t1)

Как я понял, в этом случае компилятор образует вложеные циклы, а бегать по ним в 500 000 записей - напряжно.

Как быть???
18 окт 05, 12:21    [1978485]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
delete t2 where not exists(select * from t1 where [id] = t2.[id])
18 окт 05, 12:23    [1978499]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
Sirios
Member

Откуда: Russia, Stavropol
Сообщений: 304
результат выполнения можно трактовать так:
delete t2 where not exists(select * from t1 where [id] = t2.[id])
--эквивалентно
delete t2 where (true/false)

где логика?
18 окт 05, 12:27    [1978518]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Sirios
Как я понял, в этом случае компилятор образует вложеные циклы, а бегать по ним в 500 000 записей - напряжно.

Как быть???

А как проверить каждую запись первой таблицы без их перебора ?
18 окт 05, 12:29    [1978536]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Sirios
результат выполнения можно трактовать так:
delete t2 where not exists(select * from t1 where [id] = t2.[id])
--эквивалентно
delete t2 where (true/false)

где логика?
Логика в том, что это true/false выполняется для строки с определенным идентификатором.
Не нравится так, перепишите

delete t2 from t2 left join
       t1 on t2.[id] = t1.[id]
       where t1.[id] is null
18 окт 05, 12:31    [1978548]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
Sirios
Member

Откуда: Russia, Stavropol
Сообщений: 304
Может есть какие-нибудь средства сведения таблиц, работающие быстрее вложенных циклов:
Например что-то типа такой промежуточной таблицы:
t1.id | t2.id
-----------
  1   |    1
 null |    2
 null |    3

а потом взять все строки с null
Тока я не уверен что это будет быстрее работать.
18 окт 05, 12:34    [1978569]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
Sirios
Member

Откуда: Russia, Stavropol
Сообщений: 304
2 tpg. Спасибо, буду пробовать!
18 окт 05, 12:35    [1978576]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Sirios
а потом взять все строки с null

Тихо сам с собой веду беседу я....
Вам уже два варианта предложили именно того, что вы хотите - "взять все строки с null"!!


Posted via ActualForum NNTP Server 1.3

18 окт 05, 12:38    [1978591]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Sirios
...Тока я не уверен что это будет быстрее работать.
Сравните планы.
18 окт 05, 12:38    [1978592]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Sirios
Может есть какие-нибудь средства сведения таблиц, работающие быстрее вложенных циклов:

Алгоритмов соединения всего 3 - nested loops, hash и merge.
Производительность каждого вы можете проверить через использование соответствующего ключевого слова во фразе JOIN
18 окт 05, 12:48    [1978652]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Есть вариант повесить триггер на удаление, логить в отдельную таблицу удаленные записи и удалять именно их.
18 окт 05, 14:28    [1979365]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
Sirios
Member

Откуда: Russia, Stavropol
Сообщений: 304
Спасибо всем! С тригером тоже вариант хороший - посмотрю как себя покажут ваши предложения. Эти две таблицы находятся на разных связанных серверах - отуда и необходимость в синхронизации. С тригером могут быть проблемы, так как одна база административная - вней уж больно не полазаешь. Туда хранимые запихать - лишний гемор с безопасностью и правами доступа. На тригер придется с политикой безопасности опять иметь дело.
18 окт 05, 15:25    [1979828]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно синхронизировать таблицы на удаление записей?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Зачем такие сложности? Триггер пишет удаленные Ид в служебную таблицу. Тут вопросов нет. Так, скажем, MERGE реплика работает. Дальше. Делаем хранимку, которая дает n записей из этой служебной таблицы, начиная с @n. По умолчанию если @n IS NULL, то с начала. Можно тут же помнить последний @n, по которому СКВИТОВАН запрос. Далее. "Подписчик" тупо дергает "издателя" - дай мне удаленные записи. Это просто вызов хранимки. Remote / Linked сервера катят. Получает список Ид. Разбирается с ними (удаляет у ся). Эффективность предельная. Безопасность более, чем достаточная. Ну и по факту удаления подписчик "квитует" издателя последним обработанным @no. Дальше цикл повторяется до @@rowcount = 0
18 окт 05, 16:12    [1980236]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить