如何在SQL Server的左联接表上全文搜索多个条件?

时间:2020-03-05 18:45:26  来源:igfitidea点击:

我有一个查询,最初看起来像这样:

select c.Id, c.Name, c.CountryCode, c.CustomerNumber, cacc.AccountNumber, ca.Line1, ca.CityName, ca.PostalCode
from dbo.Customer as c
left join dbo.CustomerAddress as ca on ca.CustomerId = c.Id
left join dbo.CustomerAccount as cacc on cacc.CustomerId = c.Id
where  c.CountryCode = 'XX' and (cacc.AccountNumber like '%C17%' or c.Name like '%op%'       
or ca.Line1 like '%ae%' or ca.CityName like '%ab%' or ca.PostalCode like '%10%')

在具有90,000条记录的数据库上,此查询需要大约7秒钟的时间来执行(显然,所有联接和喜欢都在费劲)。

我一直在尝试找到一种方法,通过对相关列进行全文搜索来缩短查询执行时间。但是,我还没有看到这样的具有三个表联接的全文本搜索示例,特别是因为我的联接条件不是搜索项的一部分。

有没有办法在全文搜索中做到这一点?

@大卫

是的,在Ids上有索引。

我尝试在CustomerAddress内容(CityName,PostalCode等)上添加索引,这将查询降低到3秒,但是对于这样的事情,我仍然觉得太慢了。

请注意,所有文本字段(ids除外)都是nvarchars,而Line1是nvarchar 1000,因此可能会影响速度,但仍然会影响速度。

解决方案

回答

注意:这并不是真正的答案,仅是试图弄清楚实际上可能导致性能问题的原因。

90,000条记录实际上是一个很小的数据集,并且只有两个联接,查询相对简单。我们在CustomerAddress.CustomerId和CustomerAccount.CustomerId上有索引吗?与LIKE判断的条件相比,这似乎更可能导致性能问题。我们是否通常会同时搜索所有这些列的匹配项?

回答

我会赞同大卫的建议。我们可能想要检查RDBMS如何执行查询(例如,通过表扫描或者使用索引)。

一种快速检查是仅计时与文本搜索有关的查询部分。像这样的东西:

SELECT  ca.Line1, ca.CityName, ca.PostalCode
FROM    CustomerAddress as ca
WHERE   ca.CustomerId = <some id number>
AND     (ca.Line1 LIKE '%ae%' OR ca.CityName LIKE '%ab%' OR ca.PostalCode LIKE '%10%');

如果要花很长时间,则可能是" LIKE"问题(一次从" OR"行删除一个表达式,以查看是否只有这些列之一导致了速度下降)。如果很快,则怀疑是联接。

我们也可以为CustomerAccount表编写类似的查询。

回答

通过查询分析器运行它,然后查看查询计划是什么。我的猜测是,双根(即%ae%)搜索导致它在寻找匹配的行时确​​实进行了表扫描。双根搜索本质上是缓慢的,因为通常不能使用任何类型的索引来匹配它们。