使用CouchDB,我在尝试计算一组自动测试结果的“最后一次通过”和“上次失败”时间时表现非常糟糕。
我有一个约5000条形式的数据库:
{
"completionTime": "2013-06-06T17:28:09.384Z",
"environment": "ENV1",
"passed": true,
"duration": 59142,
"summary": "",
"origin": {
"rowId": "1",
"worksheet": "Sheet1",
"workbook": "book.xlsm"
}
}
我有一个用map定义的视图:
function(run) {
if (run.environment && run.origin && run.origin.rowId && run.origin.worksheet && run.origin.workbook && run.completionTime) {
var key = [run.environment, run.origin.rowId, run.origin.worksheet, run.origin.workbook]
var completionTime = Date.parse(run.completionTime)
if (run.passed)
emit(key, [completionTime, null] );
else
emit(key, [null, completionTime] );
}
}
并减少:
function (key, values, rereduce) {
var latestPass = null;
var latestFail = null;
for (var i = 0; i < values.length; i++) {
latestPass = Math.max(values[i][0], latestPass);
latestFail = Math.max(values[i][1], latestFail);
}
return [latestPass, latestFail];
}
查询所有结果(大约750)的视图时,需要10-50秒,这比我预期的要慢得多。
我做错了什么?
答案 0 :(得分:0)
根据我对CouchDB视图调优的有限经验,我发现在Erlang中编写视图可以显着提高性能。
从这开始:http://wiki.apache.org/couchdb/EnableErlangViews
然后在Erlang中编写您的视图(一些示例):Emit Tuples From Erlang Views In CouchDB
让Erlang视图的语法正确是有点棘手的,但是尝试它很有趣,与Javascript视图相比,我看到性能提高了50%。
答案 1 :(得分:0)
我切换到MongoDB,相同的查询在数百毫秒内运行,而不是几十秒。