Diferentes Planes de Ejecución

14/08/2007 - 09:43 por Julián | Informe spam
Hola grupo:

¿ Alguien sabe por qué es posible que el plan de ejecución utilizado por SQL
Server sea diferente si una consulta se lanza desde una aplicación cliente
con ODBC o desde el propio Analizador de Consultas ?
Con el Profiler observo que la consulta que le llega a Sql en ambos casos es
idéntica, pero el plan de ejecución empleado es completamente diferente.
Ésto me está provocando que desde la aplicación cliente tarde la query más
de 1 minuto, y desde el analizador de consulta no llegue a 5 segundos.
La consulta es bastante compleja y utiliza bastantes subconsultas para
obtener valores de selección..

Simplificando muchísimo, pero para que sirva de ejemplo, sería algo así:
select articulo,descripcion,
isnull(select sum(stock-ventas) from Stocks where articulo
= Articulos.articulo,0) as disponible
from Articulos
where Articulos between 'A01' and 'Z99'


Saludos.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
14/08/2007 - 10:38 | Informe spam
¿Y cuáles son las diferencias en esos planes de ejecución?

"Julián" escribió en el mensaje
news:O$y$

Hola grupo:

¿ Alguien sabe por qué es posible que el plan de ejecución utilizado por
SQL Server sea diferente si una consulta se lanza desde una aplicación
cliente con ODBC o desde el propio Analizador de Consultas ?
Con el Profiler observo que la consulta que le llega a Sql en ambos casos
es idéntica, pero el plan de ejecución empleado es completamente
diferente.
Ésto me está provocando que desde la aplicación cliente tarde la query más
de 1 minuto, y desde el analizador de consulta no llegue a 5 segundos.
La consulta es bastante compleja y utiliza bastantes subconsultas para
obtener valores de selección..

Simplificando muchísimo, pero para que sirva de ejemplo, sería algo así:
select articulo,descripcion,
isnull(select sum(stock-ventas) from Stocks where articulo
= Articulos.articulo,0) as disponible
from Articulos
where Articulos between 'A01' and 'Z99'


Saludos.

Respuesta Responder a este mensaje
#2 Julián
14/08/2007 - 13:08 | Informe spam
Aunque se parecen en poco, a mi me llama la atención las siguientes
cuestiones:

1. Desde el Analizador de Consulta utiliza paralelismo, mientras que dede la
aplicación cliente no.

2. También me resulta extraño la forma que tiene de realizar el SUM desde la
aplicación cliente:


Compute Scalar(DEFINE:([Expr1017]=If ([Expr1037]=0) then NULL else
[Expr1038]))
| | |--Stream Aggregate(GROUP BY:([Rank1032])
DEFINE:([Expr1037]=COUNT_BIG([STOCKS].[stock]-[STOCKS].[ventas]),
[Expr1038]=SUM([STOCKS].[stock]-[STOCKS].[ventas]),
.

Sin embargo, en el analizador de consulta es:
.
|--Stream
Aggregate(DEFINE:([Expr1017]=SUM([STOCKS].[stock]-[STOCKS].[ventas])))
..



"Carlos Sacristan" <nomail> escribió en el mensaje
news:
¿Y cuáles son las diferencias en esos planes de ejecución?

"Julián" escribió en el mensaje
news:O$y$

Hola grupo:

¿ Alguien sabe por qué es posible que el plan de ejecución utilizado por
SQL Server sea diferente si una consulta se lanza desde una aplicación
cliente con ODBC o desde el propio Analizador de Consultas ?
Con el Profiler observo que la consulta que le llega a Sql en ambos casos
es idéntica, pero el plan de ejecución empleado es completamente
diferente.
Ésto me está provocando que desde la aplicación cliente tarde la query
más de 1 minuto, y desde el analizador de consulta no llegue a 5
segundos.
La consulta es bastante compleja y utiliza bastantes subconsultas para
obtener valores de selección..

Simplificando muchísimo, pero para que sirva de ejemplo, sería algo así:
select articulo,descripcion,
isnull(select sum(stock-ventas) from Stocks where
articulo = Articulos.articulo,0) as disponible
from Articulos
where Articulos between 'A01' and 'Z99'


Saludos.





email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida