Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-02-2013
mordaz mordaz is offline
Miembro
 
Registrado: mar 2008
Posts: 32
Poder: 0
mordaz Va por buen camino
Unhappy Ayuda con consulta SQL

Que tal a todos,

Hice una consulta en SQL que con pocos registros funcionaba muy bien pero ahora se tarda hasta 30 minutos en procesar. Utilizo Interbase 6.5 y el programa esta hecho en C++ Builder 6. Si alguien me puede ayudar a optimizar la consulta se los agradecería. La consulta es la siguiente:

La base de datos al dia de hoy mide unos 50 Mb

SELECT Codigo,Precio,Cantidad
FROM Ventas_Conceptos
WHERE Venta_key IN (
SELECT Venta_key
FROM Ventas
WHERE Corte=50
AND Cancelada IS NULL)

Es una consulta sencilla salvo el hecho de que tiene un IN y una subconsulta.
Responder Con Cita
  #2  
Antiguo 06-02-2013
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Cita:
Empezado por mordaz Ver Mensaje
Que tal a todos,

Hice una consulta en SQL que con pocos registros funcionaba muy bien pero ahora se tarda hasta 30 minutos en procesar. Utilizo Interbase 6.5 y el programa esta hecho en C++ Builder 6. Si alguien me puede ayudar a optimizar la consulta se los agradecería. La consulta es la siguiente:

La base de datos al dia de hoy mide unos 50 Mb

SELECT Codigo,Precio,Cantidad
FROM Ventas_Conceptos
WHERE Venta_key IN (
SELECT Venta_key
FROM Ventas
WHERE Corte=50
AND Cancelada IS NULL)

Es una consulta sencilla salvo el hecho de que tiene un IN y una subconsulta.
Hola mordaz,

Bienvenido al Club Delphi, te has dado un garbeo por la Guía de estilo

El problema de tu SQL puede estar en los Indices, no veo nada fuera de lo normal.

Los indices de Venta_key de ambas base de datos están creados?, quizás puede ser el problema de la lentitud o que la base de datos esta corructa.

Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
  #3  
Antiguo 06-02-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por mordaz Ver Mensaje
.
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración

Recuerda poner los tags al código fuente, ejemplo:



Gracias


Además de lo dicho por olbeup, deberías mostrarnos la estructura de esas tablas, explicar su relación, etc. ya que no somos adivinos
Esa consulta quizás sea fácilmente hacerla de otra forma más eficiente, pero si no conocemos la estructura y relación... poco podemos hacer, salvo aventurar soluciones.
Responder Con Cita
  #4  
Antiguo 06-02-2013
mordaz mordaz is offline
Miembro
 
Registrado: mar 2008
Posts: 32
Poder: 0
mordaz Va por buen camino
Disculpen por el formato

Gracias por su ayuda, no había visto donde estaba la guía de estilo, trate de explicarme lo mejor posible, la estructura de las tablas mas o menos es la siguiente:

VENTAS

Venta_key int
Total int
Cancelada boolean
Corte int

VENTAS_CONCEPTOS

Venta_key int
Cantidad int
Codigo String
Precio float

La idea general de la consulta es seleccionar todos los "Conceptos de venta" de un Corte en especial en el caso del ejemplo el corte 50 y que a su vez estas ventas no estén canceladas.

Para una idea de la cantidad de "Conceptos de venta" la instruccion:

Código SQL [-]
SELECT Count(*)
FROM Ventas
WHERE Corte=50
AND Cancelada IS NULL

Da como resultado 554 Registros, no comprendo porque la primera instruccion tarda tanto tiempo en ejecutarse, también es importante mencionar que tengo muchas otras consultas que funcionan de manera apropiada.
Responder Con Cita
  #5  
Antiguo 06-02-2013
mordaz mordaz is offline
Miembro
 
Registrado: mar 2008
Posts: 32
Poder: 0
mordaz Va por buen camino
Indices

Gracias olbeup:

En cuanto a los indices las tablas tienen la sig estructura:

Código SQL [-]
CREATE TABLE "VENTAS" 
(
  "VENTA_KEY"  INTEGER NOT NULL,
  "CORTE"  INTEGER,
  "SERVICIO"  INTEGER,
  "TICKET"  INTEGER,
  "MESA_KEY"  INTEGER,
  "FECHA"  TIMESTAMP,
  "SUB_TOTAL"  FLOAT,
  "CORTESIAS"  FLOAT,
  "TOTAL"  FLOAT,
  "CORTESIA_FOLIO"  INTEGER,
  "TIPO_PAGO"  VARCHAR(20),
  "MESERO"  INTEGER,
  "CAJERO"  INTEGER,
  "FACTURADO"  CHAR(1),
  "TIPO_TARJETA"  CHAR(1),
  "CANCELADA"  CHAR(1),
  "CONCEPTO_KEY"  INTEGER,
  "CONTABLE"  CHAR(1),
  "DESPRECIABLE"  CHAR(1),
  "FINALIZADA"  CHAR(1),
 PRIMARY KEY ("VENTA_KEY")
);
Código SQL [-]
CREATE TABLE "VENTAS_CONCEPTOS" 
(
  "VENTA_KEY"  INTEGER NOT NULL,
  "CODIGO"  VARCHAR(25) NOT NULL,
  "CANTIDAD"  INTEGER,
  "PRECIO"  FLOAT,
  "IMPORTE"  FLOAT,
  "PIEZAS_PAQUETE"  INTEGER,
  "PREPARADO"  CHAR(1),
  "CORTESIA"  CHAR(1)
);

Supongo que el indice de la tabla de "Ventas" es creado automáticamente con el Primary key, en cuanto a la tabla de ventas_conceptos el campo de venta_key puede repetirse "N" cantidad de veces.

Gracias.
Responder Con Cita
  #6  
Antiguo 07-02-2013
celades1 celades1 is offline
Miembro
 
Registrado: ago 2005
Posts: 116
Poder: 19
celades1 Va por buen camino
Hola

los in no los utilizo nunca a no ser para una subconsulta que devuelva muy pocos valores

Debes tener pk en la tabla ventas campo venta_key

y un fk del campo venta_key de ventas_conceptos contra ventas

en cuanto al pk de ventas_conceptos nos cual debe ser (lo debes ver tu)
ej venta_key+codigo o bien un campo nuevo ID

Código SQL [-]
SELECT vc.Codigo,vc.Precio,vc.Cantidad
FROM Ventas_Conceptos vc
join ventas v on v.venta_key=vc.venta_key
WHERE v.Corte=50 AND v.Cancelada IS NULL


Saludos
Responder Con Cita
  #7  
Antiguo 09-02-2013
mordaz mordaz is offline
Miembro
 
Registrado: mar 2008
Posts: 32
Poder: 0
mordaz Va por buen camino
Cita:
Empezado por celades1 Ver Mensaje
Hola

los in no los utilizo nunca a no ser para una subconsulta que devuelva muy pocos valores

Debes tener pk en la tabla ventas campo venta_key

y un fk del campo venta_key de ventas_conceptos contra ventas

en cuanto al pk de ventas_conceptos nos cual debe ser (lo debes ver tu)
ej venta_key+codigo o bien un campo nuevo ID

Código SQL [-]
SELECT vc.Codigo,vc.Precio,vc.Cantidad
FROM Ventas_Conceptos vc
join ventas v on v.venta_key=vc.venta_key
WHERE v.Corte=50 AND v.Cancelada IS NULL


Saludos
Perfecto la verdad es que no me ha quedado muy claro el uso del JOIN en Interbase, pero parece ser lo que necesitaba ademas de que es enormemente mas eficiente la consulta de esa manera, mil gracias por su apoyo..
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
Ayuda con una consulta!!! sargento elias SQL 2 12-03-2009 13:10:49
Ayuda con consulta... Jose Roman SQL 2 03-02-2009 10:36:56
Ayuda con una consulta plz ! K4RL0S SQL 9 17-11-2005 17:33:09
Ayuda con una consulta Nomack SQL 8 03-09-2005 21:24:37
Ayuda con consulta JorgeBec SQL 7 21-10-2003 20:25:16


La franja horaria es GMT +2. Ahora son las 11:46:30.


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