Memorias de un DBA

Un blog dedicado a contribuir a la comunidad SQL Server en español

EXISTS VS COUNT

with 2 comments

Este es un pequeño post para hacer una comparación que al inicio pareció para mi poco obvia debido a que estas dos instrucciones bajo cierto contexto hacen lo mismo pero en cuanto a performance hay una diferencia entre ellas. Estamos hablando de las instrucciones “COUNT” y “EXISTS”.

Muchas veces cuando dentro de un proceso se desea averiguar si en una tabla hay o no registros se pueden usar ambas sentencias de manera intercambiable, pero es importante conocer cual es el comportamiento de cada una y cual es más óptima bajo el punto de vista de la performance de la consulta.

La instrucción “COUNT” es una función de agrupación que nos permite agregar resultados. En el caso que se quisiera saber cuantos registros hay en una tabla esta sentencia seria la ideal, pero si sólo se quiere saber si en una consulta devuelve o no registros entonces veremos que no es tan óptima cono se piensa, esto debido a que al usar esta instrucción el motor de base de datos tiene que ejecutar la consulta, luego contar todos los registros devueltos y finalmente devolver el resultado. Veamos un ejemplo simple con el buffer cache limpio y también con datos:

DBCC DROPCLEANBUFFERS

SET STATISTICS IO ON

DECLARE @v_cont INT
SELECT
@v_cont = COUNT(1) FROM Person.Contact
IF @v_cont > 0
PRINT 'Hay registros'

/*
COLD CACHE
==========
Table 'Contact'. Scan count 1, logical reads 59, physical reads 3, read-ahead reads 57, lob logical reads 0,
lob physical reads 0, lob read-ahead reads 0.

HOT CACHE
=========
Table 'Contact'. Scan count 1, logical reads 59, physical reads 0, read-ahead reads 0, lob logical reads 0,
*/

Como se puede observar se han efectuado 59 reads para poder obtener el resultado. Ahora vamos a compararlo con la instrucción “EXISTS” la cual es una expresión que devuelve un valor verdadero o falso. Si se usa esta instrucción para verificar si en una consulta devuelve o no registros, el motor de base de datos ejecutará la consulta y si encuentra un registro al menos, dejara de leer debido a que solo le hace falta un registro para saber que el resultado es verdadero. Es decir que esta instrucción ayuda con la performance de las consultas debido a que usa menos registros. Veamos el mismo ejemplo anterior pero con la instrucción “EXISTS”:

DBCC DROPCLEANBUFFERS

SET STATISTICS IO ON

IF EXISTS (SELECT 1 FROM Person.Contact)
PRINT 'Hay registros'

/*
COLD CACHE
==========
Table 'Contact'. Scan count 1, logical reads 2, physical reads 2, read-ahead reads 0, lob logical reads 0,
lob physical reads 0, lob read-ahead reads 0.

HOT CACHE
=========
Table 'Contact'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0,
lob physical reads 0, lob read-ahead reads 0.
*/

Como se puede observar hay una diferencia bastante marcada, con la instrucción “EXISTS” sólo se hicieron 2 lecturas, mientras que con la instrucción “COUNT” se hicieron 59. Entonces es muchísimo mas óptimo usar un “EXISTS” en comparación a un “COUNT” debido a la cantidad de recursos que usan cada uno.  Espero que lo tengan en cuenta cuando escriban código para SQL Server.

Written by dbamemories

agosto 30, 2011 a 7:37 am

2 comentarios

Subscribe to comments with RSS.

  1. Hola, interesante tu post, pero por que en muchos blogs de sql y optimización de consultas dicen que no debes usar el exists?

    Jesus

    junio 18, 2013 at 2:24 pm

    • Hola, la verdad no he visto alguno que diga que el exists es perjudicial, quizas me puedas colocar alguno de esos posts para revisarlo.

      dbamemories

      junio 18, 2013 at 2:53 pm


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: