2010-02-02 9 views
4

nous avons une table avec + - 500k lignes dans la base de données Sql Server 2005 et une de ses colonnes a un index de texte intégral.TOP 2 plus rapide que TOP 1 dans Sql Server?

Nous étions en train de faire quelques tests et nous avons constaté que SELECT TOP 1 ... WHERE CONTAINS (fullTextColumn, 'anyValue') prenait plus de deux minutes pour revenir. Cependant la même sélection, mais avec TOP 2 au lieu de 1 retour en quelques secondes.

Une idée sur pourquoi cela se produit?

Merci!

Modifier: Informations supplémentaires sur le problème. Sur le TOP 1, le plan de requête Sql utilise un Remote Scan alors que dans TOP 2 il utilise Index Seek. Très étrange.

Edit 2: Ce sont les deux plans d'exécution de 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

Avez-vous exécuté les tests plus d'une fois? Sinon, le résultat est simplement mis en cache à partir de la première requête. – Guffa

+1

Les serveurs SQL mettent en cache les résultats et ainsi, une requête suivante est généralement beaucoup plus rapide, ce qui expliquerait vos résultats. – dbemerlin

+0

En fait non. Nous l'avons couru pendant 5 minutes et nous nous sommes arrêtés. – tucaz

Répondre

0

je ne suis pas sûr à 100% si je peux dire que c'est fixe, mais il semble être. La nuit dernière, notre DBA a reconstruit le catalogue FullText et l'a réorganisé et il a commencé à fonctionner. Les deux requêtes fonctionnent maintenant avec moins d'une seconde.

Je ne peux pas expliquer pourquoi, mais ça marche.