У меня есть простой запрос на выборку, я выполняющийся, как показано ниже:Связанный запрос сервера занимает много времени, если фильтр не является жестко
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. Может ли кто-нибудь объяснить эту разницу и дать какие-либо идеи о том, как я могу перенести выполнение жестко запрограммированного запроса в истинное?
Я хотел бы попробовать сделать хранимую процедуру связанный сервер, который принимает параметр таблицы. Когда вы вызываете такую процедуру, таблица идентификаторов должна быть отправлена на удаленный сервер в одну партию, которая хранится там как неявная временная таблица и используется там без отключений для каждой строки. –