首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB:试图解释查询在排序内存限制上失败

MongoDB:试图解释查询在排序内存限制上失败
EN

Stack Overflow用户
提问于 2019-07-22 09:16:35
回答 1查看 724关注 0票数 1

我得到的‘排序操作使用超过33554432字节的内存’错误的一些查询。但是更麻烦的是,我甚至不能用.explain()运行它

代码语言:javascript
复制
> db.collection.find({...}, {...}).limit(5000).sort({...})
Error: error: {
    "ok" : 0,
    "errmsg" : "errmsg: \"Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.\"",
    "code" : 96,
    "codeName" : "OperationFailed"
}

> db.collection.find({...}, {...}).limit(5000).sort({...}).explain()
2019-07-22T09:15:38.246+0000 E QUERY    [thread1] Error: explain failed: {
    "ok" : 0,
    "errmsg" : "errmsg: \"Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.\"",
    "code" : 96,
    "codeName" : "OperationFailed"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
throwOrReturn@src/mongo/shell/explainable.js:31:1
constructor/this.finish@src/mongo/shell/explain_query.js:172:24
DBQuery.prototype.explain@src/mongo/shell/query.js:521:12
@(shell):1:1

试图重新创建索引,但没有发生任何变化。

这里会发生什么事?

编辑:为了澄清,排序字段是按正确的排序顺序编入索引的。我想知道为什么解释失败了,这在我看来很奇怪,我想这里可能会出现数据损坏。我们如何诊断一个有问题的查询,并解释它是否在我们试图诊断的问题上失败?

编辑2:,在进一步诊断后,我可以将其精确定位到.limit(4308) works和.limit(4309) barfs。然而,4309记录并没有错.

此外,这种情况发生在一个env中,而不是对数据期望相同的另一个env。

EN

回答 1

Stack Overflow用户

发布于 2019-07-22 13:44:40

对于来自未来的任何时间的旅行者:

RE .explain()似乎只是蒙古族的一种怪癖。若要查看查询计划,必须降低限制。我想这听起来很傻,实际上运行了查询,然后显示了查询计划.

值得注意的是,这是蒙戈3.4。现在可能已经改变了..。

我们的性能问题归结为拥有一个巨大的子对象属性(让我们称之为.metaData)。然而,由于我们知道这是有问题的,所以我们没有将它包括在投影中。但是-它确实以{metaData: {$exists: true}}的形式出现在查找条件中。我猜蒙戈获取了整个东西,并将它保存在内存中,只是为了在上面做{$exists: true}。这导致查询破坏了32M内存限制,尽管实际结果需要的内存要少得多,而且排序字段是索引的。

所以我们活着是为了改天写更多的虫子..。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57142769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档