Verificar si una tablatiene datos ...

29/10/2007 - 20:36 por Peni | Informe spam
Que es más rápido en general, hacer un select count(*)... where o un
select top 1 ... where?


=Saludos. Peni.
=

Preguntas similare

Leer las respuestas

#6 Leonardo Azpurua
29/10/2007 - 22:03 | Informe spam
"Penta" escribió en el mensaje
news:
Maestro Mesa.
Lo que quiere saber Peni es si tiene datos una tabla :)
Y por lo que escribió Leonardo sería muy interesante que alguien nos
aclarara esa duda ya que al menos cuando hago count(*) se ha demorado
20 seg. en una tabla de 1.142.795 registros en comparacion en
comparacion con el top 1 que se demora milesimas de segundos.
-

Hola, Penta:

¿Esa demora la has tenido con un SELECT COUNT(*) o con un SELECT COUNT(*)
WHERE...?

En el primer caso, debería bastar con examinar las estadísticas de la tabla.
En el segundo es probable que haya que examinar toda la tabla.

Salud!
Respuesta Responder a este mensaje
#7 Penta
29/10/2007 - 22:34 | Informe spam
Hola.
Solo con Select count(*)
Si el motor en este caso debe examinar las estadisticas de la tabla y
se demora tanto que puede ser ?

- Solo la actualizacion de las mismas ? (Creo que estan actualizadas)

Salu2.
Penta.
Respuesta Responder a este mensaje
#8 Alejandro Mesa
29/10/2007 - 23:47 | Informe spam
Penta,

Como pruebas tu que una tabla tiene filas?

Has la sgte prueba en un servidor que no sea de producción.


use tu_db
go

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

if (select count(*) from tu_tabla) > 0
print 'tiene filas'

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

if exists(select * from tu_tabla)
print 'tiene filas'

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

IF EXISTS(SELECT TOP 1 * FROM tu_tabla)
print 'tiene filas'
go

Dinos cual es el costo relativo, respecto al batch, de cada query.


AMB

"Penta" wrote:

Maestro Mesa.
Lo que quiere saber Peni es si tiene datos una tabla :)
Y por lo que escribió Leonardo sería muy interesante que alguien nos
aclarara esa duda ya que al menos cuando hago count(*) se ha demorado
20 seg. en una tabla de 1.142.795 registros en comparacion en
comparacion con el top 1 que se demora milesimas de segundos.

Salu2.
Penta.


Respuesta Responder a este mensaje
#9 jeastman - Hotmail
29/10/2007 - 23:53 | Informe spam
Hola.

Yo hice una prueba con éstas dos versiones:

select count(*) from tabla

y la segunda versión fue:

if exists (select 1 from tabla)
begin
print 'Existe'
end

La tabla es muy pequeña, solo tiene 73.205 registros

En la primera forma me dio un segundo, en la segunda no llegó al segundo.

Yo personalmente utilizo la segunda alternativa, pues le dejo el trabajo al
obtimizador de buscar la mejor manera de averiguar si hay o no registros, el
1 que está en el select es para evitar colocar un * que en éste caso no hace
falta.

Si obtienen otros resultados y alguna mejor vía me gustaría conocerla y así
evitarle trabajo al motor.

Saludos.

"Leonardo Azpurua" <l e o n a r d o [arroba] m v p s [punto] o r g> escribió
en el mensaje news:

"Penta" escribió en el mensaje
news:
Con el top de toda maneras, si haces un count(*) de una tabla de
muchos registros = se toma su tiempo.



Igual hay quien sabe mas que nosotros de SQL Server y me corrige, pero
creo que el COUNT(*) lo unico que hace es examinar el descriptor de la
tabla, o sea que debe ser mucho más rápido.

Salud!


Respuesta Responder a este mensaje
#10 Jose Mariano Alvarez
30/10/2007 - 00:58 | Informe spam
Los dos son igualmente malos.
Es mejor como dice alejandro, usando TOP 1 o usando el cuantificador
existencial.

Prueba esto con la base de datos de ejemplo y mira los pesos relativos.

select count(*) from dbo.FactInternetSales
select 1 from dbo.FactInternetSales
select top 1 * from dbo.FactInternetSales
select top 1 1 from dbo.FactInternetSales
if exists(select * from dbo.FactInternetSales ) print 'tiene filas' else
print 'NO tiene filas'
if exists(select 1 from dbo.FactInternetSales ) print 'tiene filas' else
print 'NO tiene filas'
if (select count(*) from dbo.FactInternetSales ) > 0 print 'tiene filas'
else print 'NO tiene filas'



Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)


IMPORTANTE

Por favor traten de indicar la versión de SQL y Service Pack.
La inclusión de (CREATE, INSERTS, etc.) para poder reproducir el problema
también ayuda.



"jeastman - Hotmail" wrote in message
news:e%238$
Hola.

Yo hice una prueba con éstas dos versiones:

select count(*) from tabla

y la segunda versión fue:

if exists (select 1 from tabla)
begin
print 'Existe'
end

La tabla es muy pequeña, solo tiene 73.205 registros

En la primera forma me dio un segundo, en la segunda no llegó al segundo.

Yo personalmente utilizo la segunda alternativa, pues le dejo el trabajo
al obtimizador de buscar la mejor manera de averiguar si hay o no
registros, el 1 que está en el select es para evitar colocar un * que en
éste caso no hace falta.

Si obtienen otros resultados y alguna mejor vía me gustaría conocerla y
así evitarle trabajo al motor.

Saludos.

"Leonardo Azpurua" <l e o n a r d o [arroba] m v p s [punto] o r g>
escribió en el mensaje news:

"Penta" escribió en el mensaje
news:
Con el top de toda maneras, si haces un count(*) de una tabla de
muchos registros = se toma su tiempo.



Igual hay quien sabe mas que nosotros de SQL Server y me corrige, pero
creo que el COUNT(*) lo unico que hace es examinar el descriptor de la
tabla, o sea que debe ser mucho más rápido.

Salud!






Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida