FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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.
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 |
#2
|
||||
|
||||
¿Tienes los índices adecuados? Por ejemplo, tu tabla compras debería tener índices en los campos que la relacionan con la de estructura.
// Saludos |
#3
|
|||
|
|||
nunca he utilizado los indices, utilizo IBExpert y Firebird 2.0.
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 |
#4
|
|||
|
|||
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 |
#5
|
|||
|
|||
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 |
#6
|
||||
|
||||
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.
|
#7
|
|||
|
|||
Hola creo que por la cantidad de datos, deberias realizar un procediemto almacenado
Luego de esto podrias hacer un sql con el resultado del procedimiento
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. |
#8
|
|||
|
|||
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. |
|
|
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 |
|