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
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
¿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.
fuente
TOP
operador sugiere queSET ROWCOUNT
se ejecutó previamente un valor distinto de cero en esa conexión. Intente nuevamente con después de ejecutarSET ROWCOUNT 0;
. Además, las versiones de SQL que publicó no son SQL 2008 R2. EjecuteSELECT SERVERPROPERTY('ProductVersion');
en los 2 servidores para obtener la versión real de SQL Server.GO
después de la línea de recuento de filas? ¿Puedes publicar también las propiedades del operador Top?Respuestas:
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.
fuente
Creo que tienes un valor para ROWCOUNT. Hacer:
... para apagarlo.
fuente