сначала я бы проверил, почему этот запрос занимает столько времени.
что вы можете сделать на уровне базы данных для повышения производительности запроса. Похоже, что вы не правильно проиндексировали базу данных. возьмите запрос и бросьте его в какую-нибудь программу, которую вы сможете проанализировать план выполнения. ищите лаги и устраняйте их.
Чтобы повысить производительность, посмотрите на создание индексированных представлений, если ваша база данных поддерживает такие вещи.
Далее рассмотрим кэширование некоторых частей запроса. нет никакой причины делать вычисления для исторических данных для каждого запроса, когда это можно сделать один раз, а затем где-нибудь кэшировать в таблице.
что касается конца холодного синтеза. убедитесь, что вы используете java.io.BufferedWriter для создания электронной таблицы. использование обычного метода конкатенации строк в CF очень медленное, а BufferedWriter бесконечно быстрее. Прилагаемый CFC, который я создал для создания электронных таблиц с разделителями, вы можете изменить его в соответствии со своими потребностями.
<!--- init --->
<cffunction name="init" access="public" returntype="Any" output="false">
<cfargument name="name" type="string" required="true">
<cfset var local = {}>
<!--- name of file when downloading --->
<cfset variables.name = arguments.name & ".xls">
<!--- name of temp file --->
<cfset variables.filename = CreateUUID() & ".csv">
<!--- full path to temp file for downloading --->
<cfset variables.fullfilename = expandpath("/_temp") & "\" & variables.filename>
<!--- file write java object --->
<cfset variables.filewriter = CreateObject("java","java.io.FileWriter").init(
variables.fullfilename
,JavaCast("boolean","true")
)>
<!--- buffered writer java object --->
<cfset variables.bufferedwriter = CreateObject("java","java.io.BufferedWriter").init(
variables.filewriter
)>
<!--- row delimeter --->
<cfset variables.row = chr(10)>
<!--- col delimeter --->
<cfset variables.col = chr(9)>
<!--- header container --->
<cfset variables.headers = []>
<!--- data container --->
<cfset variables.data = []>
<cfset newrow()>
<cfreturn this>
</cffunction>
<!--- addheader --->
<cffunction name="addheader" access="public" returntype="void" output="false">
<cfargument name="str" type="string" required="true">
<cfset arrayappend(variables.headers, arguments.str)>
</cffunction>
<!--- newrow --->
<cffunction name="newrow" access="public" returntype="void" output="false">
<cfset arrayappend(variables.data, arraynew(1))>
<cfset variables.data_counter = arraylen(variables.data)>
</cffunction>
<!--- adddata --->
<cffunction name="adddata" access="public" returntype="void" output="false">
<cfargument name="str" type="string" required="true">
<cfset arrayappend(variables.data[variables.data_counter], arguments.str)>
</cffunction>
<!--- flush --->
<cffunction name="flush" access="public" returntype="void" output="false">
<cfset var local = {}>
<!--- write headers --->
<cfset local.counter = 0>
<cfset local.headers_count = arraylen(variables.headers)>
<cfloop array="#variables.headers#" index="local.header">
<cfset local.counter++>
<cfset variables.bufferedwriter.write(local.header & variables.col)>
</cfloop>
<cfif not arrayisempty(variables.headers)>
<cfset variables.bufferedwriter.write(variables.row)>
</cfif>
<!--- write data --->
<cfloop array="#variables.data#" index="local.data">
<cfloop array="#local.data#" index="local.cell">
<cfset variables.bufferedwriter.write(local.cell & variables.col)>
</cfloop>
<cfset variables.bufferedwriter.write(variables.row)>
</cfloop>
<cfset variables.bufferedwriter.close()>
<cfsetting showdebugoutput="No">
<cfheader name="Content-Description" value="File Transfer">
<cfheader name="Content-Disposition" value="attachment;filename=#variables.name#">
<cfcontent type="application/vnd.ms-excel" file="#variables.fullfilename#" deletefile="true" reset="true">
</cffunction>