¿Por qué la operación TOP en el plan de ejecución SQL?

9

Después de buscar por un tiempo, decidí publicar esta pregunta por no encontrar una respuesta y disculparme si hay una pregunta / respuesta similar por ahí.

Cuando ejecutamos la consulta a continuación en dos servidores SQL configurados de manera similar, encontramos diferentes planes de ejecución que afectan el rendimiento y necesitamos ayuda para descubrir la causa.

La consulta:

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

Plan de ejecución del servidor A Servidor B

Plan de ejecución del servidor B Servidor B http://s2.postimg.org/z9fjrfv4n/server_B.png

Notará que el servidor B tiene la operación física SUPERIOR en el plan de ejecución real y estamos tratando de averiguar por qué. Ambas consultas usan el mismo índice en Index Seek.

Aquí hay algunos detalles del servidor A y el servidor B

El servidor A y B son ambos

Windows Server 2008 R2 Standard Service Pack 1

24 GB de RAM

Sistema operativo de 64 bits

Versiones de SQL Server 2012 obtenidas mediante ( SELECT SERVERPROPERTY ('ProductVersion') )

Servidor A SQL versión 11.0.3000.0

Servidor B SQL versión 11.0.5058.0

Lo que hemos intentado

  1. Procedimiento de limpieza de cachés
  2. Reconstruyendo índices
  3. Estadísticas refrescantes
  4. SET ROWCOUNT 0 con recuento de filas y listo

¿Por qué el servidor B tiene el TOP en el plan de ejecución? En este ejemplo de consulta simple no hay problemas reales, pero en una consulta más grande el costo aumenta para el TOP y vemos un impacto en el rendimiento. Cualquier ayuda para depurar esto sería muy apreciada y podemos obtener cualquier información adicional que pueda necesitar para ayudar.

Arthur Yegiazaryan
fuente
El TOPoperador sugiere que SET ROWCOUNTse ejecutó previamente un valor distinto de cero en esa conexión. Intente nuevamente con después de ejecutar SET ROWCOUNT 0;. Además, las versiones de SQL que publicó no son SQL 2008 R2. Ejecute SELECT SERVERPROPERTY('ProductVersion');en los 2 servidores para obtener la versión real de SQL Server.
Dan Guzman el
Actualicé la publicación original con las versiones de SQL usando la consulta de selección provista. Los servidores en los que está instalado sql son servidores Windows 2008 R2, mientras que los servidores sql instalados son 2012. Como lo sugirió previamente otro miembro y luego lo eliminó, intentamos establecer ROWCOUNT en 0 sin cambios en el plan de ejecución. Ver la pregunta actualizada
Arthur Yegiazaryan
¿Puedes poner un GOdespués de la línea de recuento de filas? ¿Puedes publicar también las propiedades del operador Top?
Rob Farley
Rob, agregó el GO y las propiedades de TOP a la publicación original
Arthur Yegiazaryan el

Respuestas:

12

Verifique que el nivel de compatibilidad de la base de datos sea el mismo en los 2 servidores. Ejecuté una prueba rápida en una instancia de SQL Server 2012 y veo que se introduce el operador TOP si el nivel de compatibilidad es 100 o inferior. A menos que tenga una razón específica para hacer lo contrario, es mejor usar el nivel de compatibilidad 110 (SQL Server 2012) en una instancia de SQL Server 2012.

Dan Guzman
fuente
2

Creo que tienes un valor para ROWCOUNT. Hacer:

SET ROWCOUNT 0

... para apagarlo.

Rob Farley
fuente
1
SET ROWCOUNT 0 no eliminó el TOP del plan de ejecución
Arthur Yegiazaryan el
1
@ Arthur Aunque esa no era la solución en su caso, podría ser la razón del comportamiento para futuros lectores. (Lo siento Rob, me tomé la libertad de recuperar tu publicación porque este podría ser el problema para el mismo síntoma.)
Aaron Bertrand
Aaron, estuvo de acuerdo y gracias por traerlo de vuelta. No es la solución para mí, pero podría ser para otros.
Arthur Yegiazaryan