2008-08-30 33 views
0

我有一个查询,原来是这样的:如何在SQL Server中的左连接表上全文搜索多个条件?

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秒,但我仍然发现对于这样的事情太慢。

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

回答

1

通过查询分析器运行它,查看查询计划是什么。我的猜测是,当查找匹配的行时,双根(即。%ae%)搜索会导致它执行表扫描。双根搜索本质上很慢,因为您不能使用任何类型的索引来匹配它们。

1

注意:这不是一个真正的答案,只是试图阐明可能导致性能问题的实际情况。

90,000条记录实际上是一个相当小的数据集,查询相对简单,只需两次连接。在CustomerAddress.CustomerId和CustomerAccount.CustomerId上有索引吗?这似乎更可能导致性能问题比where条件LIKE谓词。您是否一般在同一时间搜索所有这些列上的匹配项?

1

我会回应David的建议。您可能想要检查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 s为这个问题(在从OR ed行一次删除一个表情,看看是否只是那些列的一个原因造成的减速) 。如果速度很快,那么这些连接是可疑的。

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