CosmosDB查询日期范围和索引

时间:2019-02-25 10:41:11

标签: azure-cosmosdb

我有一个cosmos DB,其大小约为100GB。 我成功创建了一个不错的分区键,在70M条记录上有大约4600个分区,但是我仍然需要查询两个以字符串形式存储的datetime字段,而不是以纪元格式存储。

示例json:

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

我注意到当我执行select * from tbl和执行select * from tbl where startDate > {someDate} AND endDate<{someDate1}时的延迟大约是1s,因此此过滤不会减少我的延迟时间。 将日期类型存储为数字更好吗?宇宙在时代查询范围内是否具有更好的性能? 我正在使用SQL API。

此外,当我尝试在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的查询在100毫秒内执行。我想问你

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秒钟内返回1万个结果(在邮递员中约为9MB)?该分区包含大约5万条记录。

  

检索到的文档数: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 个答案:

答案 0 :(得分:1)

我来自CosmosDB工程团队。

由于您的馆藏有7,000万条记录,因此我认为观察到的延迟仅在结果的第一次往返(或第一页)上。请注意,执行查询时,也可以通过将FeedOptions.MaxDegreeOfParallelism调整为-1来改善观察到的延迟。

关于两个查询本身的区别,请注意,不带过滤器的SELECT *是完全扫描查询,可能有点 与带有两个过滤器的其他查询相比,它更快地首次返回结果,这对所有分区的本地索引做了更多的工作,这可以解释观察到的延迟。

关于您的其他问题,我们不再支持新集合的哈希索引政策。请在此处查看:https://docs.microsoft.com/en-us/azure/cosmos-db/index-types#index-kind。我们会自动将Hash索引完全精确地转换为Range。

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