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

#31 Leonardo Azpurua
30/10/2007 - 19:42 | Informe spam
"jeastman - Hotmail" escribió en el mensaje
news:%
Hola Peni...

Tranquilo, creo que más que una reprimenda ha sido un consejo y de verdad
la pregunta inocente cómo tú dice ha llevado a un punto de validaciones
muy interesante, así que no dudes preguntar, quien sabes si vuelves a
iniciar una nueva discución de éste calibre y no me gustaría perdemela por
nada.



Yo, por lo menos, me he llevadouna sorpresa mayúscula.
Respuesta Responder a este mensaje
#32 Peni
30/10/2007 - 20:21 | Informe spam
Bueno, pues me alegro de haber sido la chispa de esta discusión :-)

"jeastman - Hotmail" escribió en el mensaje
news:%
Hola Peni...

Tranquilo, creo que más que una reprimenda ha sido un consejo y de verdad
la pregunta inocente cómo tú dice ha llevado a un punto de validaciones muy
interesante, así que no dudes preguntar, quien sabes si vuelves a iniciar
una nueva discución de éste calibre y no me gustaría perdemela por nada.



Yo, por lo menos, me he llevadouna sorpresa mayúscula.




=Saludos. Peni.
=
Respuesta Responder a este mensaje
#33 Peni
30/10/2007 - 20:25 | Informe spam
Estoy empezando a hacer cosas más o menos "de verdad" con SQL, así que
por aquí seguiré. En los pocos días que ando por aquí me he divertido
un montón leyendo estupendos hilos :-) De todas formas Leonardo tiene
razón en que quizás debo buscar más antes de preguntar, intentaré
seguir su consejo

Hola Peni...

Tranquilo, creo que más que una reprimenda ha sido un consejo y de verdad la
pregunta inocente cómo tú dice ha llevado a un punto de validaciones muy
interesante, así que no dudes preguntar, quien sabes si vuelves a iniciar una
nueva discución de éste calibre y no me gustaría perdemela por nada.

Gracias por participar.

Saludos.

"Peni" escribió en el mensaje
news:
Si hubiera sabido lo mismo que ahora acerca de limpiar la cache, medir el
tiempo y otros puntos, posiblemente no hubiera sido necesario hacer la
pregunta. Cierto es que toda esa información también podría haberla buscado
en Google o en los BOL ... si hubiera sabido lo que tenía que buscar, es
más, estoy convencido que con el tiempo suficiente para buscar y hacer
pruebas, el 80% de las preguntas no serían necesarias, pero también creo
que si uno puede disfrutar de la ventaja en conocimientos y experiencia de
otra gente, debe hacerlo. Y por si fuera poco, a partir de una pregunta
bastante inocente, se ha generado una interesante discusión en la que han
salido a relucir cosas muy interesantes :-)
En cualquier caso, tomo nota de tu "reprimenda" e intentaré buscar más
antes de preguntar

Se me olvido decir que has hecho un buen trabajo. Lo mismo podria haberlo
hecho "Peni", antes de hacer la pregunta en el grupo.

Saludos,
Alejandro Mesa

P.S. Puedes postear tu nombre o prefieres el anonimato?

"jeastman - Hotmail" wrote:

Dosculpen...


En la primera presentación de resultados y en la anterior respuesta a
Alejandro obvié algunos resultados, los anoto a continuación:

Los dos primeros son los sugerido por Ruben, los demás fueron la
sugerencia de Alejandro.

1) SELECT i.rowcnt FROM sysindexes i INNER JOIN sysobjects o ON i.id =
o.id WHERE o.name = 'aaa' and i.indid = 1 (16) milisegundos
2) SELECT rowcnt FROM sysindexes WHERE id = OBJECT_ID('aaa') AND indid =
1 (0) milisegundos
3) select count(*) from aaa (10940) milisegundos
4) select 1 from aaa (11860) milisegundos
5) select top 1 * from aaa (80) milisegundos
6) select top 1 1 from aaa (0) milisegundos
7) if exists(select * from aaa ) print 'tiene filas' else print 'NO tiene
filas' (0) milisegundos
8) if exists(select 1 from aaa ) print 'tiene filas' else print 'NO tiene
filas' (0) milisegundos
9) if (select count(*) from aaa ) > 0 print 'tiene filas' else print 'NO
tiene filas' (11623) milisegundos

La corrida de evaluación de tiempo fue ejecutada sin visualizar el plan
de ejecución para no tomar en cuenta los tiempos requerido para ello.

Como podemos observar las sentencias ( 2, 6, 7, 8 ) obtuvieron los
mejores tiempo, no con ello se puede ignorar otras opciones que tienen
tiempo muy bajos.

Ahora, en cuanto a los planes de ejecución, solo comentaré el de los
cuatro mejores tiempos:

Las sentencias 2 y 6 son diferentes entre si y diferente a la 7 y la 8,
las cuales si son iguales entre ellos (los planes), a la vez que el 6 si
es igual 5, aun cuando el 5 tuvo un resultado un poco menor pero que no
es despreciable.

El plan de jecución de las consultas 7 y 8 son iguales.

Ahora, lo que no tomé en cuenta para éste análisis fue los números
individuales de cada uno de los componentes del plan de ejecución,
jejeje, tengo que trabajar mis disculpas.

No se si esto sea suficiente con los resultados obtenidos hasta ahora.

Saludos.

P.D. El script de la última prueba es la siguiente:

==>>>> --Número de registros 2.342.560
declare @inicio datetime,
@fin datetime,
@dif int



DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
SELECT i.rowcnt FROM sysindexes i INNER JOIN sysobjects o ON i.id = o.id
WHERE o.name = 'aaa' and i.indid = 1
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print '1) SELECT i.rowcnt FROM sysindexes i INNER JOIN sysobjects o ON
i.id = o.id WHERE o.name = ''aaa'' and i.indid = 1 (' + cast( @dif as
varchar ) + ') milisegundos'

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
SELECT rowcnt FROM sysindexes WHERE id = OBJECT_ID('aaa') AND indid = 1
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print '2) SELECT rowcnt FROM sysindexes WHERE id = OBJECT_ID(''aaa'') AND
indid = 1 (' + cast( @dif as varchar ) + ') milisegundos'


DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
select count(*) from aaa
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print '3) select count(*) from aaa (' + cast( @dif as varchar ) + ')
milisegundos'

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
select 1 from aaa
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print '4) select 1 from aaa (' + cast( @dif as varchar ) + ')
milisegundos'

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
select top 1 * from aaa
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print '5) select top 1 * from aaa (' + cast( @dif as varchar ) + ')
milisegundos'

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
select top 1 1 from aaa
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print '6) select top 1 1 from aaa (' + cast( @dif as varchar ) + ')
milisegundos'

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
if exists(select * from aaa ) print 'tiene filas' else
print 'NO tiene filas'
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print '7) if exists(select * from aaa ) print ''tiene filas'' else print
''NO tiene filas'' (' + cast( @dif as varchar ) + ') milisegundos'

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
if exists(select 1 from aaa ) print 'tiene filas' else print 'NO tiene
filas'
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print '8) if exists(select 1 from aaa ) print ''tiene filas'' else print
''NO tiene filas'' (' + cast( @dif as varchar ) + ') milisegundos'


DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
if (select count(*) from aaa ) > 0 print 'tiene filas' else print 'NO
tiene filas'
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print '9) if (select count(*) from aaa ) > 0 print ''tiene filas'' else
print ''NO tiene filas'' (' + cast( @dif as varchar ) + ') milisegundos'
==>>>>

"Alejandro Mesa" escribió en el
mensaje news:
jeastman - Hotmail,

Ya veo que fuistes justo en cuanto a limpiar el cache de data y
procedimientos. Una cosa mas me hubiese gustado que chequearas, y son
los
planes de ejecucion de cada sentencia. Si los planes son diferentes,
entonces
vale medir el tiempo, de lo contrario deberian dar igual resultado.
Recuerda
que otros procesos pueden estar ocurriendo en la maquina de pruebas, no
solo
procesos disparados por el usuario sino tambien procesos propios de SQL
Server como LAZY WRITER, etc, o procesos del propios del sistema
operativo y
eso seria la causa de la diferencia de tiempo entre dos sentencias con
igual
plan de ejcucion, puesto que esos procesos no corren continuamente sino
que
se disparan cada cierto tiempo y si por casualidad se disparo en una
sentencia y no en la otra entonces veremos diferencias de tiempo para
planes
de ejecucion iguales.


AMB


"jeastman - Hotmail" wrote:

Señores.

Me tomé la libertad de hacer la prueba que sugiere el compañero José
Mariano, para ello creé una tabla con 2.342.560 de registros y sin
ningún
indice primero y luego con un índice clustered, las pruebas las hice en
el
mismo orden que las mostró el compañero y los resultados fueron los
siguiente:


SIN ÍNDICES
=>>>>>> count(*) (4080) milisegundos
select 1 (7156) milisegundos
select top 1 * (13) milisegundos
select top 1 1 (0) milisegundos
if exists (select *... (16) milisegundos
if exists (select 1... (0) milisegundos
if (select count(*)...) > 0 (4033) milisegundos


CON ÍNDICE CLUSTERED
==>>>>>> count(*) (10923) milisegundos
select 1 (12310) milisegundos
select top 1 * (46) milisegundos
select top 1 1 (0) milisegundos
if exists (select *... (13) milisegundos
if exists (select 1... (0) milisegundos
if (select count(*)...) > 0 (11690) milisegundos

Los resultados demuestran que existen dos opciones que supera a
cualquier
otra con o sin índices

1) select top 1 1 (0) milisegundos
2) if exists(select 1 from aaa ) print 'tiene filas' else print 'NO
tiene
filas'

Aqui les anexo el script que utilicé para la prueba

Saludos a todos.


P.D. Si alguien obtiene algún resultado diferente, me gustaría conocer
los
resultados.

Este es el script de la tabla
CREATE TABLE aaa (
CorrelMovimiento int NOT NULL ,
CodEstructura int NOT NULL ,
CodPartida int NOT NULL ,
CodUsuario int NOT NULL ,
NroPresupuesto int NOT NULL ,
TipoMovimiento tinyint NOT NULL ,
PresupuestoOrd money NOT NULL ,
FIDES money NOT NULL ,
LAES money NOT NULL ,
Otras money NOT NULL ,
Observacion varchar (255) NOT NULL ,
FechaAgregado datetime NOT NULL ,
FechaCierre datetime NOT NULL
)


y el índice lo hice por los campos correlMovimiento y nroPresupuesto,
estaba
seguro que podía hacer un índice único por esos valores


y el íindice lo hice
>>>>>> declare @inicio datetime,
@fin datetime,
@dif int



DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
select count(*) from aaa
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print 'count(*) (' + cast( @dif as varchar ) + ') milisegundos'

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
select 1 from aaa
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print 'select 1 (' + cast( @dif as varchar ) + ') milisegundos'

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
select top 1 * from aaa
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )
print 'select top 1 * (' + cast( @dif as varchar ) + ') milisegundos'

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
set @inicio = getdate()
select top 1 1 from aaa
set @fin = getdate()
set @dif = datediff( ms, @inicio, @fin )










=>> Saludos. Peni.
=>>







=Saludos. Peni.
=
Respuesta Responder a este mensaje
#34 Leonardo Azpurua
30/10/2007 - 20:56 | Informe spam
"Peni" escribió en el mensaje
news:
Estoy empezando a hacer cosas más o menos "de verdad" con SQL, así que por
aquí seguiré. En los pocos días que ando por aquí me he divertido un
montón leyendo estupendos hilos :-) De todas formas Leonardo tiene razón
en que quizás debo buscar más antes de preguntar, intentaré seguir su
consejo



Yo nunca dije eso...

De hecho, nunca miro los BOL (salvo la referencia de T/SQL o a menos que no
quede más remedio); algo en ellos me produce una especie de alergia en el
sistema cognitivo.

Salud!
Respuesta Responder a este mensaje
#35 Peni
30/10/2007 - 21:12 | Informe spam
Te referiste a probar ... casi lo mismo, probar, buscar ... Creeme si
te digo que he gastado un montón de tiempo buscando en Google, pero hay
cosas que quiero hacer bien desde el principio y el rendimiento me
preocupa bastante. El problema que tengo es que solo recibí un curso
muy básico de SQL y como es lo primero un poco serio que hago en SQL,
quizás quiero abarcar demasiado en poco tiempo y en cuanto me encuentro
con un problema me desespero. Yo estaba acostumbrado al querido/odiado
Access y SQL me supone un cambio de mentalidad enorme y, como bien
dices, los BOL no me solucionan mucho, me resulta sumamente difícil
encontrar lo que quiero,me resultaba muchísimo más cómoda la ayuda de
VB6, por ejemplo.

"Peni" escribió en el mensaje
news:
Estoy empezando a hacer cosas más o menos "de verdad" con SQL, así que por
aquí seguiré. En los pocos días que ando por aquí me he divertido un montón
leyendo estupendos hilos :-) De todas formas Leonardo tiene razón en que
quizás debo buscar más antes de preguntar, intentaré seguir su consejo



Yo nunca dije eso...

De hecho, nunca miro los BOL (salvo la referencia de T/SQL o a menos que no
quede más remedio); algo en ellos me produce una especie de alergia en el
sistema cognitivo.

Salud!




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