在Sql Server中,TOP 2比TOP 1更快?

时间:2010-02-02 11:42:48

标签: sql-server indexing full-text-search

我们在Sql Server 2005数据库中有一个表有+ - 500k行的表,其中一列有一个全文索引。

我们正在做一些测试,发现SELECT TOP 1 ... WHERE CONTAINS(fullTextColumn,'anyValue')需要两分多钟才能返回。但是相同的选择,但在几秒钟内返回TOP 2而不是1。

有关为何会发生这种情况的任何想法吗?

谢谢!

编辑:有关此问题的更多信息。在TOP 1查询计划中,Sql使用远程扫描,而在TOP 2中则使用Index Seek。很奇怪。

编辑2:这些都是来自Sql的执行计划:

TOP 1

StmtText
--------------------------------------------------------------------------------------------------------------------------------------------------
  |--Top(TOP EXPRESSION:((1)))
       |--Nested Loops(Left Semi Join, WHERE:([ECRReload].[dbo].[TECR_PRODUTO_COMPLETO_VENDAVEIS].[idProduto] = [Full-text Search Engine].[KEY]))
            |--Index Scan(OBJECT:([ECRReload].[dbo].[TECR_PRODUTO_COMPLETO_VENDAVEIS].[ix_tecr_produto_completo_vendaveis01]))
            |--Remote Scan(OBJECT:(CONTAINS))

TOP 2

StmtText
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  |--Top(TOP EXPRESSION:((2)))
       |--Nested Loops(Inner Join, OUTER REFERENCES:([Full-text Search Engine].[KEY]))
            |--Remote Scan(OBJECT:(CONTAINS))
            |--Index Seek(OBJECT:([ECRReload].[dbo].[TECR_PRODUTO_COMPLETO_VENDAVEIS].[ix_tecr_produto_completo_vendaveis01]), SEEK:([ECRReload].[dbo].[TECR_PRODUTO_COMPLETO_VENDAVEIS].[idProduto]=[Full-text Search Engine].[KEY]) ORDERED FORWARD)

1 个答案:

答案 0 :(得分:0)

我不是100%确定我是否可以说这是固定的,但似乎是。昨晚我们的DBA重建了FullText目录并进行了重组,并开始工作。现在两个查询都运行不到一秒钟。

我无法解释原因,但它正在发挥作用。