Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Sql lenta la primera vez (https://www.clubdelphi.com/foros/showthread.php?t=69797)

toni.vi 09-09-2010 19:16:53

Sql lenta la primera vez
 
Utilizo D7 y FB1.5 me ocurre que la primera vez que ejecuto la sql de abajo me va lento aproximadamente tarda 1 minuto.
Si la vuelvo a ejecutar posteriormente ya va rapida unos 2 segundos.
Para que vaya lenta debo cerrar el pc y encenderlo de nuevo.
Código SQL [-]
Select  a.ARTICULO,a.DESCRIPCION
, (Select Sum (b.ENTRADAS - b.SALIDAS) from HISTORICO b  where b.ARTICULO = a.ARTICULO) as Stock
From ARTICULOS a
WHERE ARTICULO > 0
en Historico y en Articulos existe una clave para ARTICULO.
Todas las claves estan activas.
¿Alguna sugerencia?

Casimiro Noteví 09-09-2010 21:03:17

El problema es que debe recorrer por completo la tabla de 'historico' para hacer el sum() de los campos 'salidas' y 'entradas'.
Y se supone que en 'historico' tienes muchos registros.
Y por si fuese poco, lo tiene que recorrer por cada artículo.

Yo probaría primero con el 'select sum()' con cualquier artículo para ver cómo se comporta, y una vez afinado ese select es cuando lo probaría por completo.

elarys 09-09-2010 22:15:27

Digamos que tu consulta es simplemente muy fea jajaja, ahora veamos como podria ser para acelerar un poco el sql

elarys 09-09-2010 22:25:11

Usaria algo como esto... alguien tiene una mejor idea

Código SQL [-]
Select  a.ARTICULO,a.DESCRIPCION,
  (SUM(b.ENTRADAS)-SUM(b.SALIDAS)) as Stock
From ARTICULOS a
LEFT JOIN HISTORICO b ON (b.ARTICULO = a.ARTICULO)
WHERE a.ARTICULO > 0 GROUP BY a.ARTICULO

Tambien podria ser INNER JOIN en lugar de LEFT JOIN pero eso lo dejo a criterio del creador de la base de datos

toni.vi 09-09-2010 23:36:09

Hay unos 7500 articulos y 95.000 registros en historico.
Con la consulta que me propones, continúa siendo lenta la primera vez.
Ahora en vez de 1 minuto esta unos 30 segundos, y el resto de veces es más o menos igual.
Lo que no entiendo es porque la primera vez es más lenta y despues más rápida.
Estoy haciendo la consulta con IBExpert.
Incluso parando el motor de base de datos y arrancando de nuevo, continúa siendo rápido.
Pero si cierro el pc y lo reinicio vuelvo a ser lento la primera vez.

Por cierto, casimiro, si primero hago un
Código SQL [-]
select count(*) from historico
o
select sum(entradas) from historico
Cuando hago la select normal ya funciona rápido.
Es como si tuviera que ver recorrerse una vez el historico.....

Casimiro Noteví 09-09-2010 23:44:41

Pero si haces esa primera vez: select count(*) from historico
¿es lento también?

Pásanos la estructura de la tabla

toni.vi 09-09-2010 23:57:58

No, si hago primero el select count o select sum(), la primera vez ya funciona rapido.
Puedo enviarte la base de datos solo con las 2 tablas, ocupa 1,5Mb en rar.

Casimiro Noteví 10-09-2010 00:06:44

envíamelo por email, si quieres

Casimiro Noteví 10-09-2010 03:29:59

Bueno, he estado haciendo algunas pruebas y no he detectado lentitud en ningún caso, ni la primera vez... ni ninguna :confused:
Código:

Select  a.ARTICULO,a.DESCRIPCION,
      (Select Sum (b.ENTRADAS - b.SALIDAS)
        from HISTORICO b 
        where b.ARTICULO = a.ARTICULO) as Stock
From ARTICULOS a
WHERE ARTICULO > 0  // <-- es un campo varchar(20), pon: where a.articulo<>'0'

Cita:

Empezado por flamerobin
Executing...
Done.
32637 fetches, 0 marks, 0 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 13962 index, 936 seq.
Delta memory: -8748 bytes.
Total execution time: 0,207s
Script execution finished.



La franja horaria es GMT +2. Ahora son las 01:09:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi