我们有一个分析图表,该图表首先查询数据库日志表,以从优化查询中提取所有相关内容,仅选择所需内容以及获取相关的起始和结束ID,因为此表具有数百万条记录。提取初始查询后,我们就使用ColdFusion的查询查询来处理该数据以显示不同的图表。
在此示例中,您可以看到实际的外部数据库调用在31ms内捕获了2,240条记录:
qryGetLogs (Datasource=ourDSN, Time=31ms, Records=2204)
我们有一个图表,它显示一周中每一天每小时的视图,然后构建一个jQuery图表来显示它们。从最初的设计来看,这些查询的执行时间几乎可以忽略不计,通常为0毫秒。因为我们每周7天在一天(24)的每个小时内进行循环,所以有168个查询,这是不进行多次外部DB调用的主要原因之一。
现在看来,许多(但不是全部)查询的运行时间比初始数据库调用长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,312ms,并且正在查询包含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使用。
有人对此问题有任何建议吗?它让我发疯!
谢谢你的帮助。
最佳答案
通常,查询查询的速度非常快。但是,有时音量增加可能需要更长的时间。由于您完全处于ColdFusion文档所建议的5,000至50,000行的推荐范围之内,因此这只能是一回事。一些正在翻译一些数据以获得结果的地方。在这种情况下,这是您指定的日期时间。时间值有一个前导零。我知道这听起来很奇怪。
更改:
在哪里(在'2012-09-03 0:00:00'和'2012-09-03 0:59:59'之间创建)
至:
在哪里(在'2012-09-03 00:00:00'和'2012-09-03 00:59:59'之间创建)
我对此进行了测试,发现结果更好。
关于performance - 查询的ColdFusion查询比数据库调用本身慢100倍(记录计数相对较低),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12290835/