Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-03-2009
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Rapidez en consulta

Hola amigos, estoi teniendo hartos problemas con las consultas SQL, se estan demorando demasiado.

Espongo el codigo que utilizo, a ver si me pueden ayudar.

Código SQL [-]
select DISTINCT E.AREA, SUM(IIF(P.ESTADO ='A',1,0)),
SUM(IIF(P.ESTADO ='P',1,0)) from ESTRUCTURA E LEFT JOIN COMPRAS P
ON E.EMPRESA =P.EMPRESA AND E.AREA = P.AREA AND E.SUBAREA = P.SUBAREA
WHERE E.empresa = 'emp1'
GROUP BY E.AREA

La tabla Estructura, como su nombre lo dice, contiene la estructura de mi centro de costo, la tabla compras estan alojadas las compras, en donde el campo "estado", hace referencia a lo que necesito consultar.

Esta consulta esta demorando unos 10 segundos mas o menos, el asunto es que si cambio el LEFT JOIN, po INNER JOIN, anda de maravilla, instantaneo, pero solo me arroja las area de la tabla estructura y que ademas cohincida que tiene algun registro con el campo area.

Bueno lo que acabo de escribir es que realmente hace la funcion INNER JOIN, pero la que me interesa a mi es LEFT JOIN.

Alguien tiene alguna otra idea de como hace esta consulta de otra manera, y que vaya mas rapido.

Gracias
Responder Con Cita
  #2  
Antiguo 04-03-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Tienes los índices adecuados? Por ejemplo, tu tabla compras debería tener índices en los campos que la relacionan con la de estructura.

// Saludos
Responder Con Cita
  #3  
Antiguo 04-03-2009
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
nunca he utilizado los indices, utilizo IBExpert y Firebird 2.0.

Código SQL [-]
select DISTINCT E.AREA, SUM(IIF(P.ESTADO ='A',1,0)),SUM(IIF(P.ESTADO ='P',1,0)) from ESTRUCTURA E LEFT JOIN COMPRAS PON E.EMPRESA =P.EMPRESA AND E.AREA = P.AREA AND E.SUBAREA = P.SUBAREAWHERE E.empresa = 'emp1'GROUP BY E.AREA

Con el codigo que señalo, los indices en que tabla debieran ir? en estructura o compras?

Como debiera agregarse, que tipo de indice necesitare?

Ojala me puedan guiar para poder resolver este asunto.

Gracias
Responder Con Cita
  #4  
Antiguo 05-03-2009
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Amigos, no hay caso con este tema, por mas que busco e intento soluciones con logro aumentar la velocidad de la busqueda.

ALguna idea de como mejorar esto, lo que me interesa es que me arroje una lista con todas las distintas area, la suma del presupuesto y suma de compras. El asunto es que si utilizo inner join, funciona perfecto, pero no me arroja la totalidad de las areas, y al utilizar left join si que me arroja todas las areas, pero leeento.

He intentado con indices, vistas, etc. y no he podido mejorar esto.

Creo que no es algo tan complejo de realizar, mas bien, debiera ser un tema comun en consultas... 2 columnas una con las distintas area y la segunda la sumatoria de algo, indistintamente si hay o no registros en la segunda tabla.


Bueno amigos, espero me puedan ayudar ya que este tema me esta volviendo loko.

Muchas gracias
Responder Con Cita
  #5  
Antiguo 05-03-2009
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Amigos, no hay caso con este tema, por mas que busco e intento soluciones con logro aumentar la velocidad de la busqueda.

ALguna idea de como mejorar esto, lo que me interesa es que me arroje una lista con todas las distintas area, la suma del presupuesto y suma de compras. El asunto es que si utilizo inner join, funciona perfecto, pero no me arroja la totalidad de las areas, y al utilizar left join si que me arroja todas las areas, pero leeento.

He intentado con indices, vistas, etc. y no he podido mejorar esto.

Creo que no es algo tan complejo de realizar, mas bien, debiera ser un tema comun en consultas... 2 columnas una con las distintas area y la segunda la sumatoria de algo, indistintamente si hay o no registros en la segunda tabla.


Bueno amigos, espero me puedan ayudar ya que este tema me esta volviendo loko.

Muchas gracias
Responder Con Cita
  #6  
Antiguo 05-03-2009
Avatar de Kipow
Kipow Kipow is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guatemala
Posts: 329
Poder: 19
Kipow Va por buen camino
Coloca la estructura de las 2 tablas, a ver si podemos ayudar en algo. por lo pronto te digo que con indices podes mejorar mucho, podrias tambien modificar el PLAN. Para firebird yo utilizo el Interbase PLANalyzer y me ha servido mucho.
Responder Con Cita
  #7  
Antiguo 22-03-2009
cdac901 cdac901 is offline
Miembro
 
Registrado: feb 2008
Posts: 12
Poder: 0
cdac901 Va por buen camino
Hola creo que por la cantidad de datos, deberias realizar un procediemto almacenado

Código SQL [-]
CREATE PROCEDURE NEW_PROCEDURE
RETURNS(AREA VARCHAR(10),
        ESTADO_A INTEGER,
        ESTADO_P INTEGER) /* NO SE DE QUE TIPO SON LOS CAMPOS*/
AS
DECLARE VARIABLE V_ESTADO CHAR(1);
BEGIN
   ESTADO_A = 0;
   ESTADO_P = 0;

   FOR
       SELECT DISTINCT
              E.AREA,
              P.ESTADO
         FROM ESTRUCTURA E
    LEFT JOIN COMPRAS P
           ON ( (E.EMPRESA = P.EMPRESA) AND (E.AREA = P.AREA) AND (E.SUBAREA = P.SUBAREA) )
        WHERE E.EMPRESA = 'emp1'
         INTO :AREA,
              :V_ESTADO

   DO BEGIN
         IF (V_ESTADO = 'A') THEN
             ESTADO_A = 1;

         IF (V_ESTADO = 'P') THEN
             ESTADO_P = 1;

         SUSPEND;
      END
END


Luego de esto podrias hacer un sql con el resultado del procedimiento

Código SQL [-]
SELECT A.AREA, SUM(A.ESTADO_A), SUM(A.ESTADO_P) FROM NEW_PROCEDURE A

Agrega dos indices en la Tabla ESTRUCTURA campo ESTADO ascendente y descendente respectivamente, asi como los campos que estan despues del ON (E.EMPRESA, P.EMPRESA, E.AREA...)

Espero que te sirva

Última edición por cdac901 fecha: 22-03-2009 a las 21:13:26.
Responder Con Cita
  #8  
Antiguo 29-03-2009
Cheerpipe Cheerpipe is offline
Miembro
 
Registrado: oct 2006
Posts: 46
Poder: 0
Cheerpipe Va por buen camino
Como dicen en la primera respuesta, una consulta que no usa indices, es una consulta destinada a morir XD..


select DISTINCT E.AREA, SUM(IIF(P.ESTADO ='A',1,0)),
SUM(IIF(P.ESTADO ='P',1,0)) from ESTRUCTURA E LEFT JOIN COMPRAS P
ON E.EMPRESA =P.EMPRESA AND E.AREA = P.AREA AND E.SUBAREA = P.SUBAREA
WHERE E.empresa = 'emp1'
GROUP BY E.AREA


Los siguientes campos deberian estar presentes en algun indice: (EMPRESA, AREA, SUBAREA), idealmente los 3 en 1 mismo indice si aplica, y otros indices con cada campo individual.
Yo tengo sistemas con consultas tremendamentes mas complejas, en tablas con miles y miles de registros y ninguna se ejecuta en mas de medio segundo, todo gracias a un correcto uso de indices.
Yo que tu me daria un tiempo para buscar informacion sobre un buen uso de indices en una base de datos, ya que conocerlos es algo simplemente indispensable.

Por ultimo, tambien hay que evitar la creacion exesiva de indices o de indices que no son necesarios, ya que la contraparte de estos es que disminullen la velocidad de consultas DML.

Última edición por Cheerpipe fecha: 29-03-2009 a las 20:55:57.
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
Rapidéz Mental egostar Humor 0 28-07-2006 19:56:48
Rapidez de las Tablas y Aplicacion Carliviris Varios 4 17-07-2006 10:52:54
Rapidez de consulta estebanx MS SQL Server 13 03-07-2006 23:41:36
dar rapidez a una base de datops access joanajj Conexión con bases de datos 6 21-07-2005 12:30:00
dar rapidez a la apertura de Tablas jhges Conexión con bases de datos 2 29-03-2004 10:09:00


La franja horaria es GMT +2. Ahora son las 21:17:15.


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