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.