0

我在包含如下数据的表中的列上有一个全文索引:

searchColumn
90210 Brooks Diana Miami FL diana.brooks@email.com 5612233395

该列是 Zip、姓氏、名字、城市、州、电子邮件和电话号码的聚合。

我使用此列根据任何可能的信息搜索客户。

我担心的问题是在对该列进行查询时发生大量读取。我正在使用的查询是:

declare @searchTerm varchar(100) = ' "FL" AND "90210*" AND "Diana*" AND "Brooks*" '

select *
from CustomerInformation c
where contains(c.searchColumn, @searchTerm)

现在,当运行 Profiler 时,我可以看到该搜索有大约 50.000 次页面读取以返回单行,而不是使用使用常规索引和多个变量的不同方法时,分解为@firstName, @LastName,如下所示:

WHERE C.FirstName like coalesce(@FirstName + '%' , C.FirstName)
    AND C.LastName like coalesce(@LastName + '%' , C.LastName)
    etc.

使用这种方法,我只能读取大约 140 页。我知道这些方法完全不同,但我试图理解为什么全文版本的阅读量如此之多,以及是否有任何方法可以将其降低到更接近使用常规索引时获得的数字。

4

1 回答 1

1

我对此有几个想法。首先, Select * 将产生大量的页面读取,因为它必须提取所有可能被索引或可能未被索引的列。当您拉出每一列时,它很可能不会使用最好的索引计划。

至于您的 Where 子句,当使用 @searchTerm 和 "FL" AND "90210*" AND "Diana*" AND "Brooks*" 的值时,每次运行时都必须多次检查数据页。想想如果必须这样做,您将如何查找这些信息。你看一张上面有信息的纸,看看搜索栏是否包含 FL。现在它是否包含 FL 和 90210*。现在它是否包含这两个加上戴安娜......等等。

您可以看到为什么它必须不断地返回页面来一遍又一遍地阅读。第二个查询只需要查看狭义定义的 2 列。

如果您想了解更多信息,我建议 Brent Ozar 的课程现在是免费的。 如何像 SQL Server 引擎一样思考

我希望这会有所帮助。

于 2016-11-03T17:18:40.847 回答