English 中文(简体)
如何在SQL Server中对左联接表的多个条件进行全文搜索?
原标题:
  • 时间:2008-08-30 13:31:17
  •  标签:

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

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% )

在一个有90000条记录的数据库上,执行这个查询大约需要7秒(显然所有的联接和点赞都很费力)。

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

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


@大卫

是的,ID上有索引。

我尝试过在CustomerAddress内容(CityName、PostalCode等)上添加索引,它将查询时间缩短到了3秒,但我仍然觉得这太慢了。

请注意,所有的文本字段(ID除外)都是nvarchar,Line1是nvarchar1000,因此这可能会影响速度,但仍然会影响速度。

最佳回答

通过查询分析器运行它,看看查询计划是什么。我的猜测是,双根(即%ae%)搜索导致它在查找匹配行时进行表扫描。双根搜索天生就很慢,因为通常无法使用任何类型的索引来匹配它们。

问题回答

注意:这并不是一个真正的答案,只是试图澄清实际可能导致性能问题的原因。

90000条记录实际上是一个相当小的数据集,并且查询相对简单,只有两个联接。您对CustomerAddress.CustomerId和CustomerAccount.CustomerId有索引吗?这似乎比where条件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% );

如果这需要很长时间,那么LIKEs就是问题所在(一次从ORed行中删除一个表达式,看看是否只有其中一列导致了速度减慢)。如果它很快,那么连接是可疑的。

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





相关问题
热门标签