【问题标题】:Cosmos DB Date Index Not EfficientCosmos DB 日期索引效率不高
【发布时间】:2018-06-10 18:05:26
【问题描述】:

我有一个包含日期字段的集合,该字段由 C# 应用程序使用 DateTime 对象填充。该字段被序列化为以下格式“2018-06-10T17:32:48.3285735Z”。

我没有触及集合中的索引策略,所以字符串使用的是 Range 索引类型。根据我在文档中阅读的内容,这是索引日期的最有效方法,但是,当我在 ORDER BY 子句中使用 Date 字段时,查询消耗的 RU 至少比使用时间戳查询多 10 倍(_ts) 数字字段。这意味着为这个单一收藏支付 10 倍以上的费用。

为了说明问题:

SELECT TOP 100 * FROM c ORDER BY c.Date DESC
//query consumes a minimum of 500 RUs

SELECT TOP 100 * FROM c ORDER BY c._ts DESC
//query consumes 50 RUs

这是它应该如何工作还是我错过了什么?我怀疑如果这是预期的行为,它将在索引文档中得到强调,并将日期存储为数字将被突出显示为最佳实践。

编辑: 这是集合的索引策略(我从未更改过)。

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Spatial",
                    "dataType": "Point"
                }
            ]
        }
    ],
    "excludedPaths": []
}

【问题讨论】:

  • 嗨,您找到问题所在了吗?如何解决?谢谢

标签: azure azure-cosmosdb


【解决方案1】:

这可能与索引冲突有关(多个值映射到同一个索引项)。 您可能希望缩小提交日期的范围,看看是否有帮助。基本上,试试这个查询:

SELECT TOP 100 * FROM c WHERE (c.Date BETWEEN '2000-01-01' AND '2100-01-01') ORDER BY c.Date DESC

请注意,添加的过滤器不应对查询结果集收费。

【讨论】:

  • 不幸的是,这不起作用。添加范围过滤器对消耗的 RU 没有任何影响。谢谢。
【解决方案2】:

您是否尝试过专门配置范围查询?

我认为默认情况下字符串是散列的,您必须为范围查询指定索引。

我在文档中找到了这个:

默认情况下,Azure Cosmos DB 为其中的所有字符串属性编制索引 与哈希索引一致的文档。

Documentation link

用于在集合上设置范围查询索引:

DocumentCollection collection = new DocumentCollection { Id = "orders" }; 

collection.IndexingPolicy = new IndexingPolicy(new RangeIndex(DataType.String) 
                                { Precision = -1 });     

await client.CreateDocumentCollectionAsync("/dbs/orderdb", collection);

他们查询的文档如下所示:

{
 "id": "09152014101",
 "OrderDate": "2014-09-15T23:14:25.7251173Z",
 "ShipDate": "2014-09-30T23:14:25.7251173Z",
 "Total": 113.39 
}

Documentation link

【讨论】:

  • 我将当前的索引策略添加到原始问题中。不是说字符串已经在使用范围索引了吗?
  • 我很抱歉。当您说您没有触及索引时,我假设您正在使用默认索引,认为默认索引是范围索引,但事实并非如此。如果您已经专门设置了范围索引,那么您已经完成了您可以在那里做的所有事情。
【解决方案3】:

我认为这是查询使用 TOP 和 ORDER BY 时的优化缺陷。我发现,虽然使用时间戳作为数字和时间戳作为字符串的范围查询的 RU 没有太大差异,但在您的情况下,字符串上的范围索引似乎被忽略了。

此处的用户语音问题: https://feedback.azure.com/forums/263030-azure-cosmos-db/suggestions/32345410-optimise-top-with-order-by-clause-queries

【讨论】:

    猜你喜欢
    • 2019-01-23
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2021-07-27
    相关资源
    最近更新 更多