Я присоединяюсь к 3 различным таблицам для функции автозаполнения, и она должна быть быстрой. Предложения должны возвращаться славным и быстрым. Мне нужно посмотреть 3 разных поля для ответа с помощью оператора LIKE
. См. Подробности ниже.Хранимая процедура SQL Server 2008 R2 медленная
DECLARE @Space AS CHAR(1) = ' ';
SELECT TOP (@QuantityToReturn) *
FROM
(SELECT
C.CMPID, C.CMPNAME, C.CMPTHEIRCODE, AD.ADTOWN
FROM COMPANY C
JOIN [dbo].[COMPADDRESS] CA ON CA.CMPID = C.CMPID
JOIN [dbo].[ADDRESS] ad ON AD.ADID = CA.ADID
JOIN [dbo].SUPPLIER SUP ON C.CMPID = SUP.CMPID
WHERE
(C.CMPID = @LoggedInUserId
OR @LoggedInUserId = dbo.fnIsAParentCompanyOf(@LoggedInUserId, C.CMPID)
OR @LoggedInUserId = 12345)
UNION
SELECT
C.CMPID, C.CMPNAME, C.CMP_THEIRCODE, AD.ADTOWN
FROM COMPANY C
JOIN [dbo].[COMPADDRESS] CA ON ca.CMPID = C.CMPID
JOIN [dbo].[ADDRESS] AD ON AD.ADID = CA.ADID
JOIN [dbo].CUSTOMER CUS ON C.CMPID = CUS.CMPID AND CUS.CUSTISTHIS = 1
WHERE
(C.CMPID = @LoggedInUserId
OR @LoggedInUserId = dbo.fnIsAParentCompanyOf(@LoggedInUserId, C.CMPID)
OR @LoggedInUserId = 12345)
) AS Results
WHERE
(CMPNAME + @Space + ADTOWN + @Space + CMPTHEIRCODE) LIKE '%' + @Query + '%'
Приведенный выше код медленно (~ 9sec)
- Если я использую:
WHERE CMPNAME LIKE '%' + @Query + '%'
= быстро; - Если я использую:
WHERE ADTOWN LIKE '%' + @Query + '%'
= quick; - Если я использую:
WHERE CMPTHEIRCODE LIKE '%' + @Query + '%'
= quick;
Как раз когда я соединяю их, что идет медленно?
У вас нет предиката 'sargable'. Также вы используете вызовы функций. Вот почему это может быть медленным. Также вы можете рассмотреть возможность изменения 'union' на' union all', если это возможно. –
Вместо того, чтобы конкатенировать, вы можете «ИЛИ» их вместе? Например: 'CMPNAME LIKE '%' + @Query + '%' ИЛИ ADTOWN LIKE '%' + @Query + '%' ИЛИ CMPTHEIRCODE LIKE '%' + @Query + '%'' – DavidG
Я попробовал {OR} но он все еще медленный. Также это не соответствовало бы требованиям, потому что они могли искать по названию компании и городу, которые тогда ничего не вернули бы. UNION ALL не помог. Вызов функции прекрасен. Объясните предложение SARGABLE предиката, пожалуйста? – cocojiambo