DocumentDb GUID索引精度

时间:2015-09-23 06:51:04

标签: azure azure-cosmosdb

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

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

我们只想通过平等来查询。无需查询范围或命令。 E.g:

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对字符串属性的查询,则必须指定a   相应路径的精度为-1。

1 个答案:

答案 0 :(得分:10)

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

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

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

3个字节= 3 * 8 = 24位。

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

通过归类原则,在保存带有foo属性的&gt; 16,777,216文档时,可以保证发生哈希冲突。在哈希冲突时,DocumentDB将需要对找到的文档子集执行扫描。例如,如果您有30,000,000个具有foo属性的文档 - 您可以平均扫描2个文档。