Вы можете попробовать добавить в запрос предложение WHERE
.Обратите внимание, я немного изменил код, чтобы он работал в моей среде:
SELECT *
FROM OPENQUERY([RMVNSQL01\INST1],'SELECT [login], [FirstName], [LastName] FROM [smModel_20180807_UpdateTests_CORE].dbo.[SecurityUsers]')
WHERE ISNULL(PATINDEX('%emil%',[FirstName]),'0') + ISNULL(PATINDEX('%emil%',[LastName]),'0') >= '1'
SELECT *
FROM OPENQUERY([RMVNSQL01\INST1],'SELECT [login], [FirstName], [LastName] FROM [smModel_20180807_UpdateTests_CORE].dbo.[SecurityUsers] WHERE ISNULL(PATINDEX(''%emil%'',[FirstName]),''0'') + ISNULL(PATINDEX(''%emil%'',[LastName]),''0'') >= ''1''')
Вы можете видеть, что в вашем случае у нас есть удаленное сканирование, а затем фильтр.Во втором проход фильтра отсутствует:
Кроме того, если вы можете добавить индексы, вы можете добавить индексы для first
и last
назовите и попробуйте сначала выбрать только те строки, которые нужно вернуть:
CREATE TABLE #EmployeesFiltered
(
[EmployeeID] INT
);
INSERT INTO #EmployeesFiltered ([EmployeeID])
SELECT [EmployeeID]
FROM [LinkDB].dbo.[Employee]
WHERE ISNULL(PATINDEX('%Jack%',[Employee First Name]),'0') + ISNULL(PATINDEX('%Jack%',[Employee Last Name]),'0') >= '1';
SELECT *
FROM [LinkDB].dbo.[Employee] A
INNER JOIN #EmployeesFiltered B
ON A.[EmployeeID] = B.[[EmployeeID];
Даже если вам не разрешено полагаться на порядок индексов, вы будете работать с меньшим количеством данных, когда индексычитать (вам нужно только прочитать все идентификаторы пользователей, имена и фамилии. Затем, имея идентификаторы, просто отфильтруйте кластерный индекс.