Club Delphi  
    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 05-11-2013
briast briast is offline
Miembro
NULL
 
Registrado: may 2011
Posts: 50
Poder: 13
briast Va por buen camino
Optimización consulta SQL con EXISTS en Firebird 2.5

Hola. Quiero optimizar una consulta SQL para Firebird 2.5 en la que filtre los registros de una tabla obteniendo los máximos por fecha de cada grupo.
Me explico mejor con datos y la SQL que estoy utilizando. Simplificaré los datos y la tabla.
La tabla tiene los campos siguientes:
- numero
- serie
- fecha
- referencia

Quiero obtener por cada referencia el número/serie de mayor fecha que sea inferior a una dada. Suponiendo los datos siguientes, por ejemplo:
Código:
2  A    30/10/2009   AX
3  B    25/11/2010   AX
4  A    12/08/2011  RT
5  T    04/03/2010   YU
8  D    09/08/2009    RT
5  A     23/10/2011  AX
2  B     01/10/2012   TD
La consulta debería devolver para fechas anteriores al 01/10/2011:
Código:
AX  3 B
RT  4 A
YU  5 T
Actualmente, para obtener esto uso la siguiente consulta:
Código SQL [-]
select tb1.referencia, tb1.numero, tb1.serie from tbdatos tb1 
where tb1.fecha<='10/01/2011' and 
        not exists (select * from tbdatos tb2 where ((tb1.serie<>tb2.serie) or (tb1.numero<>tb2.numero)) 
                         and tb2.fecha>tb1.fecha and tb2.fecha<='10/01/2011' and tb1.referencia = tb2.referencia)

Actualmente tengo índice por numero/serie (clave primaria), por referencia (porque es clave referencial a otra table y firebird crea un índice por ese campo automáticamente) y también hay un índice por fecha.
La consulta resultante sale indexada, pero el problema es que tarda ya que debe recorrer todos los registros para ir quedándose con el último, lo que al final resulta en un montón de registros leídos.
Quisiera si hay alguna otra manera de reescribir la consulta SQL de manera que usando índices (si hay que añadir alguno me lo indicáis) se limite el número de registros leídos y obtenga directamente los que se requieren.
Gracias por vuestra ayuda.
Un saludo.

Última edición por Casimiro Notevi fecha: 05-11-2013 a las 14:03:21.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Proyecto, Monitoreo y Optimizacion de nuestra BD en Firebird felipe88 Firebird e Interbase 35 07-05-2011 03:02:43
Resultado con exists dudoso sierraja SQL 14 07-04-2010 23:34:26
Exists or not Exists that is the question MaMu SQL 7 05-04-2009 19:29:55
Transaccion con if y con exists zvf SQL 4 18-09-2007 19:52:44
Error en el Exists Payola2011 MySQL 7 31-01-2006 20:17:47


La franja horaria es GMT +2. Ahora son las 08:59:40.


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