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

Откуда:
Сообщений: 255
SQL 2000
Есть потребность собирать данные в общую базу при помощи LinkedServer.
На основном сервере Есть таблица Rest к которой всего 300'000 записей.
Определенные записи необходимо удалить.
На оконечных создается LinkedServer
create table #servers(
	f1 sql_variant, 
	f2 sql_variant, 
	f3 sql_variant, 
	f4 sql_variant, 
	f5 sql_variant, 
	f6 sql_variant, 
	f7 sql_variant 
)
insert into #servers
exec sp_helpserver

if not exists(select * from #servers where f1 = '{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}') begin
	exec sp_addlinkedserver N'{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}' ,  @srvproduct = N'' ,  @provider = N'SQLOLEDB' ,  @datasrc = N'87.248.185.133, 1974' 
	exec sp_serveroption N'{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}', N'collation compatible', N'false' 
	exec sp_serveroption N'{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}', N'data access', N'true' 
	exec sp_serveroption N'{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}', N'rpc out', N'true' 
	exec sp_serveroption N'{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}', N'rpc', N'true' 
	exec sp_serveroption N'{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}', N'use remote collation', N'true' 
	exec sp_serveroption N'{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}', N'collation name', N'null' 
	exec sp_serveroption N'{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}', N'connect timeout', 0 
	exec sp_serveroption N'{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}', N'query timeout', 0 
	EXEC sp_addlinkedsrvlogin '{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}', false, null, 'xxx', 'yyy'
end
drop table #servers
Необходимо удалить на удаленном сервере несколько записей (в данном случае их 17) находящихся локально в некоторой временной таблице #DelRow.
create table #DelRow (id_row bigint)
insert into #DelRow (id_row) values (1)
insert into #DelRow (id_row) values (1000)
...
insert into #DelRow (id_row) values (1234)
этот запрос выполняется несколько секунд
select cr.* 
from [{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}].Rep.dbo.Rest cr
	left join #DelRow  r on r.id_row = cr.id_row
where cr.id_Farm = 357 and r.id_row is null

а этот выполняется безумно долго и как правило обламывается
delete cr
from [{RAAFFEA1-AE89-48B0-REP-A2DF5354DF04}].Rep.dbo.Rest cr
	left join #DelRow  r on r.id_row = cr.id_row
where cr.id_Farm = 357 and r.id_row is null
Причем на удаленном сервере Profiler показывает:
exec sp_cursorfetch 180150000, 16, 6402, 100
exec sp_cursorfetch 180150000, 16, 6502, 100
exec sp_cursorfetch 180150000, 16, 6602, 100
exec sp_cursorfetch 180150000, 16, 6702, 100
.....
exec sp_cursorfetch 180150000, 16, 6802, 100

Что не так делаю или что не донастроил?
Можно конечно курсором все поудалять, но как-то не красиво.
20 июл 11, 17:50    [11002071]     Ответить | Цитировать Сообщить модератору
 Re: Удаление на Linked Server  [new]
Glory
Member

Откуда:
Сообщений: 104751
Astakhov
Что не так делаю или что не донастроил?

Так и будет удаление идти. Локальный сервер не может же запихнуть на удаленные свои записи и сказать - удали ка там на основании соединения. Он вынужден перекачивать эти данные себе и сравнивать их
20 июл 11, 17:56    [11002125]     Ответить | Цитировать Сообщить модератору
 Re: Удаление на Linked Server  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Astakhov,

автор
Есть потребность собирать данные в общую базу при помощи LinkedServer

А почему репликацию не использовать?
20 июл 11, 18:00    [11002160]     Ответить | Цитировать Сообщить модератору
 Re: Удаление на Linked Server  [new]
Astakhov
Member

Откуда:
Сообщений: 255
Но почему тогда он на столько быстрее делает выборку?
Т.е. определить удаленному серверу что именно необходимо удалить не составляет труда.
20 июл 11, 18:00    [11002161]     Ответить | Цитировать Сообщить модератору
 Re: Удаление на Linked Server  [new]
Glory
Member

Откуда:
Сообщений: 104751
Astakhov
Но почему тогда он на столько быстрее делает выборку?
Т.е. определить удаленному серверу что именно необходимо удалить не составляет труда.

- Потому что перекачивается вся таблица
- удаленный сервер как раз ничего не определяет Кто бы заставил его это делать ?
20 июл 11, 18:03    [11002178]     Ответить | Цитировать Сообщить модератору
 Re: Удаление на Linked Server  [new]
Astakhov
Member

Откуда:
Сообщений: 255
Т.е. лобовое и самое простое решение Курсор?
Удалять записи по одной.
20 июл 11, 18:06    [11002191]     Ответить | Цитировать Сообщить модератору
 Re: Удаление на Linked Server  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Передавайте идентификаторы того, что надо удалить, на удаленный сервер, и через openquery удаляйте.
20 июл 11, 18:07    [11002199]     Ответить | Цитировать Сообщить модератору
 Re: Удаление на Linked Server  [new]
Astakhov
Member

Откуда:
Сообщений: 255
Fire83
Astakhov,

автор
Есть потребность собирать данные в общую базу при помощи LinkedServer

А почему репликацию не использовать?


По религиозным соображениям.
1. Согласно контракту, мы не имеем права ковыряться в базе. Соответственно не хотелось бы особо афишировать это.
А Репликация это написанное большими буквами "ЗДЕСЬ БЫЛ ВАСЯ"
2. "Разработчики" постоянно "типа развивают программу" и меняют базу. Если нужные таблицы будут под репликацией, то их запросы на обновление базы посыпятся.

Вот и приходится выкручиваться.
20 июл 11, 18:20    [11002276]     Ответить | Цитировать Сообщить модератору
 Re: Удаление на Linked Server  [new]
Astakhov
Member

Откуда:
Сообщений: 255
Гавриленко Сергей Алексеевич
Передавайте идентификаторы того, что надо удалить, на удаленный сервер, и через openquery удаляйте.

А как привильнее передать?
Временную то таблицу я там замутить не могу.
Или мутить статическую с названием GUID заливать в нее и потом удалять?
20 июл 11, 18:32    [11002319]     Ответить | Цитировать Сообщить модератору
 Re: Удаление на Linked Server  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Astakhov
Гавриленко Сергей Алексеевич
Передавайте идентификаторы того, что надо удалить, на удаленный сервер, и через openquery удаляйте.

А как привильнее передать?
Временную то таблицу я там замутить не могу.
Или мутить статическую с названием GUID заливать в нее и потом удалять?
Базу рядом сделайте, в ней таблицу с нормальным именем и каким-нибудь разделением по пользователям/спидам.
20 июл 11, 18:37    [11002339]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить