![]() |
![]() |
| 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.
El hecho de unir los dos procedimientos en uno solo, te va a proporcionar un aumento mínimo del rendimiento. Yo no lo haría, sobretodo cuando está claro que tienes un problema de falta de índices.(Saltarse el procedimiento almacenado, solo valdria la pena si quieres pasar de un rendimiento de, pongamos 1.5 segunos a 1.0 segundos, pero no es el caso). Tienes que estudiar el plan de ejecución de cada una de las consultas involucradas. Te va a indicar el índice que se utiliza para cada tabla y unión involucrada en la consulta. Lo primero que tienes que buscar es tablas donde te muestre NATURAL, aquí te está indicando que esa tabla no se optimiza con ningún índice. (En caso de que todas las tablas utilizen un índice, entonces tendrás que buscar que índice es de poca ayuda en la consulta, y sustituirlo por un índice compuesto de varios campos). Además puedes utilizar un depurador de procedimientos almacenados. Ejecutando línea a línea el procedimiento almacenado, vas a ver en que línea se pierde el rendimiento. Utiliza SQL'92 y no SQL'89 (creo). Estás creando un producto cartesiano : Código:
select distinct
renopla2.NUMALU, renopla2.nombre, renopla2.TELFALU, renopla2.nomcli,
renopla2.fecfincurso, grupos.alias
from renopla2 EXTE, grupos , comen
where (( select count (*) from renopla2 inte
Where inte.numalu=exte.numalu)=1 )
and ((renopla2.numalu=comen.numalu) and (comen.tipo=97) and (comen.alias=grupos.alias))
Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
#2
|
||||
|
||||
|
Hola,
Cita:
Cita:
Cita:
Cita:
¿donde estoy creando un producto cartesiano? Perdona pero, ¿me lo puedes aclarar algo más? Muchas gracias por todo, Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
|
#3
|
|||
|
|||
|
Cita:
La versión personal es gratuita Cita:
Cita:
Si no usas joins, lo que estás creando es un producto cartesiano. En este caso entre renopla2 y grupos. |
|
#4
|
|||
|
|||
|
Hola cadetill,
Cita:
Cita:
Cita:
Muchas gracias, Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) Última edición por Giniromero fecha: 09-06-2004 a las 13:31:45. |
|
#5
|
||||
|
||||
|
Hola.
Cita:
El plan de ejecución consta de la lista de índices que se utilizan para optimizar la consulta. Para más información sobre los planes de ejecución puedes utilizar la herramienta IbPLANAnalyzer http://delphi.weblogs.com/IBPLANalyzer Cita:
select XXX from Tabla1, Tabla2 Deberias especificar el tipo de unión de las tablas mediante un Inner Join o un Left Outer Join. select XXX from Tabla1 inner join Tabla2 on Tabla1.Campo1 = Tabla2.Campo2 (consulta la documentación de Interbase para mas detalles del inner y outer join) Cita:
Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). Última edición por guillotmarc fecha: 09-06-2004 a las 15:32:17. |
|
#6
|
||||
|
||||
|
Respecto a los planes de ejecución. En IB-Expert tienes una pestaña al cargar un procedimiento almacenado, llamada 'Plan Analyzer', en ella se muestran en forma de árbol los planes de las consultas del procedimiento.
NOTA: Aunque me parece que esto no está disponible en la versión gratuita. Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
#7
|
|||
|
|||
|
Hola,
Vale, me he bajado el trial de la versión completa del IbExpert, y el IbPLANAnalyzer. He descubierto, que hay algo que no necesitaba, y que me cargaba mucho el procedimiento. En cualquier caso, ahora no me funciona correctamente el código de : Código:
where (( select count (*) from alumnos inte
Where inte.numalu=exte.numalu)=1 )
Código:
select distinct exte.NUMALU, (exte.NOMALU || ' ' || exte.APELALU) AS NOMBRE,
exte.TELFALU,
matri.fecfin,
grupos.alias,
(clientes.nomcl || ' ' || clientes.apelcl) as nomcli,
comen.alias
FROM ((((alumnos exte INNER JOIN matri ON exte.numalu=matri.NUMALU)
inner JOIN grupos ON matri.numgrup=grupos.numgrup)
inner join clientes on exte.nic=clientes.nic)
inner join comen on exte.numalu=comen.numalu)
/* Donde tengan matrícula activas y el producto asociado a esta, esto es el curso
esté entre el 21 y el 40, que son los grupos de los niños y jovenes*/
where (( select count (*) from alumnos inte
Where inte.numalu=exte.numalu)=1 )
and ((matri.caubaja=1) and (grupos.PRODUCTO>'21' and grupos.producto<='40'))
/* Que ademas tengan comentario de recomendacion curso siguiente y sea de este año*/
AND ((comen.tipo=97) and (extract (year from comen.fecha))=(extract (year from current_date)))
ORDER BY exte.numalu
Código:
where (( select count (*) from alumnos inte
Where inte.numalu=exte.numalu)=1 )
Muchas gracias por vuestra paciencia, Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|