Ver Mensaje Individual
  #11  
Antiguo 20-08-2018
hal1967 hal1967 is offline
Miembro
 
Registrado: feb 2012
Posts: 32
Reputación: 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