Tuve un problema similar con la optimización, debes acceder directamente a los campos y no usar FieldByName("TuCampo"). Al usar de esta manera:
Código Delphi
[-]
precio1:=datos.sqlproductos.FieldByName('PRECIO1').AsCurrency;
Internamente Delphi convierte el valor a currency y si son datos masivos se nota la diferencia. Debes definir en tiempo de diseño los campos del dataset y usar de esta forma:
Código Delphi
[-]
precio1:=datos.sqlproductosPRECIO1.Value;
Aplique esta forma en mi caso y mejoró la velocidad de ejecución.
Saludos.