我在一个表中的一个列上有一个全文索引,其中包含如下数据:
searchColumn
90210 Brooks Diana Miami FL diana.brooks@email.com 5612233395该列由邮政编码、姓氏、名字、城市、州、电子邮件和电话号码组成。
我使用此列根据任何可能的信息搜索客户。
我担心的问题是在此列上执行查询时发生的大量读取。我使用的查询是:
declare @searchTerm varchar(100) = ' "FL" AND "90210*" AND "Diana*" AND "Brooks*" '
select *
from CustomerInformation c
where contains(c.searchColumn, @searchTerm)现在,当运行事件探查器时,我可以看到这个搜索大约有50.000次页面读取才能返回一行,而不是使用常规索引和多变量的不同方法,如@firstName,@LastName,如下所示:
WHERE C.FirstName like coalesce(@FirstName + '%' , C.FirstName)
AND C.LastName like coalesce(@LastName + '%' , C.LastName)
etc.使用这种方法,我只能获得大约140个页面阅读量。我知道这两种方法有很大的不同,但我试图理解为什么全文本版本的阅读量要高得多,如果有任何方法可以将其降低到更接近使用常规索引时的读取量。
发布于 2016-11-04 01:18:41
我对此有几个想法。首先,Select *将生成大量的页面读取,因为它必须拉取可能已索引或可能未索引的所有列。当您提取每一列时,它很可能不会使用最好的索引计划。
至于Where子句,当使用@searchTerm以及"FL“、"90210*”、"Diana*“和"Brooks*”的值时,它必须在每次运行时多次检查数据页。想一想,如果你不得不这样做,你会如何查找这些信息。你看一张上面有信息的纸,看看搜索栏是否包含FL。现在它是否包含FL和90210*。现在它是否包含了这两个外加Diana...etc。
您可以理解为什么它必须一遍又一遍地返回页面阅读。第二个查询只需查看狭义定义的2列。
如果你想了解更多关于这方面的信息,我推荐Brent Ozar的一个课程,现在是免费的。How to think like the SQL Server Engine
我希望这能有所帮助。
https://stackoverflow.com/questions/40406522
复制相似问题