【发布时间】:2015-10-22 09:04:07
【问题描述】:
我要加入 3 个不同的表格以实现自动完成功能,而且它必须很快。建议必须及时返回。我需要使用 LIKE 运算符查看 3 个不同的字段以获得答案。请参阅下面的详细信息。
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 + '%'= 快速; - 如果我使用:
WHERE CMPTHEIRCODE LIKE '%' + @Query + '%'= 快速;
只有当我连接它们时才会变慢?
【问题讨论】:
-
你没有
sargable谓词。您也正在使用函数调用。这就是为什么它可能很慢。如果可能,您也可以考虑将union更改为union all。 -
您可以将
OR连接在一起,而不是串联吗?例如:CMPNAME LIKE '%' + @Query + '%' OR ADTOWN LIKE '%' + @Query + '%' OR CMPTHEIRCODE LIKE '%' + @Query + '%' -
我尝试了 {OR} 但它仍然很慢。它也不会真正符合要求,因为他们可以按公司名称和城镇进行搜索,然后不会返回任何内容。 UNION ALL 没有帮助。函数调用没问题。请解释一下 SARGABLE 谓词建议?
-
但是您的搜索依赖于用户搜索由单个空格分隔的确切公司名称和城镇,如果他们搜索
Bob co, London -
您应该传入查询拆分部分。在单独的文本框中询问您的用户或使用应用程序逻辑来拆分用户的输入。在我看来,用这种方法找到一些东西或多或少是运气的问题。您依靠用户完全按照您期望的方式填写他们的查询...
标签: sql-server stored-procedures sql-server-2008-r2