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

Откуда: Moscow
Сообщений: 610
Доброго времени суток!

Сервер1 СУБД:Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

Сервер2 СУБД: Microsoft SQL Server 2005 - 9.00.5000.00 (X64) Dec 10 2010 10:38:40 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)

Есть запрос:

select  
	o1.operdate,
	r1.ResourceID,
	r1.Brief as Account, 
	coalesce(i1.[Name]+' ', '') + coalesce(i1.Name1+' ', '') + coalesce(i1.Name2, '') as ClientName,
	o2.qtybs as SummaN

from 
	toperpart o1(nolock)
	inner join tresource r1(nolock) on r1.resourceid = o1.resourceid /*d.ResourceID*/ and left(r1.Brief, 5) = '40802'
	inner join tinstitution i1(nolock) on i1.institutionid = r1.instownerid
	inner join toperpart o2(nolock) on o2.operationid = o1.operationid and o2.chartype = -1	
	inner join tresource r2(nolock) on r2.resourceid = o2.resourceid /*d.ResourcePsvID*/ and left(r2.Brief, 5) = '20202'
where 

	o1.OperDate between 'Apr 16 2012 12:00:00:000AM' and 'Apr 17 2012 12:00:00:000AM'
	and o1.InstitutionID = 2000
	and o1.BalanceID = 2140
	and o1.CharType = 1	
	and o1.Confirmed = 1


Если его запускать непосредственно на сервере2 то он выполняется меньше чем за секунду и возвращает 23 записи, несмотря на то что таблицы tresource и toperpart содержат около сотни млн записей

Если же Этот запрос напускать на сервере 1, на котором есть линк на сервер2, то запрос выполняется более 20 мин.

Более подробнее: Запрос обращается к БД лежащем на сервере2, запускается же он на сервере 1, на котором сделан линк к серверу 2.

Планы выполнения ms sql строит абсолютно разные.
Вопрос: Как сократить время выполнения запроса?

К сообщению приложен файл (план на сервере2.sqlplan - 68Kb) cкачать
17 апр 12, 16:24    [12428583]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
План на сервере 1

К сообщению приложен файл (план на сервере1.sqlplan - 54Kb) cкачать
17 апр 12, 16:26    [12428603]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
Glory
Member

Откуда:
Сообщений: 104751
andrew shalaev
Если же Этот запрос напускать на сервере 1, на котором есть линк на сервер2, то запрос выполняется более 20 мин.

И как же вы его запускаете, если в вашем запросе у объектов нет имени сервера ?
17 апр 12, 16:31    [12428639]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Glory,
Вот так запускаю :)
В первых постах почему решил удалить их
select  
	o1.operdate,
	r1.ResourceID,
	r1.Brief as Account, 
	coalesce(i1.[Name]+' ', '') + coalesce(i1.Name1+' ', '') + coalesce(i1.Name2, '') as ClientName,
	o2.qtybs as SummaN

from 
	linkserv.db.dbo.toperpart o1(nolock )
	inner  join linkserv.db.dbo.tresource r1(nolock ) on r1.resourceid = o1.resourceid /*d.ResourceID*/ and left(r1.Brief, 5) = '40802'
	inner  join linkserv.db.dbo.tinstitution i1(nolock ) on i1.institutionid = r1.instownerid
	inner  join linkserv.db.dbo.toperpart o2(nolock ) on o2.operationid = o1.operationid and o2.chartype = -1	
	inner  join linkserv.db.dbo.tresource r2(nolock ) on r2.resourceid = o2.resourceid /*d.ResourcePsvID*/ and left(r2.Brief, 5) = '20202'
where 
	
	o1.OperDate between 'Apr 16 2012 12:00:00:000AM' and 'Apr 17 2012 12:00:00:000AM'
	and o1.InstitutionID = 2000
	and o1.BalanceID = 2140
	and o1.CharType = 1	
	and o1.Confirmed = 1
17 апр 12, 16:34    [12428656]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
iljy
Member

Откуда:
Сообщений: 8711
andrew shalaev,

и вы посмотрели план? У вас тянутся лишние данные из удаленных таблиц, поэтому и долго. Используйте EXECUTE AT либо OPENROWSET.
17 апр 12, 16:34    [12428658]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
Glory
Member

Откуда:
Сообщений: 104751
andrew shalaev
Вот так запускаю :)
В первых постах почему решил удалить их

У вас с удаленного сервера перекачиваются огромные таблицы
4 штуки Remote query c общим числом записей за 20млн.
17 апр 12, 16:37    [12428674]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
andrew shalaev
Как сократить время выполнения запроса?

процедурку сделать на сервере2 и ее дергать с сервера1
17 апр 12, 17:10    [12428922]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
iljy,

Сделал так:

EXECUTE
('

select  
	o1.operdate,
	r1.ResourceID,
	r1.Brief as Account, 
	coalesce(i1.[Name]+'' '', '''') + coalesce(i1.Name1+'' '', '''') + coalesce(i1.Name2, '''') as ClientName,
	o2.qtybs as SummaN

from 
	dbo.toperpart o1(nolock )
	inner  join work5nt.dbo.tresource r1(nolock ) on r1.resourceid = o1.resourceid /*d.ResourceID*/ and left(r1.Brief, 5) = ''40802''
	inner  join work5nt.dbo.tinstitution i1(nolock ) on i1.institutionid = r1.instownerid
	inner  join work5nt.dbo.toperpart o2(nolock ) on o2.operationid = o1.operationid and o2.chartype = -1	
	inner  join work5nt.dbo.tresource r2(nolock ) on r2.resourceid = o2.resourceid /*d.ResourcePsvID*/ and left(r2.Brief, 5) = ''20202''
where 
	
	o1.OperDate between ''Apr 16 2012 12:00:00:000AM'' and ''Apr 17 2012 12:00:00:000AM''
	and o1.InstitutionID = 2000
	and o1.BalanceID = 2140
	and o1.CharType = 1	
	and o1.Confirmed = 1
') 
at DIAS10


а как теперь передать переменные ''Apr 16 2012 12:00:00:000AM'' и ''Apr 17 2012 12:00:00:000AM'' ?
17 апр 12, 17:30    [12429059]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
andrew shalaev
а как теперь передать переменные ''Apr 16 2012 12:00:00:000AM'' и ''Apr 17 2012 12:00:00:000AM'' ?

declare @str varchar(max)

EXECUTE
(@str)
at DIAS10

ну а строку как склеить уж догадаешься
17 апр 12, 17:32    [12429071]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
Glory
Member

Откуда:
Сообщений: 104751
andrew shalaev
как теперь передать переменные ''Apr 16 2012 12:00:00:000AM'' и ''Apr 17 2012 12:00:00:000AM'' ?

Прочитать про синтаксис EXEC AT в хелпе
17 апр 12, 17:32    [12429073]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ivan Durak
andrew shalaev
а как теперь передать переменные ''Apr 16 2012 12:00:00:000AM'' и ''Apr 17 2012 12:00:00:000AM'' ?

declare @str varchar(max)

EXECUTE
(@str)
at DIAS10

ну а строку как склеить уж догадаешься

не надо учить плохому
17 апр 12, 17:41    [12429134]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
iljy
Ivan Durak
пропущено...

declare @str varchar(max)

EXECUTE
(@str)
at DIAS10

ну а строку как склеить уж догадаешься

не надо учить плохому

хорошему я уже научил в 17.10
процедурку сделать на сервере2 и ее дергать с сервера1
17 апр 12, 17:49    [12429197]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ivan Durak
iljy
пропущено...

не надо учить плохому

хорошему я уже научил в 17.10
процедурку сделать на сервере2 и ее дергать с сервера1

Это не повод.
17 апр 12, 17:51    [12429219]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Ivan Durak,

Спасибо, собрал в запрос в переменную, выполняется за 5 сек.

Glory
Прочитать про синтаксис EXEC AT в хелпе


Прочитал, но так и не понял как использовать переменную.
18 апр 12, 15:21    [12433613]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ivan Durak,

добились своего?

andrew shalaev
Glory
Прочитать про синтаксис EXEC AT в хелпе


Прочитал, но так и не понял как использовать переменную.

BOL - EXECUTE - Пример М.Использование параметра с командами AT имя_связанного_сервера и EXECUTE
18 апр 12, 15:28    [12433681]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
Glory
Member

Откуда:
Сообщений: 104751
andrew shalaev
Прочитал, но так и не понял как использовать переменную.

Прямо так и использовать, как показано в хелпе
18 апр 12, 15:29    [12433685]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Glory,
авторGlory
Прямо так и использовать, как показано в хелпе
and
iljy
BOL - EXECUTE - Пример М.Использование параметра с командами AT имя_связанного_сервера и EXECUTE


Значит можно и знаком "?" воспользоваться, как показано в примере ниже, а вчера как то не обратил на это внимание...

EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name 
    FROM AdventureWorks2012.Production.Product
    WHERE ProductID = ? ', 952) AT SeattleSales;
GO



iljy
Ivan Durak, добились своего?

Чем плох предложенный им метод?
18 апр 12, 15:52    [12433898]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
iljy
Member

Откуда:
Сообщений: 8711
andrew shalaev
iljy
Ivan Durak, добились своего?

Чем плох предложенный им метод?

Ну помимо всяких изысков типа перекомпиляций, сложностей с проверкой параметров и т.п., есть еще такая банальная вещь, как SQL Injection.
18 апр 12, 16:45    [12434414]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
iljy,

Данная переменная @SQL, в которую записывается запрос, не лежит где нить на форме открытой для пользователя, единственная переменная это дата, и если стоит маска на это поле(тип данных дата), то исключается всякая возможность вставки вредного кода в переменную @SQL.
Или я не прав?
18 апр 12, 16:50    [12434470]     Ответить | Цитировать Сообщить модератору
 Re: Долгое выполнение запроса на линк сервере  [new]
iljy
Member

Откуда:
Сообщений: 8711
andrew shalaev,

привычка к разбрасыванию граблей легко закрепляется, но трудно изживается.
18 апр 12, 21:13    [12435835]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить