【问题标题】:DocumentDb GUID Index PrecisionDocumentDb GUID 索引精度
【发布时间】:2015-09-23 06:51:03
【问题描述】:

假设我们的文档中有一个非唯一的 GUID/UUID 值:

[
  {
    "id": "123456",
    "Key": "117dfd49-a71d-413b-a9b1-841e88db06e8"
    "Name": "Kaapstad",
  },
  ...
]

我们只想通过相等来查询这个。无需查询范围或排序。例如:

SELECT * FROM c where c.Key = "117dfd49-a71d-413b-a9b1-841e88db06e8"

以下是索引定义。它是一个哈希索引(因为不会执行范围查询),使用 String 数据类型(因为 Javascript 本身不支持 Guid)

collection.IndexingPolicy.IncludedPaths.Add(
    new IncludedPath { 
        Path = "/Key/?", 
        Indexes = new Collection<Index> { 
            new HashIndex(DataType.String) { Precision = -1 }
        }
    });

但是,最佳的索引精度是多少?

This MSDN page 并没有让我清楚什么精度值最适合这样的值:

索引精度配置对字符串范围更有用。自从 字符串可以是任意长度,索引精度的选择 会影响字符串范围查询的性能,并影响 所需的索引存储空间量。字符串范围索引可以是 配置为 1-100 或 -1(“最大值”)。如果你想表演 Order By 对字符串属性的查询,那么您必须指定一个 对应路径的精度为 -1。

【问题讨论】:

    标签: azure azure-cosmosdb


    【解决方案1】:

    您可以根据您希望包含属性键路径的文档数量(在您的示例中恰好是 Key 属性)来微调索引精度值。

    散列索引的索引精度表示要将属性值散列到的字节数。因此,降低精度值有助于优化存储索引所需的存储量。提高精度值(在哈希索引的上下文中)有助于防止索引上的哈希冲突。

    例如,假设路径 foo 上的哈希索引精度值为 3。

    3 字节 = 3 * 8 = 24 位。

    24 位可以支持:2^24 = 16,777,216 个值

    根据鸽巢原理,当存储 >16,777,216 个具有foo 属性的文档时,您肯定会发生哈希冲突。一旦发生哈希冲突,DocumentDB 将需要对找到的文档子集执行扫描。例如,如果您有 30,000,000 个具有 foo 属性的文档 - 您可以预期平均扫描 2 个文档。

    【讨论】:

    • 优秀的答案。我在文档中找不到类似的东西,但也许我看的不够仔细!
    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多