好的我在我的JobsToDo表上创建了一个全文搜索索引,但是我关心的是这是否会使我桌上的其他索引变得无用。我在此表中的CreatedDate字段上有一个普通的非聚集索引。因此,当我运行全文搜索时,它返回结果,然后我通过CreatedDate> = GETDATE() - 7过滤我的全文搜索,以获得最近7天的JobsToDo值。现在是我正常使用的索引(在CreatedDate上)还是忽略了这个索引并纯粹搜索全文索引,然后再次搜索整个表上的日期条件?我的查询如下:
// First create an index
CONSTRAINT [IX_JobsToDo] UNIQUE NONCLUSTERED
(
[CreateDate]
)
// Now run query
SELECT JobId,
Title,
FROM JobsToDO
FREETEXTTABLE (JobsToDo, (Title, [Description]), 'somestring')
AND CreatedDate >= GETDATE() - 7;
总结一下,这个查询是否会使用我在CreatedDate上创建的索引?
答案 0 :(得分:1)
是的,查询优化器将考虑使用FT和非FT索引的混合。有关详细信息,请参阅此白皮书SQL Server 2005 Full-Text Queries on Large Catalogs: Lessons Learned。
BTW您的CreateDate非聚集索引仍然受其他索引使用良好做法的影响。在您的情况下,如果过去7天内的记录数量足够大,查询优化可能会落在Index Tipping Point,因为CreateDate不包括Title(假设JobId是聚集索引键的一部分,否则JobId也需要覆盖)。另一方面,如果FT搜索条件非常有选择性,那么可以省略CreatedDate索引,聚集索引将用于探测FT索引找到的候选项并验证CreatedDate条件。
答案 1 :(得分:0)
这样做的结果完全取决于您使用的SQL Server版本。在2008年之前,当您同时拥有全文和非全文谓词时,SQL Server对查询的每个部分都有单独的查询计划。自2008年以来,所有工作现在都在SQL Server中完成,并且它提出了单个查询计划。
结论:如果全文对您很重要,请使用SQL Server 2008。执行此操作的另一个原因是全文索引现在位于数据库内部,并且像所有其他数据库对象一样进行管理,而不像早期版本,它们存储在文件系统中的数据库之外。 (2005年尝试通过同时备份和恢复它们来提供帮助,但与现有机制相比,这是一次黑客攻击)。