Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ayuda con consulta SQL (https://www.clubdelphi.com/foros/showthread.php?t=82183)

mordaz 06-02-2013 06:57:43

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.

olbeup 06-02-2013 08:26:54

Cita:

Empezado por mordaz (Mensaje 454588)
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.

Casimiro Notevi 06-02-2013 09:50:06

Cita:

Empezado por mordaz (Mensaje 454588)
.

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.

mordaz 06-02-2013 20:15:48

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.

mordaz 06-02-2013 20:21:24

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.

celades1 07-02-2013 07:13:47

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

mordaz 09-02-2013 03:12:36

Cita:

Empezado por celades1 (Mensaje 454675)
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..


La franja horaria es GMT +2. Ahora son las 09:30:57.

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