![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Hola,
En este segundo procedimiento almacenado no tienes demasiadas consultas. Ejecútalas manualmente, y verás cual de ellas es la que se demora tanto. Es decir en IBExpert (o el gestor que utilizes) lanza directamente : select distinct (l.tipo) from listado_servicios l where tipo<>'INTERNACION' Si se ejecuta rápido, te olvidas de ello y pasas a la siguiente consulta : select distinct m.usuario from listado_registro_servicios_amb (:f1, :f2, 'T') m where (m.tipo_servicio=:tipo_servicio) Hasta dar con la consulta que va lenta. Supongamos que efectivamente resulta ser : select coalesce(sum(case when m.costo is null then 0 else m.costo end),0) as monto_recibo from listado_registro_servicios_amb (:f1,:f2,'T') m where ((M.usuario=:USUARIO)AND(m.factura='RECIBO')and(m.tipo_servicio=:tipo_servicio)) Entonces tienes que optimizar la consulta, y para hacerlo se utilizan, como bien has dicho, índices. Pero crear los índices no es simplemente hacer un índice para cada campo implicado. No, puesto que eso no le sirve al sistema para agilizar una consulta como la anterior. En ese caso necesitas un índice múltiple, es decir un solo índice con los campos : usuario, factura, tipo_servicio Si la consulta que te demora la ejecución del procedimiento almacenado resulta ser otra, simplemente dinos cual es y te ayudaremos a definir el índice adecuado para optimizarla. Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
#2
|
||||
|
||||
|
Mejor cambia el índice múltiple que te he dicho por un índice sobre : usuario, tipo_servicio, factura (el orden es importante), y ahora ya podrá optimizar las tres consultas que tienes sobre listado_registro_servicios_amb
En cambio el índice que te había propuesto inicialmente : usuario, factura, tipo_servicio no podía ser usado para optimizar la consulta : select m.tipo_servicio,sum(m.costo) from listado_registro_servicios_amb (:f1,:f2,'T') m where ((m.tipo_servicio=:tipo_servicio)AND(M.usuario=:USUARIO)) group by m.tipo_servicio Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
#3
|
||||
|
||||
|
Utiliza el IB PlanAlizer ese utilizo yo para mejorar mis consultas.
|
|
#4
|
||||
|
||||
|
Hola,
he estado mirando por encima la consulta, y hay algo que me 'cruje'. Estás utilizando tablas en la consulta que no están incluidas en ningún inner join, por lo que te debe ( en teoría según lo que tengo entendido ) devolverte más filas de las que necesitas. Ahora no me sale el nombre de esa forma de hacer una select SELECT * form TABLA1, TABLA2 -> devuelve el nº de registros de TABLA1 multiplicado por el nº de registros de TABLA2, que obviamente PUEDE que no sea el resultado que necesites. Lo normal es hacer SELECT * FROM TABLA1 T1 INNER JOIN TABLA2 T2 ON ( T1.ID=T2.ID) WHERE condiciones que devolverá los registros que existan en las dos tablas y cumplan las condiciones Espero haberte ayudado. Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
|
#5
|
||||
|
||||
|
Ya me acuerdo, el nombre de este tipo de select es producto cartesiano, que devuelve por cada registro de una tabla todos los registros de la otra.
Creo que puede ser lo que ralentiza la consulta. Haces el producto cartesiano, te devuelve tropecientos mil registros, pero al aplicar las condiciones de la where te devuelve el resultado esperado. Pero a costa de 'machacar' al servidor. Prueba poniendo INNER JOIN en todas las consultas ( que tienes unas cuantitas ) en todas las tablas que no lo tienen. Seguramente el rendimiento mejorará. Como dice guillotmarc, hazlo por separado para comparar resultados de cada select, primero tal y como la tienes y luego la versión modificada con INNER JOIN. Cuentanos los resultados... y cuando consigas que tarde un par de segundos, ya verás como los usuarios te dirán que sigue tardando mucho ( te lo digo por porpia experiencia ).Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
|
#6
|
||||
|
||||
|
No me había fijado que LISTADO_REGISTRO_SERVICIOS_AMB es el primer procedimiento almacenado y no una tabla.
Esta claro que el problema lo tienes en ese procedimiento almacenado. Pues ya sabes lo que tienes que hacer, ejecutar por separado cada consulta de ese procedimiento almacenado para identificar las que van realmente lentas, y después te ayudaremos a crear los índices a optimizarlas (necesitas índices múltiples). Como dice Kipow, puedes usar programas como el IB PlanAlize para ejecutar cada una de las consultas implicadas en el procedimiento almacenado y detectar los cambios a hacer en los índices.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
#7
|
|||
|
|||
|
mil disculpas no pude entrar antes, pero muchas gracias por las respuestas
,disculpas pues haciendo pruebas mande el codigo del primer SP con inner join y where. Respecto al programa que me sugieren lo estoy buscando en la red para bajarlo y probarlo en lo que respecta a la sugerencia del primer compañero hice las pruebas por separado y la ejecucion es casi inmediata de los select del 2do SP. Trabajo con el ibexpert y quite todo lo que esta dentro del begin suspend y tarda como 30 seg el SP 2 es este: y cuando lo quito la parte central queda asi : (ahi me tarda promedio 20 seg) Y respecto a indices multiples como me suguieren como tendria que realizarlo??? en la tabla donde estan estos campos?? porfavor quisiera un poco de ayuda sobre los indices multiples Mil gracias |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Firebird, tarda mucho en conectar a base de datos en red | sonjeux | Conexión con bases de datos | 1 | 09-04-2009 08:29:40 |
| rewrite tarda si no hay red | jonmendi | OOP | 0 | 25-09-2008 10:03:23 |
| Ayuda Urgente, Por favor. Tarda mucho en traer los datos. | Paradiso | Firebird e Interbase | 25 | 31-05-2007 04:02:37 |
| Form que se tarda mucho en abrir | IVAND | Varios | 3 | 29-05-2007 02:14:07 |
| Por que tarda mucho en abrir un EXE | IcebergDelphi | Varios | 5 | 16-06-2004 11:05:28 |
|