我们计划在DocumentDb中摄取的JSON文档如下所示......
[
{"id":"id1","LastName": “user1”, "GroupMembership":["g1","g2"]},
{"id":"id2","LastName": “user2”, "GroupMembership":["g1","g4","g5"]},
{"id":"id3","LastName": “user3”, "GroupMembership":["g3","g4","g2"]},
…
]
我们想回答诸如以下问题的查询,让我统计所有组成为“g1”或“g2”等成员的用户....用户数量非常大(几百万)...... 实现此查询并使用索引并避免任何扫描的最佳方法是什么... 我应该使用ARRAY_CONTAINS还是JOIN(ARRAY_CONTAINS内部使用索引还是进行扫描)...
选项1)
SELECT VALUE COUNT(1) FROM Users WHERE ARRAY_CONTAINS(Users.GroupMembership, "g1") or ARRAY_CONTAINS(Users.GroupMembership, "g2")
选项2)
SELECT VALUE COUNT(1) FROM Users JOIN Membership in Users.GroupMembership WHERE Membership = "g1" or Membership = "g2"
答案 0 :(得分:2)
两个查询都应该以相同的方式使用索引,但与JOIN相比,ARRAY_CONTAINS可能提供更好的执行时间。您可以根据本文使用查询指标对两个查询进行分析:https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-sql-query-metrics#query-execution-metrics
答案 1 :(得分:1)
两者都应提供相同的索引利用率,但是使用JOIN
可以使每个条目的结果重复,而使用ARRAY_CONTAINS
则不会。我认为差异非常明显。在对Getting duplicate records in select query for the Azure DocumentDB和Cosmos db joins give duplicate results这样的问题的答复中了解有关重复问题的更多信息。