2017-01-24 1 views
1

У меня есть простой запрос на выборку, я выполняющийся, как показано ниже:Связанный запрос сервера занимает много времени, если фильтр не является жестко

SELECT Id FROM [LinkedServer].[Catalog].[dbo].[someTable] WHERE date = @someDate AND Id IN (SELECT Id FROM ids) 

ids представляет собой таблицу один столбец со списком 50 или около идентификаторов (FWIW - это все строки, а не ints), а LinkedServer - это сервер через Атлантику. someTable - это отображение многих пар (~ 300 м) (date,ID) в значения и имеет соответствующий PK.

Любопытно, что я не могу получить мою голову вокруг, что этот запрос принимает 10s для выполнения - но, если я заменю (SELECT Id FROM ids) с жестко закодированным содержанием идентификаторов, поэтому запрос читает

SELECT Id FROM [LinkedServer].[Catalog].[dbo].[someTable] WHERE date = @someDate AND Id IN ('id1','id2', ..., 'id50') 

говорит, он выполняется в < 1s. Может ли кто-нибудь объяснить эту разницу и дать какие-либо идеи о том, как я могу перенести выполнение жестко запрограммированного запроса в истинное?

+0

Я хотел бы попробовать сделать хранимую процедуру связанный сервер, который принимает параметр таблицы. Когда вы вызываете такую ​​процедуру, таблица идентификаторов должна быть отправлена ​​на удаленный сервер в одну партию, которая хранится там как неявная временная таблица и используется там без отключений для каждой строки. –

ответ

1

Первый запрос выполняется распределенным способом на двух серверах. Это может быть медленным, потому что сервер A не знает статистику для сервера B и не может быть создан надлежащий план выполнения.

Второй запрос «Передает» запрос к серверу B, запрос затем работает исключительно на сервере B, и, наконец, результаты передаются обратно к серверу А.

Смежные вопросы