0

我有一列的全文索引中包含这样的数据表:全文索引搜索有大量页面的读取

searchColumn 
90210 Brooks Diana Miami FL [email protected] 5612233395 

列是拉链的集合体,姓氏,名称,城市,州,电子邮件和电话号码。

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

我担心的问题是在对此列执行查询时发生大量读取操作。我使用的查询是:

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页读取。我知道这些方法是完全不同的,但我试图理解为什么全文版本有更多的读取,以及是否有任何方法可以将它们降低到接近使用常规索引时获得的数字。

回答

1

我对此有几点想法。首先,Select *将生成大量的页面读取,因为它必须拉出所有可能被索引或可能不被索引的列。当你拉动每一列时,最有可能不会利用那里最好的索引计划。

对于Where子句,当使用@searchTerm和“FL”和“90210 *”和“Diana *”和“Brooks *”的值时,每次运行时必须多次检查数据页。想想如果你必须这样做,你将如何查看这些信息。你看看一张纸上的信息,看看搜索列是否包含FL。现在它包含FL和90210 *。现在它包含那些加戴安娜等等。

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

如果你想了解更多关于这方面的信息,我会建议现在免费的布伦特奥扎尔班。 How to think like the SQL Server Engine

我希望有所帮助。

+0

好的,我收到了关于'*'的评论,其实我只是拉我需要的列,我只是把'*'不要太混乱,因为有很多列。另外,我认为如果引擎已经在第一次拉到页面时每次必须检查它,那么引擎就会去阅读页面,这很奇怪。但我会检查Brent的教程,谢谢! –