我在表中包含以下数据的列的全文索引:
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
,{ {1}},如下所示:
@LastName
使用这种方法我只能获得大约140页的页面读取。我知道方法是完全不同的,但我试图理解为什么全文版本有更多的读取,如果有任何方法我可以把它降低到更接近我使用常规时得到的数字索引。
答案 0 :(得分:1)
我对此有几点想法。首先,Select *将生成大量的页面读取,因为它必须拉出可能会或可能不会被索引的所有列。当你拉出每一列时,它很可能不会使用那里最好的指数计划。
关于你的Where子句,当使用@searchTerm和" FL"的值时AND" 90210 *"和"戴安娜*" AND"布鲁克斯*"它必须在每次运行时多次检查数据页。想想如果必须这样做,你将如何查找这些信息。你看一张纸上的信息,看看搜索栏是否包含FL。现在它包含FL和90210 *。现在它包含了加上戴安娜......等等。
你可以看到它为什么不得不一直回到页面阅读。第二个查询只需要查看狭义定义的2列。
如果您想了解更多相关信息,我建议您现在免费获得Brent Ozar的课程。 How to think like the SQL Server Engine
我希望有所帮助。