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

Откуда:
Сообщений: 338
Пытаюсь выполнить удаление 4362 записей из таблицы [192.168..].[DS].[dbo].tDataSales (в ней 87 млн записей) на Lincked Server удовлетворяющих ограничению по индексированному полю ReportVersionID (выполняю на Server1):

	delete [192.168..].[DS].[dbo].tDataSales
	from	[192.168..].[DS].[dbo].tDataSales
			join #RVToDelete rvd
				on tDataSales.[ReportVersionID] = rvd.[ReportVersionID]


В таблице #RVToDelete всего одно значение, в [192.168..].[DS].[dbo].tDataSales для этого значения хранится всего 4362 записи (на поле ReportVersionID non-unique non-clustered index).
При выполнения выше указанного кода, delete висит 10 минут и отваливается с ошибкой:

OLE DB provider "SQLNCLI" for linked server "192.168.." returned message "Query timeout expired".
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "SQLNCLI" for linked server "192.168.." reported an error. Execution terminated by the provider because a resource limit was reached.
Msg 7306, Level 16, State 2, Line 1
Cannot open the table ""DistributorReports"."dbo"."tDataSales"" from OLE DB provider "SQLNCLI" for linked server "192.168..". 


Выполняю тот же самый delete, но не через Linck а на самом сервере (выполняю на Server2):

delete [DS].[dbo].tDataSales
from	[DS].[dbo].tDataSales
			join #RVToDelete rvd
				on tDataSales.[ReportVersionID] = rvd.[ReportVersionID]


естественно он выполняется мгновенно.

Версия первого сервера, с которого я делаю delete на LinckedServer:
Microsoft SQL Server 2005 - 9.00.5069.00 (X64)   Aug 22 2012 18:02:46   Copyright (c) 1988-2005 Microsoft Corporation  Standard Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2) 

Версия сервера, который выступает в качестве Linckeв Server:
Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 
	Oct 19 2012 13:38:57 
	Copyright (c) Microsoft Corporation
	Business Intelligence Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


Сразу оговорюсь, удалять данные сразу на Lincked сервере (Server2) я не могу, потому что данные для таблицы #RVToDelete я могу собрать только на Server1, а доступа с Server2 на Server1 - нет. Поэтом я удаляю данные на LinckedServer с Server1.

При выполнении первого delete на Lincked Server2 съедается 14 ГБ оперативки из 16 ГБ, а DATA файл у базы tempdb вырастает до 2 ГБ, хотя после перезагрузки службы mssqlserver он весит всего 8 МБ.
Как выполнить этот delete?
23 янв 13, 19:06    [13817629]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает Delete из большой таблицы на Linсked Server  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Если нет возможности создать хп на линкеде с параметром, то курсор по #RVToDelete и

EXEC [192.168..].[DS].[dbo].[sp_executesql] N'DELETE [dbo].tDataSales WHERE ReportVersionID = @ID', <параметры>
23 янв 13, 19:35    [13817737]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает Delete из большой таблицы на Linсked Server  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
pkarklin
то курсор по #RVToDelete...


лучше даже сразу LOCAL STATIC по запросу, которым Вы заполняете эту времянку.
23 янв 13, 19:41    [13817765]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает Delete из большой таблицы на Linсked Server  [new]
Гость333
Member

Откуда:
Сообщений: 3683
или так
EXEC (N'DELETE [DS].[dbo].tDataSales WHERE ReportVersionID = ?', @ID) AT [192.168..]
23 янв 13, 19:41    [13817767]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает Delete из большой таблицы на Linсked Server  [new]
Glory
Member

Откуда:
Сообщений: 104751
byverka
В таблице #RVToDelete всего одно значение, в [192.168..].[DS].[dbo].tDataSales для этого значения хранится всего 4362 записи (на поле ReportVersionID non-unique non-clustered index).
При выполнения выше указанного кода, delete висит 10 минут и отваливается с ошибкой:

Предварительный план запроса можно увидеть ?


А такого запроса план ?
delete [192.168..].[DS].[dbo].tDataSales
	from	[192.168..].[DS].[dbo].tDataSales
			inner remote join #RVToDelete rvd
				on tDataSales.[ReportVersionID] = rvd.[ReportVersionID]
23 янв 13, 20:00    [13817876]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает Delete из большой таблицы на Linсked Server  [new]
byverka
Member

Откуда:
Сообщений: 338
Glory, поскольку запрос завершается ошибкой - плана я не вижу.
Спасибо за идею, попробую сейчас с курсором.
24 янв 13, 10:03    [13819698]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает Delete из большой таблицы на Linсked Server  [new]
byverka
Member

Откуда:
Сообщений: 338
pkarklin
Если нет возможности создать хп на линкеде с параметром, то курсор по #RVToDelete и

EXEC [192.168..].[DS].[dbo].[sp_executesql] N'DELETE [dbo].tDataSales WHERE ReportVersionID = @ID', <параметры>


Спасибо огромное - так работает мгновенно!

Подскажите, почему так работает delete? Просто удаление из небольших таблиц на Lincked сервере проходит быстро и без динамического sql, а тут с чем связано такое поведение?
24 янв 13, 10:41    [13819944]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает Delete из большой таблицы на Linсked Server  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
byverka,

Чтобы сджоинить, вся таблица [192.168..].[DS].[dbo].tDataSales будет перекачена на локальный сервер и потом данные будут удаляться позаписно.
24 янв 13, 10:46    [13819957]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает Delete из большой таблицы на Linсked Server  [new]
Glory
Member

Откуда:
Сообщений: 104751
byverka
Glory, поскольку запрос завершается ошибкой - плана я не вижу.
Спасибо за идею, попробую сейчас с курсором.

Я вообще то просил предварительный план, а не реальный
24 янв 13, 10:51    [13819979]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает Delete из большой таблицы на Linсked Server  [new]
byverka
Member

Откуда:
Сообщений: 338
Glory
byverka
Glory, поскольку запрос завершается ошибкой - плана я не вижу.
Спасибо за идею, попробую сейчас с курсором.

Я вообще то просил предварительный план, а не реальный


Если я правильно смотрю предварительный план:

SET SHOWPLAN_TEXT ON
go
	delete [192.168..].[DS].[dbo].tDataSales
	from	 [192.168..].[DS].[dbo].tDataSales
		     join #RVToDelete rvd
			on tDataSales.[ReportVersionID] = rvd.[ReportVersionID]
go
SET SHOWPLAN_TEXT OFF
go


То он так же как при реальном выполнении запроса отваливается ровно через 10 минут с ошибкой.

Столкнулась с еще одной проблемой, когда я выполняю insert 630 035 записей в [192.168..].[DS].[dbo].tDataSales, приходится ждать 36 минут. Можно ли ускорить эту вставку тем, что я разделю эти 630 035 записей на несколько частей (если смогу конечно) и буду вставлять порциями в том же курсоре или цикле?
24 янв 13, 11:51    [13820442]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает Delete из большой таблицы на Linсked Server  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
byverka,

Вставку такого кол-ва записей лучше делать SSIS пакетом.
24 янв 13, 11:54    [13820467]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает Delete из большой таблицы на Linсked Server  [new]
byverka
Member

Откуда:
Сообщений: 338
pkarklin, Спасибо, думаю вы правы!
24 янв 13, 12:01    [13820514]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить