临时表联表查询分组
- 发布:2023-06-09 10:41
- 更新:2023-06-09 16:01
- 阅读:512
产品分类: uniCloud/App
操作步骤:
预期结果:
像之前一样,不会超时
像之前一样,不会超时
实际结果:
不加limit就超时
不加limit就超时
bug描述:
因为每天都会定时执行一个临时表联表查询任务,
代码大概如下:
const xxxTemp = db.collection('xxx').where(create_date>=1686153600000 && create_date<1686240000000
).getTemp();
const aaaTemp = db.collection('aaa').field('aaa,_id').getTemp();
db.collection(xxxTemp ,aaaTemp ).field(aaa._id as target_id
).groupBy('target_id').groupField('count(*) as scount').get()
在之前一直是正常运算的,直到6月8号到出现超时提示(云对象确实执行到5秒)
InternalServerError:Error in $cursor stage :: caused by :: operation exceeded time limit,集合xxxxx操作超时,请参照此文档进行优化:https://uniapp.dcloud.net.cn/uniCloud/db-performance
但我经过测试发现在后面加limit(500)后可以正常返回数据
而且limit()内的数值越小返回速度越快。
我不清楚这是不是 bug,但确实以前集合里有一百万条数据也能正常返回,现在不加limit(500),就超时,加了limit又会出现取不全的问题。
查询情况:
当不分组直接.get({getCount:true})时:
db.collection(xxxTemp ,aaaTemp ).field(aaa._id as target_id
).get({getCount:true})
查询到1000条数据,
满足条件的数据总数为16111条,查询数量限制请参考:https://uniapp.dcloud.net.cn/uniCloud/cf-database?id=imit,请求耗时(含网路传输):1990ms
当分组查询不加limit(500)时:
db.collection(xxxTemp ,aaaTemp ).field(aaa._id as target_id
).groupBy('target_id').groupField('count(*) as scount').get()
超时
InternalServerError:Error in $cursor stage :: caused by :: operation exceeded time limit,集合xxxxx操作超时,请参照此文档进行优化:https://uniapp.dcloud.net.cn/uniCloud/db-performance
当分组查询加limit(500)时:
db.collection(xxxTemp ,aaaTemp ).field(aaa._id as target_id
).groupBy('target_id').groupField('count(*) as scount').limit(500).get()
查询到46条数据,请求耗时(含网络传输):1007ms
多次测试都是1秒以上
当分组查询加limit(100)时:
db.collection(xxxTemp ,aaaTemp ).field(aaa._id as target_id
).groupBy('target_id').groupField('count(*) as scount').limit(100).get()
查询到21条数据,请求耗时(含网络传输):907ms
多次测试大多400ms
当分组查询加limit(10)时:
db.collection(xxxTemp ,aaaTemp ).field(aaa._id as target_id
).groupBy('target_id').groupField('count(*) as scount').limit(10).get()
查询到7条数据,请求耗时(含网路传输):378ms
2 个回复
DCloud_uniCloud_WYQ
私聊发一下服务空间id,另外最近数据量有增长吗?schema配置的权限有变动吗
Hookin丶 (作者)
补充后续:考虑到以前一查查一天确实也有性能问题,借着这次超时问题重写了代码,改为把一天的时间分成多份,分别查。
另外也可以按照这种来改: