我加入3个不同的表以实现自动完成功能,并且必须快速。建议必须回复良好且及时。我需要通过LIKE
运算符来查看3个不同的字段以获得答案。见下面的细节。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