Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-06-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
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))
El Optimizador va a tener dificultades en optimizar esto. Con los INNER JOIN y LEFT OUTER JOIN del SQL'92 te queda un código mucho más legible, y ayudas al optimizador.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #2  
Antiguo 09-06-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 24
Giniromero Va por buen camino
Hola,

Cita:
Empezado por guillotmarc
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).
okis

Cita:
Empezado por guillotmarc
Tienes que estudiar el plan de ejecución de cada una de las consultas involucradas.
Bien, pero, ¿como hago esto?, ¿hay alguna herramienta que pueda utilizar?


Cita:
Empezado por guillotmarc
Utiliza SQL'92 y no SQL'89 (creo).
Perdón por mi torpeza pero, ¿como sé cual estoy usando, y en tal caso, como lo cambio?, ¿que implica tener uno u otro?


Cita:
Empezado por guillotmarc
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


where (( select count (*) from renopla2 inte
         Where inte.numalu=exte.numalu)=1 )
and (renopla2.aliascomen=grupos.alias)
ORDER BY   renopla2.NUMALU, renopla2.fecfincurso desc
El Optimizador va a tener dificultades en optimizar esto. Con los INNER JOIN y LEFT OUTER JOIN del SQL'92 te queda un código mucho más legible, y ayudas al optimizador.

Saludos.

¿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á :)
Responder Con Cita
  #3  
Antiguo 09-06-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 27
__cadetill Va por buen camino
Cita:
Empezado por Giniromero
Bien, pero, ¿como hago esto?, ¿hay alguna herramienta que pueda utilizar?
Con el IBExpert mismo puedes controlarlo (paso a paso) www.ibexpert.com
La versión personal es gratuita

Cita:
Empezado por Giniromero
Perdón por mi torpeza pero, ¿como sé cual estoy usando, y en tal caso, como lo cambio?, ¿que implica tener uno u otro?
no es una "version" de SQL "instalada" en tu PC, sino cómo usas el SQL, la definición de los estandares (soportados o no por los motores de bases de datos). El estándar del 92, la mayoría de SGBD lo soportan. En él, se definieron entro otras cosas, el uso de los JOINS (inner, left, outer)

Cita:
Empezado por Giniromero
¿donde estoy creando un producto cartesiano?
Aquí:
Código SQL [-]
from renopla2 EXTE, grupos
Si no usas joins, lo que estás creando es un producto cartesiano. En este caso entre renopla2 y grupos.
Responder Con Cita
  #4  
Antiguo 09-06-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 24
Giniromero Va por buen camino
Hola cadetill,


Cita:
Empezado por cadetill
Con el IBExpert mismo puedes controlarlo (paso a paso) www.ibexpert.com
La versión personal es gratuita
Pero con la versión gratuita, ¿se puede estudiar el plan de ejecución de cada una de las consultas involucradas? ¿como? ¿donde?

Cita:
Empezado por cadetill
no es una "version" de SQL "instalada" en tu PC, sino cómo usas el SQL, la definición de los estandares (soportados o no por los motores de bases de datos).
vale
Cita:
Empezado por cadetill

El estándar del 92, la mayoría de SGBD lo soportan. En él, se definieron entro otras cosas, el uso de los JOINS (inner, left, outer)


Aquí:
Código SQL [-]
from renopla2 EXTE, grupos
Si no usas joins, lo que estás creando es un producto cartesiano. En este caso entre renopla2 y grupos.
¿por no usar un inner join?, vale, y si eso implica que creo un producto cartesiano, y eso implica que va más lento, ¿como hago para, usando el inner join, poder usar el código:

Código SQL [-]
where (( select count (*) from renopla2 inte
         Where inte.numalu=exte.numalu)=1 )

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.
Responder Con Cita
  #5  
Antiguo 09-06-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Hola.

Cita:
Empezado por Giniromero
Pero con la versión gratuita, ¿se puede estudiar el plan de ejecución de cada una de las consultas involucradas? ¿como? ¿donde?
Cuando lanzas una consulta cualquiera en el SQL Editor de las IB-Expert, en la ventana inferior te muestra el plan de ejecución estimado y utilizado (asi como el tiempo de ejecución, etc. ...)

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:
Empezado por Giniromero
¿por no usar un inner join?, vale, y si eso implica que creo un producto cartesiano, y eso implica que va más lento, ¿como hago para, usando el inner join, poder usar el código:
Se crea un producto cartesiano al lanzar una consulta de este tipo (sintaxis slq'89) :

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:
Empezado por Giniromero
Código SQL [-]
where (( select count (*) from renopla2 inte
Where inte.numalu=exte.numalu)=1 )
Este condición no tiene nada que ver con la sintaxis de uniones de tablas de sql'89 i sql'92. Es perfectamente válida independientemente de como se hayan indicado las uniones de las tablas involucradas.

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.
Responder Con Cita
  #6  
Antiguo 09-06-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
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).
Responder Con Cita
  #7  
Antiguo 11-06-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 24
Giniromero Va por buen camino
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 )
El código que tengo ahora mismo es:


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
Tiene que haber algo mal que hace que la parte del:

Código:
where (( select count (*) from alumnos inte
         Where inte.numalu=exte.numalu)=1 )
No funcine correctamente. ¿alguna Idea?

Muchas gracias por vuestra paciencia,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 18:48:10.


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
Copyright 1996-2007 Club Delphi