假设我们的文档中有一个非唯一的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。
答案 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个文档。