【问题标题】:DocumentClient takes too long when queried over a DateTime field通过 DateTime 字段查询 DocumentClient 花费的时间太长
【发布时间】:2017-08-07 07:45:25
【问题描述】:

我有以下代码从 DocumentDB 数据库中获取一些对象的列表:

var document = this._client.CreateDocumentQuery<T>(UriFactory.CreateCollectionUri(dbName, collectionName), queryOptions)
.Where(r => r.pDate >= startDate && r.pDate <= endDate);

var result = document.ToList();

pDate 的类型为DateTime,并以 ISO8601 格式的字符串存储在数据库中。

查询返回结果的时间过长,例如 4 到 5 分钟。当我跟踪程序时,程序卡住的是.ToList()。奇怪的是,查询会快速返回某些特定的开始和结束日期。 如果我将过滤器放在pDate 以外的某些字段上,查询也会很快返回一些结果。

我的设置与this document 中的解释一致,但除了少数例外情况外,我几乎一直都表现不佳。

我已经尝试了这里和那里提到的几种方法来解决问题,但到目前为止没有运气。感谢您对问题的任何评论或解决方案。

【问题讨论】:

  • 我建议你将日期保存为 DateTime 看看性能是否更好
  • @MartinoBordin - 显然 Azure DocumentDB 原生支持 DateTime... 但既然它确实 支持 Number,也许 OP 可以尝试将它们存储为纪元值。如中所述:Working with Dates in Azure DocumentDB.
  • 对不起,我误读了@hagh 已经在使用 DateTime 来查询(不是存储,你是对的 @Corak)数据。尝试添加 RangeIndex,如 here 所述

标签: c# datetime azure-cosmosdb iso8601


【解决方案1】:

这可能是因为在此特定字段上应用了索引。

从此链接 https://docs.microsoft.com/en-us/azure/cosmos-db/indexing-policies, 你需要一个范围索引来表示范围或按查询排序。

应用于集合的默认索引策略是 “字符串的哈希和数字的范围”

日期时间存储为字符串,因此要运行范围比较查询或按查询排序,您需要将索引策略设置为“范围”,以用于精度为 -1 的字符串数据类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2019-11-14
    • 2012-09-03
    相关资源
    最近更新 更多