【发布时间】:2012-09-05 22:48:01
【问题描述】:
我们有一个分析图表,它首先查询数据库日志表以从优化查询中提取所有相关信息,只选择需要的内容以及获取相关的开始和结束 ID,因为该表有数百万条记录。一旦提取了初始查询,我们就使用 ColdFusion 的查询查询来处理该数据以显示不同的图表。
你可以看到这个例子中实际的外部数据库调用在 31 毫秒内抓取了 2240 条记录:
qryGetLogs (Datasource=ourDSN, Time=31ms, Records=2204)
我们有一个图表,显示一周中每一天的每小时视图,然后构建一个 jQuery 图表来显示它们。从最初的设计来看,这些查询的执行时间几乎可以忽略不计,通常为 0 毫秒。因为我们每周 7 天在一天 (24) 中的每个小时循环,即 168 次查询 - 这是不多次进行外部数据库调用的主要原因之一。
现在看来,这些查询中的许多(但不是全部)查询的运行时间是初始数据库调用的 100 倍以上。他们中的大多数都使用 BETWEEN 日期范围函数来选择每天和每小时部分的记录:
qryViewsPerHour (Datasource=, Time=4312ms, Records=5)
SELECT createdOn, DayOfWeek
FROM qryGetLogs
WHERE (CreatedOn BETWEEN '2012-09-03 0:00:00' AND '2012-09-03 0:59:59')
AND (DayOfWeek = 2)
您可以看到另一个查询的查询花费了 4,312 毫秒,并且正在搜索具有 2,240 条记录的查询。以下是许多后续查询的查询时间:
qryViewsPerHour (Datasource=, Time=4610ms, Records=5)
qryViewsPerHour (Datasource=, Time=4187ms, Records=8)
qryViewsPerHour (Datasource=, Time=5062ms, Records=6)
qryViewsPerHour (Datasource=, Time=3985ms, Records=0)
qryViewsPerHour (Datasource=, Time=4828ms, Records=2)
qryViewsPerHour (Datasource=, Time=5750ms, Records=0)
qryViewsPerHour (Datasource=, Time=3016ms, Records=4)
qryViewsPerHour (Datasource=, Time=3625ms, Records=6)
qryViewsPerHour (Datasource=, Time=6265ms, Records=11)
所以你可以通过这些查询看到,它增加了 40 秒的加载时间!但请注意,下一个查询只有 78 毫秒,记录比之前的任何一个查询都多,而且在此之后,时间会更好:
qryViewsPerHour (Datasource=, Time=78ms, Records=18)
qryViewsPerHour (Datasource=, Time=62ms, Records=7)
qryViewsPerHour (Datasource=, Time=63ms, Records=12)
qryViewsPerHour (Datasource=, Time=78ms, Records=34)
qryViewsPerHour (Datasource=, Time=78ms, Records=9)
那些美好的时光会持续一段时间,然后 BAM!回到 2-6 秒的查询。
qryViewsPerHour (Datasource=, Time=4891ms, Records=13)
qryViewsPerHour (Datasource=, Time=1984ms, Records=8)
qryViewsPerHour (Datasource=, Time=4875ms, Records=4)
qryViewsPerHour (Datasource=, Time=6203ms, Records=0)
总而言之,加载需要几秒钟的内容需要 100-400 秒之间的加载,这只是每周报告!我们还将它用于月度报告。
我已经监控了服务器,确保我是唯一一个运行请求的人或进程,所以不应该是CPU的资源被其他东西吃掉了,我也监控了CPU请求,它很稳定并且稳定被 JRUN.exe 使用。
有人对这个问题有什么建议吗?快把我逼疯了!
感谢您的帮助。
【问题讨论】:
-
你真的需要循环吗?理想情况下,您应该在 db 查询 中构建结果集,因为成熟的数据库在查询方面通常比 QoQ 更有效。在不了解更多信息的情况下,听起来这当然可以在单个查询中完成。
-
同意 - 甚至可以简单地从数据库中检索数据,遍历数据集,并填充一个结构(将是一个结构的结构)。在这里使用 QoQ 似乎不合适。
标签: performance coldfusion report