代码之家  ›  专栏  ›  技术社区  ›  Mo B.

在Cosmos DB中检查数百万个id

  •  0
  • Mo B.  · 技术社区  · 3 年前

    Cosmos DB集合中具有给定集合中ID的文档。

    有两种明显的方法可以实现这一点:

    1. 使用并行点读取分别检查每个ID/分区密钥对是否存在,使用 AllowBulkExecution = true

    2. 按分区键将ID分组,对于每个组,发出以下形式的并行查询(使每个查询小于最大查询大小256 kB),并在任何查询返回非空结果时立即中止:

        SELECT c.id FROM c 
            WHERE c.partitionkey = 'partition123' AND ARRAY_CONTAINS(['id1', 'id2', ...], c.id) 
            LIMIT 1
    

    有没有可能说,不试一下,哪一个更快?

    这里有更多的上下文:

    • 客户端是与Cosmos DB实例位于同一区域的Azure应用程序服务。
    • Cosmos DB集合包含大约10^7个文档,吞吐量为4000 RU/s。
    • n/6500 哪里 n 集合中的ID数。
    • 默认索引策略。
    • 更详细的背景:检查是导入/初始加载操作的一部分。更准确地说,它是导入集验证的一部分,因此可以在写入操作开始之前返回错误。所以预期的(非错误)情况是集合中没有一个id已经存在。导入操作预计不会经常执行(虽然肯定不止一次),因此管理辅助进程/数据以优化此检查并不是一个好的折衷方法。
    0 回复  |  直到 3 年前
        1
  •  1
  •   David Makogon    3 年前

    我不太确定我是否理解这一点,但是。。。就RU成本而言,查询的成本将超过一个点读取的成本(考虑到您的文档大小,这些点读取将花费1RU)。

    只尝试将给定的ID写入给定的分区,并查看它是否成功(如果发生ID冲突,它将失败)可能更有效。

    最后:出于所有实际目的,如果要为保存的每个文档生成一个新的GUID,则不会有重复的ID。