2010-11-14 80 views
1

我正在使用CONTAINS关键字来搜索SQL-Server全文目录。 我查询的表包含(包括其他列)全文索引的文本列和表示行添加日期(并具有正常索引)的“added_date”列。减少从全文查询返回的结果数

该表包含大约7M行。全文目录上的特定查询可能返回〜1M行。我希望使用“added_date”列来减少查询返回的行数。

问题是,当我添加“added_date”条件时,我在执行计划中看到数据库将查询表两次:一次用于全文目录(在执行计划中称为“远程扫描”), ,并为日期条件一次。这迫使数据库连接来自查询的两个部分的结果,因此没有实现性能改进。

有没有办法强制SQL Server全文查询日期条件应用后剩下的行?

编辑:查询看起来像

SELECT reason, added_date FROM reasons_table WHERE CONTAINS(reason, 'a_reason') AND added_date > getdate()-5

+0

请写信给您使用的查询和索引。 – 2010-11-14 15:52:50

+1

根据这个:http://technet.microsoft.com/en-us/library/cc917695.aspx 我想要实现的是不可能的: 因为MSFTESQL服务在数据库引擎之外运行,所以SQL Server 2005不能将SQL查询的谓词扩展到全文搜索。因此,即使您的查询可能具有显着减少查询返回的最终行数的附加条件,MSFTESQL服务仍会返回目标搜索的所有匹配键。 – Moshe 2010-11-14 17:17:31

回答

2

正如您所指出的那样,这是在你希望的方式几乎是不可能的。根据您的情况的大背景,您有一些选择。事实上,那篇文章给你一些帮助。

这里有一些想法浮现在脑海中,当我读了文章:

  1. 嵌入过滤标准文本中的
    • 时退房“考虑嵌入的筛选条件中的索引的文本关键字”文章中的子弹。
    • 这基本上说你可以考虑把你的日期作为一个易于定位的字符串在文本中。例如,“<增加日期:YYYYMMDD >”在处理文本之前你可以去掉某些东西。
    • 对于范围来说可能不是很好,尽管对此的解决方法是粗粒度过滤术语。也就是说,而不是DateAdded:YYYYMMDD,使用WeekAdded:YYYYWW,那么您将拉动FTS的7-14天价值,您的added_date谓词可以进一步缩小它的范围。
    • 在100个搜索字词之前可能停止实用。
    • 添加过滤标准是指运行的更新,将其添加到所有7米+记录
    • 否则,这似乎是最接近的精神,你是什么后
  2. 两个表 - 水平分区
    • 如果您主要只回顾几天,你可以尝试简单地保留与FTS第二个表,只有最后的n天记录。
    • 可能是PITA来维护。
  3. 两个表 - 垂直分区
    • 拆分你的表到1你会在SQL过滤的价值观和另一个与FTS文本。然后使用CONTAINSTABLE将它们放在一起。
    • 您仍然在做2个表格匹配。但是,其中一个好处是,缩小的表格将更紧密,每页的记录更多,从而减少IO。
    • 不可否认,这种改进甚至可能不明显。而且,覆盖指数可能会一样好。
  4. 与它生活
    • 你有性能数据表明,这种双读是导致业绩亏大了?假设你的PK是< 10个字节,并且你在搜索字段中有一个索引,我想你会需要20k +过滤后的记录才能注意到额外的读取?

做这些工作,为您的具体情况?

+0

实际上,提示#3以及一些代码修改可以生成一个包含FTS测试的小得多的表格,该表格可以在稍后与原始表格连接。我将尝试实现这个解决方案,或基准另一个索引解决方案,如lucene。 – Moshe 2010-12-31 13:33:04