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 11-08-2018
homy988 homy988 is offline
Registrado
NULL
 
Registrado: ago 2018
Posts: 5
Poder: 0
homy988 Va por buen camino
Como optimizar sql

buenas tardes:

como puedo optimizar esta consulta.

se tarda muchisimo ya que ocupo demaciados registros.

Código Delphi [-]
 
      qry.sql.add('SELECT  MAX(campo1) AS a,');
      qry.sql.add('(SELECT MAX(campo2) AS b');
      qry.sql.add('FROM tabla1');
      qry.sql.add('WHERE campo3=1 AND campo4= 'texto' AND campo2<6584651)');
      qry.sql.add('FROM CFDI');
      qry.sql.add('WHERE campo3=1 AND campo4= 'texto' AND campo2<:6584651');
Responder Con Cita
  #2  
Antiguo 11-08-2018
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Que exactamente es

Cita:
se tarda muchisimo (cuanto?) ya que ocupo demaciados registros (como asi?)
Para optimizar la consulta, analiza el query plan que te de la BD.
__________________
El malabarista.
Responder Con Cita
  #3  
Antiguo 11-08-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.011
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por homy988 Ver Mensaje
como puedo optimizar esta consulta.
se tarda muchisimo ya que ocupo demaciados registros.
Esto es como si vas al médico y le dices:

Doctor, ¿qué puedo hacer para que a mi hijo no le duela?

Ahora, imagina qué te contestará el doctor.
Pues lo mismo.
Responder Con Cita
  #4  
Antiguo 14-08-2018
homy988 homy988 is offline
Registrado
NULL
 
Registrado: ago 2018
Posts: 5
Poder: 0
homy988 Va por buen camino
Gracias por sus tips para plantear el tema:

resulta que tengo una tablaDB similar a esta:


Dato1 dato2 dato3 dato4
1 59 dsfg sdfg
2 60 sdfg sdfg
3 61 dsfg sdfg
4 62 dsfg sdfg



8 66 sdfg sdfg
9 67 dsfg sdfg
10 68 dsfg sdfg
11 69 sdfg sdfg


y obtengo el registro de en medio:

Dato1 dato2 dato3 dato4
" " 64 dsfg sdfg

sin el Dato1.


normalmente lo que haría alguien normal es recorrer tupla por tupla, pero yo en lugar de eso,
uso el dato2, y busco el máximo menor en la BD, ademas, busco el máximo de dato1.

de este modo, obtengo los datos:

Dato1 dato2
4 62

después le resto el dato2 actual con el dato2 de la BD y obtengo la cantidad de espacios entre ellos,
así pues, uso el dato1 de la BD y le sumo el resultado de la resta,

para obtener el numero 6 que debo insertar en la BD con los datos completos.
asi mi registro completo queda de la siguiente manera:

Dato1 dato2 dato3 dato4
6 64 dsfg sdfg


y mi tabla queda un poco mas completa:

Dato1 dato2 dato3 dato4
1 59 dsfg sdfg
2 60 sdfg sdfg
3 61 dsfg sdfg
4 62 dsfg sdfg

6 64 dsfg sdfg

8 66 sdfg sdfg
9 67 dsfg sdfg
10 68 dsfg sdfg
11 69 sdfg sdfg


lo que quiero es optimizar la consulta, ya que tengo mas de 600 mil registros, y se tarda un poco esta consulta.

una disculpa por no colocar todo en tabla.
Responder Con Cita
  #5  
Antiguo 14-08-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.011
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No lo entiendo.
De dónde sacas esto, si no existe:

" " 64 dsfg sdfg
Responder Con Cita
  #6  
Antiguo 14-08-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por homy988 Ver Mensaje
buenas tardes:

como puedo optimizar esta consulta.

se tarda muchisimo ya que ocupo demaciados registros.

Código Delphi [-]
 
      qry.sql.add('SELECT  MAX(campo1) AS a,');
      qry.sql.add('(SELECT MAX(campo2) AS b');
      qry.sql.add('FROM tabla1');
      qry.sql.add('WHERE campo3=1 AND campo4= 'texto' AND campo2<6584651)');
      qry.sql.add('FROM CFDI');
      qry.sql.add('WHERE campo3=1 AND campo4= 'texto' AND campo2<:6584651');
Extrayendo el código SQL queda:
Código SQL [-]
SELECT  MAX(campo1) AS a,
SELECT MAX(campo2) AS b
FROM tabla1
WHERE campo3 = 1 AND campo4 = 'texto' AND campo2 <6584651 
FROM CFDI
WHERE campo3=1 AND campo4= 'texto' AND campo2<:6584651
¿ Y no te arroja ningún error así como está ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 15-08-2018
homy988 homy988 is offline
Registrado
NULL
 
Registrado: ago 2018
Posts: 5
Poder: 0
homy988 Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
No lo entiendo.
De dónde sacas esto, si no existe:

" " 64 dsfg sdfg
Mira, lo que pasa es no es que no se tenga, lo que pasa es que en su momento no se actualizo, por errores de conexión, sin embargo los datos si existen, solo quiero sacar el campo 1 al que le pertenece, como un ID
Responder Con Cita
  #8  
Antiguo 15-08-2018
homy988 homy988 is offline
Registrado
NULL
 
Registrado: ago 2018
Posts: 5
Poder: 0
homy988 Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola.

Extrayendo el código SQL queda:
Código SQL [-]
SELECT  MAX(campo1) AS a,
SELECT MAX(campo2) AS b
FROM tabla1
WHERE campo3 = 1 AND campo4 = 'texto' AND campo2 <6584651 
FROM CFDI
WHERE campo3=1 AND campo4= 'texto' AND campo2<:6584651
¿ Y no te arroja ningún error así como está ?

Saludos

no, no genera error, actualmente esta funcionando:

mira este es el código tal cual:

Código Delphi [-]
      qry.Close;
      qry.sql.clear;
      qry.sql.add('SELECT  MAX(campo1)AS a,');
      qry.sql.add('(SELECT MAX(campo2) AS b');
      qry.sql.add('FROM tabla1');
      qry.sql.add('WHERE campo3 =:valor1 AND campo4=:valor2 AND campo2<:valor3)');
      qry.sql.add('FROM CFDI');
      qry.sql.add('WHERE campo3 =:valor1 AND campo4=:valor2 AND campo2<:valor3');
      qry.ParamByName('valor1').AsFloat := valor1;
      qry.ParamByName('valor2').AsString :=valor2; 
      qry.ParamByName('valor3').AsFloat :=valor3;
      qry.open;
Responder Con Cita
  #9  
Antiguo 15-08-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.011
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por homy988 Ver Mensaje
Mira, lo que pasa es no es que no se tenga, lo que pasa es que en su momento no se actualizo, por errores de conexión, sin embargo los datos si existen, solo quiero sacar el campo 1 al que le pertenece, como un ID
Mejores preguntas=mejores respuestas. Tenemos casi que estar adivinando.
Responder Con Cita
  #10  
Antiguo 16-08-2018
Avatar de TiammatMX
TiammatMX TiammatMX is offline
Miembro
 
Registrado: jun 2006
Ubicación: Universo Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Puebla\Heróica Puebla de Zaragoza\Jardines de San Manuel\Home
Posts: 746
Poder: 18
TiammatMX Va camino a la fama
Cita:
Empezado por homy988 Ver Mensaje
buenas tardes:

como puedo optimizar esta consulta...
¿Motor de base de datos? ¿Local, remota, web? ¿LAN, WAN, Internet?

De entrada, un subselect como el que me imagino tienes en la segunda línea SI ESTÁ PERFECTAMENTE PARAMETRIZADO no tarda mucho. No es lo mismo seleccionar una pelirroja con vestido blanco en una calle de Edimburgo que una pelirroja con vestido...

(Perdón por el ejemplo)
__________________
Felipe Eduardo Ortiz López. Delphi programmers does it recursively...

"Un programador, es un creador de universos en donde sólo él es responsable. Universos de complejidad prácticamente ilimitada que se puede crear en forma de programas de ordenador." - Joseph Weizenbaum.

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco

Última edición por TiammatMX fecha: 16-08-2018 a las 21:05:44. Razón: Error ortográfico
Responder Con Cita
  #11  
Antiguo 20-08-2018
hal1967 hal1967 is offline
Miembro
 
Registrado: feb 2012
Posts: 32
Poder: 0
hal1967 Va por buen camino
Este pedazo del código sería terrible (por lo menos en mysql)

Código Delphi [-]
qry.sql.add('(SELECT MAX(campo2) AS b');        

qry.sql.add('FROM tabla1');  

qry.sql.add('WHERE campo3=1 AND campo4= 'texto' AND campo2<6584651)');

MAX es genial en ciertos casos, porque el manejador de bb dd simplemente busca el ultimo registro del indice para esa columna, ni siquiera baja a disco (los indices están en ram), pero en el WHERE refieres al mismo campo (CAMPO 2) por lo que hay que recorrer el indice

Mi sugerencia es que pruebes un indice campo2, campo3, campo4 (siempre campo2 primero) y mides si ese subquery mejora

Yo de hecho cambiaría un poco la consulta (cosas de MySQL)

Código:
 SELECT campo2
FROM tabla1
WHERE campo3=1 AND campo4= 'texto' AND campo2<6584651
ORDER BY campo2, campo3, campo4 DESC
LIMIT 1
Ahora fuera del subquery tienes
Código Delphi [-]
qry.sql.add('SELECT  MAX(campo1)AS a,');          

qry.sql.add('FROM CFDI');       
qry.sql.add('WHERE campo3 =:valor1 AND campo4=:valor2 AND campo2<:valor3');


Esto si es un dolor de cabeza, siempre termina por crear una tabla temporal y luego ordenarla. No importa lo que mejores el
subquery (por cierto no entiendo la función del subquery)


Lo seguiré pensando, pero realmente no veo forma de optimizar ese query.
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
Como optimizar la conversion de hexadecimales a enteros decimales REVINFOR Varios 12 19-10-2014 00:57:48
Ayuda como Optimizar Código JerS OOP 3 24-06-2011 06:59:44
¿como optimizar rendimiento y tamaño base de datos firebird 2.5? JXJ Firebird e Interbase 4 22-11-2010 03:51:45
Optimizar clientDataSet Kenobi Varios 2 07-07-2010 23:20:46
Como optimizar la operación Last marcoszorrilla Trucos 0 29-06-2006 23:37:06


La franja horaria es GMT +2. Ahora son las 13:42:16.


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