Optimizacion en IF.....EXISTS

13/11/2007 - 00:08 por Juan Carlos Mendoza | Informe spam
Buenas,

Revisando unos scripts de Desarrollo, veo que tienen sentencias del
tipo

IF EXISTS (SELECT * FROM [tabla] )

eso representa un SCAN TABLE, lo cual se ve al revisar el plan de
ejecucion.
Les estuve sugiriendo que lo cambien por

IF EXISTS (SELECT 1 FROM [tabla] )
barre la tabla pero por el indice principal, el cual tiene la tabla
que agarre como ejemplo.

Luego me dí cuenta que demoraba como 50 segundos en su ejecución, pero
al cambiarlo de esta manera

IF EXISTS (SELECT TOP 1 1 FROM [tabla] )
El tiempo bajo dramaticamente a escasos 2 segundos.

A todas las luces, se ve que la tercera forma es la que se ejecutará
mas rápido y será la que sintacticamente convenga realizar.

Aca viene la consulta:
En los costs del primero es un 100% (Scan Table), en el segundo me dio
un costo 100% (Index Scan), pero en el tercero me da un costo de 4536%
(Index Scan) y 0% (Top) lo cual no entiendo o no me explico el porque

(Nota: el WHERE posible del select lo he omitido adrede)

Cualquier orientacion sera agradecida.

Saludos,

Juan Carlos Mendoza
Callao - šPeru

Preguntas similare

Leer las respuestas

#1 Maxi
13/11/2007 - 00:34 | Informe spam
Hola, ojo con los porcentajes porque en 2000 hay veces que no dan numeros
correctos.
Yo no tratatia de hacer un select * from tabla ya que esto siempre hara un
tablescan , porque no ponen condiciones en el where?




Microsoft MVP SQLServer
www.sqltotalconsulting.com
-
"Juan Carlos Mendoza" escribió en el mensaje de
noticias news:
Buenas,

Revisando unos scripts de Desarrollo, veo que tienen sentencias del
tipo

IF EXISTS (SELECT * FROM [tabla] )

eso representa un SCAN TABLE, lo cual se ve al revisar el plan de
ejecucion.
Les estuve sugiriendo que lo cambien por

IF EXISTS (SELECT 1 FROM [tabla] )
barre la tabla pero por el indice principal, el cual tiene la tabla
que agarre como ejemplo.

Luego me dí cuenta que demoraba como 50 segundos en su ejecución, pero
al cambiarlo de esta manera

IF EXISTS (SELECT TOP 1 1 FROM [tabla] )
El tiempo bajo dramaticamente a escasos 2 segundos.

A todas las luces, se ve que la tercera forma es la que se ejecutará
mas rápido y será la que sintacticamente convenga realizar.

Aca viene la consulta:
En los costs del primero es un 100% (Scan Table), en el segundo me dio
un costo 100% (Index Scan), pero en el tercero me da un costo de 4536%
(Index Scan) y 0% (Top) lo cual no entiendo o no me explico el porque

(Nota: el WHERE posible del select lo he omitido adrede)

Cualquier orientacion sera agradecida.

Saludos,

Juan Carlos Mendoza
Callao - šPeru
Respuesta Responder a este mensaje
#2 Alejandro Mesa
13/11/2007 - 00:36 | Informe spam
Juan Carlos Mendoza,

Con la sentencia:

if exists(select * from dbo.t1)

sera suficiente. El optimizador no escanea la tabla entera sino que tan
pronto encuentra algo, para.

Si vas a hacer comparaciones entre las diferentes sentencias, recuerda
limpiar el cache de data y el de procediminetos, para que la comparacion sea
justa

dbcc freeprocacche
dbcc dropcleanbuffers

No ejecutes lo anterior en un server en produccion.


AMB

"Juan Carlos Mendoza" wrote:

Buenas,

Revisando unos scripts de Desarrollo, veo que tienen sentencias del
tipo

IF EXISTS (SELECT * FROM [tabla] )

eso representa un SCAN TABLE, lo cual se ve al revisar el plan de
ejecucion.
Les estuve sugiriendo que lo cambien por

IF EXISTS (SELECT 1 FROM [tabla] )
barre la tabla pero por el indice principal, el cual tiene la tabla
que agarre como ejemplo.

Luego me dí cuenta que demoraba como 50 segundos en su ejecución, pero
al cambiarlo de esta manera

IF EXISTS (SELECT TOP 1 1 FROM [tabla] )
El tiempo bajo dramaticamente a escasos 2 segundos.

A todas las luces, se ve que la tercera forma es la que se ejecutará
mas rápido y será la que sintacticamente convenga realizar.

Aca viene la consulta:
En los costs del primero es un 100% (Scan Table), en el segundo me dio
un costo 100% (Index Scan), pero en el tercero me da un costo de 4536%
(Index Scan) y 0% (Top) lo cual no entiendo o no me explico el porque

(Nota: el WHERE posible del select lo he omitido adrede)

Cualquier orientacion sera agradecida.

Saludos,

Juan Carlos Mendoza
Callao - ¨Peru


Respuesta Responder a este mensaje
#3 Juan Carlos Mendoza
13/11/2007 - 01:38 | Informe spam
Interesante

Aunque el optimizador no escanea la tabla entera, me queda la duda si
"levanta" a memoria la consulta completa y lo que costea el hacerlo.

Saludos,

Juan Carlos Mendoza
Callao - Peru

On 12 nov, 18:36, Alejandro Mesa
wrote:
Juan Carlos Mendoza,

Con la sentencia:

if exists(select * from dbo.t1)

sera suficiente. El optimizador no escanea la tabla entera sino que tan
pronto encuentra algo, para.

Si vas a hacer comparaciones entre las diferentes sentencias, recuerda
limpiar el cache de data y el de procediminetos, para que la comparacion sea
justa

dbcc freeprocacche
dbcc dropcleanbuffers

No ejecutes lo anterior en un server en produccion.

AMB



"Juan Carlos Mendoza" wrote:
> Buenas,

> Revisando unos scripts de Desarrollo, veo que tienen sentencias del
> tipo

> IF EXISTS (SELECT * FROM [tabla] )

> eso representa un SCAN TABLE, lo cual se ve al revisar el plan de
> ejecucion.
> Les estuve sugiriendo que lo cambien por

> IF EXISTS (SELECT 1 FROM [tabla] )
> barre la tabla pero por el indice principal, el cual tiene la tabla
> que agarre como ejemplo.

> Luego me dí cuenta que demoraba como 50 segundos en su ejecución, pero
> al cambiarlo de esta manera

> IF EXISTS (SELECT TOP 1 1 FROM [tabla] )
> El tiempo bajo dramaticamente a escasos 2 segundos.

> A todas las luces, se ve que la tercera forma es la que se ejecutará
> mas rápido y será la que sintacticamente convenga realizar.

> Aca viene la consulta:
> En los costs del primero es un 100% (Scan Table), en el segundo me dio
> un costo 100% (Index Scan), pero en el tercero me da un costo de 4536%
> (Index Scan) y 0% (Top) lo cual no entiendo o no me explico el porque

> (Nota: el WHERE posible del select lo he omitido adrede)

> Cualquier orientacion sera agradecida.

> Saludos,

> Juan Carlos Mendoza
> Callao - šPeru- Ocultar texto de la cita -

- Mostrar texto de la cita -
Respuesta Responder a este mensaje
#4 Alejandro Mesa
13/11/2007 - 22:15 | Informe spam
Hola Juan Carlos,

Quizas este link te ayude con la duda.

http://www.microsoft.com/communitie...sloc=en-us


AMB

"Juan Carlos Mendoza" wrote:

Interesante

Aunque el optimizador no escanea la tabla entera, me queda la duda si
"levanta" a memoria la consulta completa y lo que costea el hacerlo.

Saludos,

Juan Carlos Mendoza
Callao - Peru

On 12 nov, 18:36, Alejandro Mesa
wrote:
> Juan Carlos Mendoza,
>
> Con la sentencia:
>
> if exists(select * from dbo.t1)
>
> sera suficiente. El optimizador no escanea la tabla entera sino que tan
> pronto encuentra algo, para.
>
> Si vas a hacer comparaciones entre las diferentes sentencias, recuerda
> limpiar el cache de data y el de procediminetos, para que la comparacion sea
> justa
>
> dbcc freeprocacche
> dbcc dropcleanbuffers
>
> No ejecutes lo anterior en un server en produccion.
>
> AMB
>
>
>
> "Juan Carlos Mendoza" wrote:
> > Buenas,
>
> > Revisando unos scripts de Desarrollo, veo que tienen sentencias del
> > tipo
>
> > IF EXISTS (SELECT * FROM [tabla] )
>
> > eso representa un SCAN TABLE, lo cual se ve al revisar el plan de
> > ejecucion.
> > Les estuve sugiriendo que lo cambien por
>
> > IF EXISTS (SELECT 1 FROM [tabla] )
> > barre la tabla pero por el indice principal, el cual tiene la tabla
> > que agarre como ejemplo.
>
> > Luego me dí cuenta que demoraba como 50 segundos en su ejecución, pero
> > al cambiarlo de esta manera
>
> > IF EXISTS (SELECT TOP 1 1 FROM [tabla] )
> > El tiempo bajo dramaticamente a escasos 2 segundos.
>
> > A todas las luces, se ve que la tercera forma es la que se ejecutará
> > mas rápido y será la que sintacticamente convenga realizar.
>
> > Aca viene la consulta:
> > En los costs del primero es un 100% (Scan Table), en el segundo me dio
> > un costo 100% (Index Scan), pero en el tercero me da un costo de 4536%
> > (Index Scan) y 0% (Top) lo cual no entiendo o no me explico el porque
>
> > (Nota: el WHERE posible del select lo he omitido adrede)
>
> > Cualquier orientacion sera agradecida.
>
> > Saludos,
>
> > Juan Carlos Mendoza
> > Callao - ¨Peru- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -



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