首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全文索引搜索具有大量的页面读取

全文索引搜索具有大量的页面读取
EN

Stack Overflow用户
提问于 2016-11-04 00:19:28
回答 1查看 87关注 0票数 0

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

代码语言:javascript
复制
searchColumn
90210 Brooks Diana Miami FL diana.brooks@email.com 5612233395

该列由邮政编码、姓氏、名字、城市、州、电子邮件和电话号码组成。

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

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

代码语言:javascript
复制
declare @searchTerm varchar(100) = ' "FL" AND "90210*" AND "Diana*" AND "Brooks*" '

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

现在,当运行事件探查器时,我可以看到这个搜索大约有50.000次页面读取才能返回一行,而不是使用常规索引和多变量的不同方法,如@firstName@LastName,如下所示:

代码语言:javascript
复制
WHERE C.FirstName like coalesce(@FirstName + '%' , C.FirstName)
    AND C.LastName like coalesce(@LastName + '%' , C.LastName)
    etc.

使用这种方法,我只能获得大约140个页面阅读量。我知道这两种方法有很大的不同,但我试图理解为什么全文本版本的阅读量要高得多,如果有任何方法可以将其降低到更接近使用常规索引时的读取量。

EN

回答 1

Stack Overflow用户

发布于 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

我希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40406522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档