当前位置: 首页 > 知识库问答 >
问题:

CosmosDB查询日期范围索引

吴建中
2023-03-14

我有一个大约为100GB的cosmos数据库。我成功地创建了一个漂亮的分区键,我在70M记录上有大约4600个分区,但是我仍然需要查询两个存储为字符串的日期时间字段,而不是纪元格式。

示例json:

"someField1": "UNKNOWN",
"someField2": "DATA",
"endDate": 7014541201,
"startDate": 7054864502,
"someField3": "0",
"someField3": "0",

我注意到当我做从tbl中选择*以及当我做从tbl中选择*其中start Date

此外,当我尝试在startDate和endDate上添加哈希索引时,他基本上会将其转换为两个索引。例子:

 "path": "/startDate/?",
        "indexes": [
            {
                "kind": "Hash",
                "dataType": "String",
                "precision": 3
            }
            ]
    }, 

这是转换为

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

这是正常行为还是与我的数据有关?谢谢

我检查了查询指标,对于4k记录,对cosmosDB的查询在100ms内执行。我想问你,这是正常的行为吗

var option = new FeedOptions { PartitionKey = new PartitionKey(partitionKey),  MaxItemCount = -1};

var query= client.CreateDocumentQuery<MyModel>(collectionLink, option)
            .Where(tl => tl.StartDate >= DateTimeToUnixTimestamp(startDate) && tl.EndDate <= DateTimeToUnixTimestamp(endDate))
        .AsEnumerable().ToList();

这个查询在10-12秒内返回10k个结果(Postman大约9MB大小)?这个分区包含大约50k条记录。

检索的文档数:12,356
检索的文档大小:12,963,709字节
输出文档数:3,633
输出文档大小:3,819,608字节
索引利用率:29.00%
总查询执行时间:264.31毫秒

查询编译时间:0.12毫秒

逻辑计划构建时间:0.07毫秒

物理计划构建时间:0.06毫秒

查询优化时间:0.01毫秒

索引查找时间:51.10毫秒

文件加载时间:140.51毫秒

运行时执行时间

查询引擎时间:55.61毫秒

系统功能执行时间:0.00毫秒

自定义函数执行时间:0.00毫秒

文件写入时间:10.56毫秒

客户端指标

重试计数:0

        Request Charge                         :          904.73 RUs

共有1个答案

岳允晨
2023-03-14

我来自CosmosDB工程团队。

由于您的集合有7000万条记录,我假设观察到的延迟仅出现在结果的第一次往返(或第一页)上。注意,还可以通过调整FeedOptions来改善观察到的延迟。执行查询时,MaxDegreeOfParallelism为-1。

关于这两个查询本身之间的区别,请注意,没有过滤器的SELECT*是一个完整的扫描查询,与具有两个过滤器的另一个查询相比,它首先返回结果可能要快一点,它对所有分区的本地索引做了更多的工作,这可能解释了观察到的延迟。

关于你的另一个问题,我们不再支持新集合的哈希索引策略。请参见此处:https://docs.microsoft.com/en-us/azure/cosmos-db/index-types#index-善良。我们自动将哈希索引转换为全精度范围。

您还可以为查询获取QueryMetrics并分析结果以找出延迟的原因。详细信息如下:https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-query-metrics#query-execution-metrics

 类似资料:
  • 我的文档中有一个日期范围(使用日期对象)如下所示 我试图弄清楚如何构建一个查询来返回包含特定日期的所有事件,例如,像.... 如果查询显示类似这样的内容,但在Firestore查询限制下可能不可能出现这种情况。 因此,我一直在挠头几个小时,要么为此构建一个查询,要么以某种方式结构我的数据,以允许这样做。 这有可能吗?

  • 我需要帮助查询与日期范围的长收集。请参阅下面的示例文档。我想用日期范围查询startTime字段。

  • 我有一个lucene查询,可以对索引字段进行全文搜索。我想将日期范围添加到此查询。 我找到了这个问题并在那里使用了答案:如何在日期之间搜索(Hibernate搜索)? 但当我想在两个日期之间获取数据时,它什么也不返回。我使用的是MSSQL数据库,日期字段的类型是datetime。但它在实体类中被注释为。 这是我的实体类: 这就是我进行全文搜索的地方: 有两种不同的查询。一个是在指定字段上进行全文通

  • > 每个对象表示一个重复发生的事件。该事件可以在多个日期发生。因此,请考虑以下内容: 我有一个日历在客户端,用户可以选择一个日期范围。 > 对所选日期范围的每个条目进行调用,并在客户端处理聚合。问题是会有大量的读取,因为我们会多次读取重叠的日期范围内的同一个列表对象。 尝试使用类似ElasticSearch/Algolia的服务来完成此操作 任何建议都会很有帮助!

  • 问题内容: 我在MySQL中有一张表,该表显示了我每天记录的小时数。我正在尝试建立一个视图,该视图将允许我按块/天范围快速将数据分组。最简单的情况是每月一次,这并不难。我可以将日期选择为“%y-%m”,然后按该列分组。 前任: 如果我按月分组,那很好。但是我的问题是,我需要从每月的13号到下个月的12号进行分组(例如:7月13日至8月12日,8月13日至9月12日,等等)。 有没有一种简单的方法可

  • 问题内容: 我有一个看起来像这样的数据库表: 写入此日志时,它包含日志记录和unix时间戳。我需要的是获取每周报告,以了解每周有多少日志记录。这是我写的查询: 这给出了这样的结果: 伟大的!但是我想看到的是一个日期范围,如,所以我的结果集如下所示: 有什么办法吗? 问题答案: 使用以获得合适的日期一样,然后用得到你需要的格式。