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
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é
- Effacement des caches de procédure
- Reconstruction des index
- Statistiques rafraîchissantes
- SET ROWCOUNT 0
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.
la source
TOP
opérateur suggère qu'un non-zéro aSET ROWCOUNT
été précédemment exécuté sur cette connexion. Essayez à nouveau avec après l'exécutionSET ROWCOUNT 0;
. En outre, les versions SQL que vous avez publiées ne sont pas SQL 2008 R2. ExécutezSELECT SERVERPROPERTY('ProductVersion');
sur les 2 serveurs pour obtenir la version réelle de SQL Server.GO
après la ligne de nombre de lignes. Pouvez-vous également publier les propriétés de l'opérateur Top?Réponses:
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.
la source
Je pense que vous avez une valeur pour ROWCOUNT. Faire:
... pour l'éteindre.
la source