我正在构建一个应用程序,该应用程序执行具有多个连接的主查询。然后,整个应用程序可以使用该查询数据在全局变量中使用。查询在每次页面刷新时刷新或者获取最新的结果集;因此它仅在请求的生命周期内处于相同的状态。
在此应用程序的其他部分,我有时会对此数据运行数百个 QoQ - 通常是递归函数调用的结果。然而,虽然 QoQ 是一个很棒的功能,但它并不太快,有时页面加载在糟糕的一天可能会在 3000 - 5000 毫秒之间。只是速度不够快。
我可以采取任何类型的优化技术来使 QoQ 执行得更快,或者也许有替代方法?我读了 Ben Nadel 写的一篇关于 Duplicate() 函数的有趣文章 - 是否有使用该函数的范围?如果有,如何使用?
我很想听听你的想法。
不用担心疯狂的建议,这是一个个人项目,所以我愿意承担风险。我在与 CF8 兼容的 Railo 上运行它。
非常感谢, 迈克尔。
最佳答案
在没有看到 QoQ 的代码和复杂性的情况下,很难确定最好的方法,但是您可以做的一件事是使用结构来索引 QoQ 之外的记录。使用 QoQ 的大部分开销是构建新的查询对象,并且使用结构只写方法比循环原始查询并进行比较要高效得多。
例如:
<!--- build up index --->
<cfset structindex = {} />
<cfset fields = "first,last,company" />
<cfloop list="#fields#" index="field">
<cfset key = "field:#field#,value:#q[field][currentrow]#" />
<!--- initialize each key (instead of using stuctkeyexists) --->
<cfloop query="q">
<cfset structindex[key] = "" />
</cfloop>
<cfloop query="q">
<!--- update each key with list of matching row indexes --->
<cfset structindex[key] = listappend(structindex[key], currentrow) />
</cfloop>
</cfloop>
<!--- save structindex to global variable --->
<!--- output rows matching index --->
<cfset key = "field:company,value:stackexchange" />
<cfoutput>
<cfloop list="#structindex[key]#" index="row">
#q.last[row]#, #q.first[row]# (#q.company[row]#)<br />
</cfloop>
</cfoutput>
如果这不符合您的需求,请提供一些 QoQ 语句示例以及主查询中有多少条记录。
关于coldfusion - 加快 QoQ 速度还是其他方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5900550/