Pourquoi l'opération TOP dans le plan d'exécution SQL

9

Après avoir cherché pendant un certain temps, j'ai décidé de poster cette question faute de trouver une réponse et de m'excuser s'il y a une question / réponse similaire.

Lors de l'exécution de la requête ci-dessous sur deux serveurs SQL configurés de manière similaire, nous rencontrons différents plans d'exécution qui affectent les performances et nous avons besoin d'aide pour en déterminer la cause.

La requête:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

Plan d'exécution du serveur A Serveur B

Plan d'exécution du serveur B Serveur B http://s2.postimg.org/z9fjrfv4n/server_B.png

Vous remarquerez que le serveur B a l'opération physique TOP dans le plan d'exécution réel et nous essayons de comprendre pourquoi. Les deux requêtes utilisent le même index dans la recherche d'index.

Voici quelques détails sur le serveur A et le serveur B

Le serveur A et B sont tous les deux

Windows Server 2008 R2 Standard Service Pack 1

24 Go de RAM

Système d'exploitation 64 bits

Versions de SQL Server 2012 obtenues à l'aide de ( SELECT SERVERPROPERTY ('ProductVersion') )

Serveur A SQL version 11.0.3000.0

Serveur B SQL version 11.0.5058.0

Ce que nous avons essayé

  1. Effacement des caches de procédure
  2. Reconstruction des index
  3. Statistiques rafraîchissantes
  4. SET ROWCOUNT 0 avec rowcount et c'est parti

Pourquoi le serveur B a-t-il le TOP dans le plan d'exécution? Dans cet exemple de requête simple, il n'y a pas de vrai problème, mais dans une requête plus large, le coût augmente pour le TOP et nous voyons un impact sur les performances. Toute aide au débogage serait très appréciée et nous pouvons vous fournir toute information supplémentaire dont vous pourriez avoir besoin pour vous aider.

Arthur Yegiazaryan
la source
L' TOPopérateur suggère qu'un non-zéro a SET ROWCOUNTété précédemment exécuté sur cette connexion. Essayez à nouveau avec après l'exécution SET ROWCOUNT 0;. En outre, les versions SQL que vous avez publiées ne sont pas SQL 2008 R2. Exécutez SELECT SERVERPROPERTY('ProductVersion');sur les 2 serveurs pour obtenir la version réelle de SQL Server.
Dan Guzman
J'ai mis à jour le message d'origine avec les versions SQL à l'aide de la requête de sélection fournie. Les serveurs sur lesquels sql est installé sont des serveurs Windows 2008 R2 tandis que les serveurs sql installés sont 2012. Comme précédemment suggéré par un autre membre puis supprimé, nous avons essayé de définir ROWCOUNT sur 0 sans modifier le plan d'exécution. Voir la question mise à jour
Arthur Yegiazaryan
Pouvez-vous mettre un GOaprès la ligne de nombre de lignes. Pouvez-vous également publier les propriétés de l'opérateur Top?
Rob Farley
Rob, a ajouté le GO et les propriétés du TOP au message d'origine
Arthur Yegiazaryan

Réponses:

12

Vérifiez que le niveau de compatibilité de la base de données est le même sur les 2 serveurs. J'ai exécuté un test rapide sur une instance de SQL Server 2012 et je vois que l'opérateur TOP est introduit si le niveau de compatibilité est égal ou inférieur à 100. Sauf si vous avez une raison particulière de faire autrement, il est préférable d'utiliser le niveau de compatibilité 110 (SQL Server 2012) sur une instance SQL Server 2012.

Dan Guzman
la source
2

Je pense que vous avez une valeur pour ROWCOUNT. Faire:

SET ROWCOUNT 0

... pour l'éteindre.

Rob Farley
la source
1
SET ROWCOUNT 0 n'a pas supprimé le TOP du plan d'exécution
Arthur Yegiazaryan
1
@Arthur Bien que ce ne soit pas la solution dans votre cas, cela pourrait être la raison du comportement des futurs lecteurs. (Désolé Rob, j'ai pris la liberté d'annuler la suppression de votre message car cela pourrait vraiment être le problème pour le même symptôme.)
Aaron Bertrand
Aaron, a accepté et merci de l'avoir rapporté. Pas la solution pour moi mais pourrait l'être pour les autres.
Arthur Yegiazaryan