0

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

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 秒的时间来执行(显然所有的连接和点赞都是很费力的)。

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

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


@大卫

是的,ID 上有索引。

我已经尝试在 CustomerAddress 的东西(CityName、PostalCode 等)上添加索引,它将查询缩短到 3 秒,但我仍然发现这样的事情太慢了。

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

4

3 回答 3

1

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

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

于 2008-08-30T14:04:22.150 回答
1

我会赞同大卫的建议。您可能想要检查 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 表编写类似的查询。

于 2008-08-30T15:33:10.377 回答
1

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

于 2008-08-30T15:47:34.040 回答