在 SQL Server 中的全文索引查询的性能改进

文章翻译 文章翻译
文章编号: 2549443 - 查看本文应用于的产品
展开全部 | 关闭全部

概要

本文介绍了一种提高 Microsoft SQL Server 查询使用全文本搜索谓词 (如包含考虑),并且,还可以筛选数据的性能的方法。例如,此方法提高下列查询的性能:
select * from dbo.ftTest where CONTAINS(TextData, '"keyword"') and CDate > @date
此方法允许您设计查询、 表架构和全文本索引中全文本搜索引擎过滤出结果之前它们被发送到关系引擎, 的这样一种方式。因此,关系引擎没有筛选一个大型数据集。

更多信息

当您创建全文搜索查询,原则因素会影响查询的性能是全文本搜索引擎必须处理之前的剩余数据量的数据发送到关系引擎。在 SQL Server 中可以通过过滤掉行早以减少必须以后处理的行数来提高查询性能。

在 SQL Server 2008 年之前发布的版本的 SQL Server,全文搜索引擎返回与搜索项,匹配的所有行,然后,关系引擎将应用任何筛选器。在 SQL Server 2008年中,SQL Server 2008 R2,以及 SQL Server 2012年进行改进到这种现象。但是,很难使用这些改进,因为全文搜索索引非常以不同的方式组织从数据库索引。此外,全文搜索引擎和关系引擎工作非常不同。因此,本文介绍的方法使用依次函数 (TVF) 以早期筛选出的行并减少必须以后处理的行数。

例如,下面的查询计划返回 131051 包含搜索字符串匹配的行。此外,计划中的联接运算符执行通过使用索引查找的附加筛选。
Rows StmtText 
-------------------- -----------------------------------------------------------------------------------------------------------
1167 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate> '08/05/2019' 

1167 |--Merge Join(Left Semi Join, MERGE:([FTSdb].[dbo].[fttest].[ID])=(FulltextMatch.[docid]), RESIDUA
5858 |--Sort(ORDER BY:([FTSdb].[dbo].[fttest].[ID] ASC)) 
5858 | |--Clustered Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[clidx1]), SEEK:([FTSdb].[
131051 |--Table-valued function 
但是,如果查询包含一个谓词作为全文唯一索引键列,全文搜索引擎可以使用谓词结果全文索引级别进行筛选。在此情况下,TVF 返回量小得多的数据之前,必须应用更多筛选。例如,下面的查询指定五个值必须符合 c2 条件,并 TVF 返回与五个值匹配的结果:
Rows StmtText 

-------- ---------------------------------------------------------------------------------------------------------------------------------
5 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate > '08/05/2019' and ID in ( 654051, 644051, 649106, 465, 105)

5 |--Nested Loops(Left Semi Join, OUTER REFERENCES:([FTSdb].[dbo].[fttest].[ID])) 
5 |--Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[idx1]), SEEK:([FTSdb].[dbo].[fttest].[ID]=(105) OR ...
5 |--Table-valued function
全文本搜索引擎能力压下由唯一索引参数使用的值是以下方法的基础。

如果谓词包含日期时间数据类型列,可以唯一索引键的列中包括日期信息,以便发出此谓词相匹配的行。若要执行此操作,必须从逻辑上结合的键列中的日期信息。但是,您可能还需要更改键列数据类型和使用查询的应用程序。

若要实现此方法,请更改全文本独特的数据类型键 ID 与 BIGINT。第 4 个字节的键 ID 捕获年份、 月份和日期从日期列中和过去的 4 个字节的值都相同。例如,键 ID 就可以查阅到一年的第一个字节下, 一个字节就可以查阅到的月份,而最后两个字节就可以查阅到的日期。应用程序必须适应此数据类型更改。

然后,转换到注册表项上的谓词谓词范围 id。例如,"x<>< y"="" range="" predicate="" can="" be="" translated="" to="" the="" "(x*2^32="">< id="">< y*2^32)"="" predicate.="" because="" the="" translated="" predicate="" is="" a="" predicate="" on="" the="" full-text="" key,="" the="" predicate="" will="" be="" pushed="" down="" into="" the="" full-text="" streaming="" table-valued="" functions="" (stvf).="" this="" behavior="" effectively="" performs="" searches="" within="" the="" date="">

属性

文章编号: 2549443 - 最后修改: 2013年3月22日 - 修订: 2.0
这篇文章中的信息适用于:
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Enterprise Evaluation
  • Microsoft SQL Server 2008 R2 Datacenter
  • Microsoft SQL Server 2008 R2 Developer
  • Microsoft SQL Server 2008 R2 Enterprise
  • Microsoft SQL Server 2008 R2 Standard
  • Microsoft SQL Server 2012 Developer
  • Microsoft SQL Server 2012 Standard
  • Microsoft SQL Server 2012 Web
  • Microsoft SQL Server 2012 Enterprise
关键字:?
kbmt KB2549443 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 2549443
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com