Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-11-2012
ARPE1 ARPE1 is offline
Miembro
 
Registrado: nov 2012
Posts: 43
Poder: 0
ARPE1 Va por buen camino
SQL muy lenta la 1ª vez

Hola a tod@s, pues lo dicho, tengo una consulta que al ejecutarla nada más iniciar el PC le cuesta mucho, unos 5 minutos, las siguientes veces la resuelve en 3 segundos. Solo cuando se reinicia el PC, si reinicio el FBServer la resuelve rápida. Tengo índices creados por los campos que forman las condiciones, el plan que utiliza, para mi entender, es el correcto. Si fuera menos diferencia podría entender que se tratara de temas de caché.
La consulta es algo así:
Código SQL [-]
Merge into tabla1 using (   Select campos   from tabla2, tabla3   where condiciones) on condicionRelacion when not matched then insert ....
También he probado esto:
Código SQL [-]
Insert into Tabla1 (campos) Select campos from tabla2, tabla3 where condiciones and not exists (Select Id from tabla1 where condicionRelacion)

a ver si podéis echarme una mano
Gracias de antemano

Última edición por Casimiro Notevi fecha: 23-11-2012 a las 16:43:57.
Responder Con Cita
  #2  
Antiguo 23-11-2012
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Hay un problema conocido con las Base de Datos FB y las copias de seguridad del sistema "Restauración del sistema". Suena a que te está pasando algo así.

Puedes hacer una prueba rápida desactivándola y a ver qué tal.

No estaría mal que dijeras qué sistema estás utilizando (S.O.)

Cuando separamos el sistema, otra cosa que te puede estar pasando es esta.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 23-11-2012
ARPE1 ARPE1 is offline
Miembro
 
Registrado: nov 2012
Posts: 43
Poder: 0
ARPE1 Va por buen camino
Gracias Neftali, apareces por todas partes. Todo eso está comprobado. La verdad es que llevo un par de días a vueltas con esto.
Restaurar sistema desactivado, uso IP en lugar de nombre, la afinidad está puesta a 0 (CPU 1) en firebird.conf, no hay discos shadows y no hay Blobs en esa consulta. He probado en mi equipo con protocolo LOCAL y TCP_IP y lo mismo, la primera vez un dolor las siguientes visto y no visto.
En el cliente el equipo se enciende sobre las 2:00 de la mañana y el lanza la consulta sobre las 9:00, para esas horas todas las tareas de mantenimiento han terminado.
Los SO's:
Cliente: Windows Server 2008 64bits. FB 2.1.4 32bits.
Mi equipo: Windows 7 64bits. FB 2.14 32bits.
Hay que decir que la tabla1 tiene 24 campos, una longitud de registro de unos 14KB y actualmente anda por el millón de registros.
Responder Con Cita
  #4  
Antiguo 23-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bastante difícil es poder ayudar sin tener el equipo a mano y probar, que además lo pones más difícil. Por ejemplo, esas sqls que has puesto no son las que estás usando, evidentemente.

De todas formas, si la primera vez va lento y después va rápido, está claro que hay algo que no tiene que ver con la base de datos, deberías probarlo en local, luego en otro ordenador haciendo de servidor y así comprobar.
Desde luego, que aunque dices que lo has verificado, está claro que algo hace el sistema para tardar tanto la primera vez.

Si en lugar de probar antes esas consultas, pruebas otras diferentes, ¿también va lento la primera vez y después no?.

En fin, que no das mucha información para poder hacernos una idea real del sistema.
Responder Con Cita
  #5  
Antiguo 25-11-2012
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
Hola amigos, la situacion puede ser la siguiente: primero revisar la extension de la base de datos, evitar .gdb y colocarle .fdb, esto es debido a que no me acuerdo desde que version de Windows los archivos con extension .gdb estan relacionados con el sistema operativo y este hace una copia de seguridad la primera vez que se abre el archivo y si es de buen tamañao pude durar unos minutos. Lo segundo es que la consulta es un producto cartesiano puro, es decir, si tienes en la tabal a 1.000 registros y en la b unos 2.000, la tabla resultante endra 2.000.000 de registros y eso es demoradp escribir tantos registros en una tabla mas si tienes indicies y llaves priamrias y foráneas.

Puedes darnos un poco más de información del contenido de las tablas, volumen de registros y la consulta completa para tratar de colaborarte.
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #6  
Antiguo 26-11-2012
ARPE1 ARPE1 is offline
Miembro
 
Registrado: nov 2012
Posts: 43
Poder: 0
ARPE1 Va por buen camino
SQL muy lenta la 1ª vez

Hola y gracias por el interés.
La BD ya tiene extensión FDB. El producto cartesiano puro y duro, en este caso, es obligado. Por varias razones necesito que todos los artículos (tabla2) que entran en la consulta estén en todos los almacenes (tabla3) del cliente.
Ya probé en otro equipo (el mío) con diferentes protocolos (local y tcp_ip), me psa lo mismo. Buena idea esa de probar otras consultas, de momento he lanzado el producto cartesiano "sin condiciones", más duro todavía, y lo ha resuelto rápido. Me queda probarlo con udf's por ver si es tema de reserva de memoria.
La consulta real es la siguiente:
Código SQL [-]
Merge into Artal using (
  Select artic.artic, almac.cod as almac, 
    asCreaTalla(Artic.Tope1, Artic.Tope2) as MTallas,
    asIniTalla(asCreaTalla(Artic.Tope1, Artic.Tope2), 0) as MCeros
  from artic, almac
  where Artic.Activo = 'S' and Artic.Filtro = 'MP'
Datos on (Artal.Artic = Datos.artic and Artal.Almac = Datos.Almac)
When not matched then
  insert (ARTIC, ALMAC, MTALLAS, MSTOCK, MSTMAX, MPRECIBIR, MSTMIN, MUCOMPRAS, MUVENTAS, MPSERVIR, MCURSOFA)
  values (Datos.Artic, Datos.Almac, Datos.MTallas, Datos.MCeros, Datos.MCeros, Datos.MCeros, Datos.MCeros, Datos.MCeros, Datos.MCeros, Datos.MCeros, Datos.MCeros)
Artal: tabla de poco más de un millón de registros con esos 14KB de longitud
Artic: unos 52.000 registros
Almac: 40 registros
asCreaTalla, asIniTalla son udf's que tratan cadenas de texto. Como he mencionado probaré a quitarlas de la consulta por ver si es ese el problema.
Toda la información que necesitéis la pedís, no hay problema, es por no extenderme mucho ya que los mensajes largos a mí me asustan.
Un slaudo.
Responder Con Cita
  #7  
Antiguo 26-11-2012
ARPE1 ARPE1 is offline
Miembro
 
Registrado: nov 2012
Posts: 43
Poder: 0
ARPE1 Va por buen camino
Hola de nuevo, he probado quitando las udf's y tenemos el mismo resultado, la primera vez unos 6 minutos y las siguientes unos 3 segundos. Observando el proceso FBServer hace unas 436.000 lecturas, siempre. La diferencia es que la primera vez va de unos 1.200 en 1.200 y las siguientes de unos 120.000 en 120.000. Curioso que sea justo por 10. ¿Tendrá algo que ver la configuración del FBServer?.
Las que he tocado:
TempBlockSize = 2097152
BugcheckAbort = 1
TcpRemoteBufferSize = 16384

Os pego la cabecera de la BD por si también da pistas:
Database header page information:
Flags 0
Checksum 12345
Generation 4376
Page size 4096
ODS version 11.1
Oldest transaction 2396
Oldest active 4272
Oldest snapshot 4272
Next transaction 4273
Bumped transaction 1
Sequence number 0
Next attachment ID 90
Implementation ID 16
Shadow count 0
Page buffers 2048
Next header page 0
Database dialect 3
Creation date Nov 22, 2012 14:28:30
Attributes force write

Variable header data:
Sweep interval: 0

un saludo.
Responder Con Cita
  #8  
Antiguo 26-11-2012
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
Una pregunta en tu sistema cuando entras por primera vez en el dia haces el merge y luego utilizas la tabla sn volver a ejecutar el merge ? Si es asi pues debe demorarse por el volumen gigante de resitros que estás creando. De otro lado si cada día eliminas los datos del dia anterior y vuelves a crearlos estas limpiando una cantidad de páginas de la base de datos y volviendo a utilizarlos y para firebird es un poco pesado hacer esto y ralentiza efecutar tareas como los backups.

Creo que el volumen de registros es alto por el asunto de ser un producto cartesiano de esas caracteristicas y firebird lo ha resuleto en un tiempo acorde a ese volúmen. Muy respetuosamente, haz revisado si la solución que encuentras en el merge es posible que pueda hacerse por otro camino ?

Cuanto gigas mide tu base de datos ?
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #9  
Antiguo 26-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Yo nunca he necesitado usar merge ni matched, seguramente puedas hacerlo de otra forma.
Es más, es que ni siquiera sabía de la existencia de ellos.
Aunque tampoco debería ser motivo de lentitud la primera vez.
Responder Con Cita
  #10  
Antiguo 26-11-2012
ARPE1 ARPE1 is offline
Miembro
 
Registrado: nov 2012
Posts: 43
Poder: 0
ARPE1 Va por buen camino
Hola Ibuelvas.
Este proceso lo ejecutan varias veces a lo largo del día. Registros nuevos pueden ser del orden de 1 ó 2, no dan de alta materias primas todos los días, y si dan será 1 ó 2. Claro que para saber si están o no compara con gran cantidad de registros, los del artal. El producto cartesiano que tanto nos preocupa a todos, la verdad que cuando veo uno lo primero es echarme las manos a la cabeza, lo resuelve siempre en pocos milisegundos. No se eliminan nunca los registros de las materias activas.
Hoy estoy probando con la sieguiente SQL que es prácticamente lo mismo:
Código SQL [-]
Select artic.artic, almac.cod as almac
from artic, almac
where artic.activo = 'S' and artic.filtro = 'MP' and
  not exists (
    Select artal.artic
    from artal
    where artal.artic = artic.artic and artal.almac = almac.cod)
He probado en FB2.1.4 32bits, FB2.1.4 64bits y en FB2.5.264bits todos sobre un Windows 7 64bits virtualizado con 6GB de ram y dos cores a 3.4GHz y mismo resultado, la primera vez penoso y las siguientes de alucinar.
Creo que va a ser temas de caché aunque me cueste creerlo. Por si da pistas, las pruebas echas con FB2.1 32 y 64bits han atacado a la misma BD, pues bien en cuanto lo ejecutaba con un servidor el otro era rapidísimo, indistintamente de cuál usara primero.
Un saludo
Responder Con Cita
  #11  
Antiguo 26-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿El servidor es un windows virtual?

Si es windows entonces supongo que estarás usando la versión superserver, además "ánclalo" a una sola cpu, no uses más de 1. Cambia firebird.conf la propiedad CpuAffinityMask por el valor apropiado.
El tamaño de página debe ser 8192 al menos.
Si es una máquina virtual entonces procura que sea de tamaño fijo, no dinámica. No estaría mal tener un disco aparte para los archivos temporales.
También te recomiendo que mires este documento, aunque es para windows 2003, creo que es válido para las siguientes versiones.
Responder Con Cita
  #12  
Antiguo 26-11-2012
ARPE1 ARPE1 is offline
Miembro
 
Registrado: nov 2012
Posts: 43
Poder: 0
ARPE1 Va por buen camino
Hola Casimiro, el del cliente es un Server 2008 64bits y sí, es un virtual con VMWare. Las últimas pruebas, por no tocar mi sistema, las he echo sobre un Win 7 64bits virtualizado con VBox, pero también hice sobre mi equipo con windows real obteniendo los mismos resultados.
La propiedad CpuAffinityMask está a 1, antes no lo he indicado porque es el valor que, en teoría, viene por defecto, aún así lo tengo sin la almuadilla (#) de comentario.
Todas las instalaciones que tengo son superServer. Me has leído el pensamiento, mientras hacía un backup/restore para cambiar el tamaño de página ha entrado tu respuesta (por cierto gracias).
Con respecto al documento, por si acaso, lo pondré en el registro del cliente (ya le vale al Windows tiene un servicio definido como gds_db y puerto 3050 y aún así tiene que tocar las narices????).

Un saludo y muchas gracias
Responder Con Cita
  #13  
Antiguo 26-11-2012
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
o también puede usar SuperClassic, el cual si permite manejar bien los nucleos y manejar muy bien excepciones de Firebird
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #14  
Antiguo 26-11-2012
ARPE1 ARPE1 is offline
Miembro
 
Registrado: nov 2012
Posts: 43
Poder: 0
ARPE1 Va por buen camino
Hola, en el cliente tengo instalado el FB 2.1.4 el cual no me permite superclassic. Tengo intención de cambiar el motor pero todavía estoy en fase de pruebas.
Por cierto se me olvidó en el anterior, los discos en el cliente no sé si son dinámicos o fijos, de eso no me encargo, se lo preguntaré. Lo que sí está es un disco separado para los temporales del firebird.
Un saludo
Responder Con Cita
  #15  
Antiguo 26-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Tanto en clientes como en servidor debe estar la misma versión de firebird, no los mezcles.
Responder Con Cita
  #16  
Antiguo 26-11-2012
ARPE1 ARPE1 is offline
Miembro
 
Registrado: nov 2012
Posts: 43
Poder: 0
ARPE1 Va por buen camino
Hola, y así es, en todos está el fb 2.1.4
Responder Con Cita
  #17  
Antiguo 26-11-2012
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
Bueno, esa tabla artal podrias manejarla como una vista y te evitas el problema de estar insertando esa millonada de registros. Creo que si revisamos detenidamente el diseño de la base de datos podriamos darle otra soución a tu situación.
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #18  
Antiguo 26-11-2012
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
bueno, algo que yo he notado en Widows es que cuando hay varios procesadores es mejor trabajar con ClasicServer que con SuperServer, y mejor aun SuperClassic, pero sí solo hay un procesador es mejor trabajar con SuperServer, la aplicación que más me ocupa, tiene un nivel de instalación bastante alta al mes, cuando se instala en un multinucleo un SuperServer suele bloquearse en tareas que demanden mucho al procesador
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #19  
Antiguo 26-11-2012
ARPE1 ARPE1 is offline
Miembro
 
Registrado: nov 2012
Posts: 43
Poder: 0
ARPE1 Va por buen camino
Hola, la tabla artal es necesaria, hay campos que se actualizan en diferentes trigger's de la BD. No veo como convertirla en vista.
Voy a probar el superclassic en mi Win7 vBox a ver qué me encuentro.
Otra curiosidad, al probar los cambios de tamaño de página (backup/restore) resulta que depués de ese proceso la resuelve rapidísimo. Es decir, inicio el sistema, hago un backup/restore sin tocar nada, ejecuto la consulta y la resuelve en 3 segundos.
Cada vez apunta más a caché, ¿qué opináis?, ¿cada BD tiene su propia caché o es el firebird el que mantiene una única (hablando en superServer)?
Un saludo.
Responder Con Cita
  #20  
Antiguo 26-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ARPE1 Ver Mensaje
Cada vez apunta más a caché, ¿qué opináis?, ¿cada BD tiene su propia caché o es el firebird el que mantiene una única (hablando en superServer)?
En los ¿13? años de existencia de firebird (y antes con su antecesor interbase, 3 años más) jamás he necesitado tocar ningún parámetro de la configuración.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
aplicación lenta Celta Varios 2 13-01-2012 13:42:19
Conexion Con Interbase/FireBIrd lenta...muy lenta federiconqn21 Firebird e Interbase 3 11-03-2010 13:13:34
Aplicacion lenta aanil OOP 4 26-01-2010 15:11:39
Ayuda con consulta lenta, lenta, lenta Gregory Mazon Firebird e Interbase 22 27-06-2007 09:56:38
Impresion lenta, muy lenta... Perio Impresión 2 20-05-2005 13:10:00


La franja horaria es GMT +2. Ahora son las 02:59:38.


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