2010-02-02 70 views
4

我们在Sql Server 2005数据库中有一个包含+ - 500k行的表,其中一列具有全文索引。TOP 2比Sql Server中的TOP 1更快?

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

关于为什么发生这种情况的任何想法?

谢谢!

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

编辑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) 
+6

您是否多次运行测试?否则,结果将简单地从第一个查询中缓存。 – Guffa 2010-02-02 11:46:19

+1

SQL Server缓存结果,这样下面的查询通常要快得多,这可以解释你的结果。 – dbemerlin 2010-02-02 11:49:59

+0

其实没有。我们跑了5分钟,停了下来。 – tucaz 2010-02-02 11:52:46

回答

0

我可不是100%肯定,如果我能说这是固定的,但似乎是这样。昨晚我们的DBA重新构建了FullText目录并重新组织,并开始工作。两个查询现在都运行不到一秒钟。

我无法解释为什么,但它工作。