CosmosDB在某些情况下不使用索引

时间:2018-02-15 10:24:25

标签: azure azure-cosmosdb

我注意到CosmosDB关于使用索引的奇怪行为。

对我的设置说几句话:
它是一个分区的CosmosDB,有25个分区 有两个包含字符串的数组字段,名为 a f 。他们有以下索引政策:

{
    "path": "/a/[]/?",
    "indexes": [
        {
            "kind": "Hash",
            "dataType": "String",
            "precision": -1
        },
        {
            "kind": "Range",
            "dataType": "Number",
            "precision": -1
        }
    ]
},
{
    "path": "/f/[]/?",
    "indexes": [
        {
            "kind": "Hash",
            "dataType": "String",
            "precision": -1
        },
        {
            "kind": "Range",
            "dataType": "Number",
            "precision": -1
        }
    ]
}

可能存在这样的情况:一个文档的字段 a 中的字符串出现在另一个文档的 f 中。

执行以下查询时会出现奇怪的行为:

SELECT *
FROM Documents d
WHERE ARRAY_CONTAINS(d.a, 'some-string')

如果在任何其他文档的 f 字段中没有出现'some-string',则所有parition的IndexHitRation都为1(如回复中包含的QueryMetrics中所示)。这是我期望的行为。

但如果在任何其他文档的 f 字段中确实出现'some-string',则包含此类文档的分区会报告IndexHitRatio为0,这对使用的RU有很大影响。

我的设置中是否会出现导致此行为的错误?
任何其他人都可以重现这种行为,所以这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

为了摆脱这种行为,我为每个字段使用了不同的精度值。所以,现在字段 a 的精度为-1,字段 f 的精度为7。

我的结论是,当使用相同的精度时,它们被写入相同的索引。但这会是数据库的一些意外行为吗?!