c# - Azure表存储查询分区键

标签 c# azure azure-sql-database azure-storage azure-table-storage

我正在使用 Azure 表存储通过时间戳过滤器检索数据。我发现执行速度非常慢,因为时间戳不是分区键或行键。我在 stackoverflow 上进行了研究,发现时间戳应该转换为刻度并存储到分区键中。我做了同样的事情,在插入数据时,我获取了下面的字符串并将刻度字符串插入到分区键中。

string currentDateTimeTick = ConvertDateTimeToTicks(DateTime.Now.ToUniversalTime()).ToString();

public static long ConvertDateTimeToTicks(DateTime dtInput)
{
    long ticks = 0;
    ticks = dtInput.Ticks;
    return ticks;
}

到这里为止都还好。但是当我尝试检索最近 5 天的数据时,我无法查询分区键的刻度。我正在尝试获取最近 5 天的数据。下面的代码中我的错误是什么?

int days = 5;
TableQuery<MyEntity> query = new TableQuery<MyEntity>()
.Where(TableQuery.GenerateFilterConditionForDate("PartitionKey", QueryComparisons.GreaterThanOrEqual, "0"+DateTimeOffset.Now.AddDays(days).Date.Ticks));

最佳答案

您确定要使用刻度作为分区键吗?这意味着每个可测量的 100 ns 瞬间都成为它自己的分区。对于基于时间的数据,您可以使用分区键指定一个时间间隔,例如每小时、每分钟甚至每秒,然后使用带有实际时间戳的行键。

抛开这个问题,让我向您展示如何进行查询。首先让我评论一下如何生成分区键。我建议你这样做:

var partitionKey = DateTime.UtcNow.Ticks.ToString("D18");

不要使用DateTime.Now.ToUniversalTime()来获取当前的UTC时间。它将在内部使用 DateTime.UtcNow,然后将其转换为本地时区,而 ToUniversalTime() 将转换回 UTC,这只是浪费(而且比您更耗时)可能会想)。

您的 ConvertDateTimeToTicks() 方法除了获取 Ticks 属性外没有其他用途,因此它只会使您的代码变得更加复杂,而不会添加任何值。

以下是执行查询的方法:

var days = 5;
var partitionKey = DateTime.UtcNow.AddDays(-days).Ticks.ToString("D18")
var query = new TableQuery<MyEntity>().Where(
  TableQuery.GenerateFilterCondition(
    "PartitionKey",
    QueryComparisons.GreaterThanOrEqual,
    partitionKey
  )
);

分区键的格式为 18 个字符的字符串,允许您进行简单的比较。

我建议您将生成分区键(和行键)的代码移至函数中,以确保在整个代码中以相同的方式生成键。

使用 18 个字符的原因是因为今天以及 future 数千年的 DateTimeTicks 值使用 18 位十进制数字。如果您决定将分区键基于小时、分钟或秒而不是 100 ns 刻度,那么您可以相应地缩短分区键的长度。

关于c# - Azure表存储查询分区键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36616605/

相关文章:

azure-sql-database - 长 Azure SQL 数据库导入,100% DTU - 在恢复期间更改层会有所帮助吗?

c# - 根据属性和重复总和列出不同的条目

c# - 从 int 作为对象转换为 float 需要双重转换

azure - 使用 ARM 模板在 Azure Function App 中轻松进行身份验证和授权

Azure 应用程序网关入口 Controller 未到达服务(CLusterIP)

azure - 超过实例计数 * maxpool 的连接数

Azure 表存储 - 分布式锁定

c# - 干净地验证传递给 Mock 的参数的许多属性 [单独在单个验证调用之外]?

c# - 查找与其他列表元素有 3 个属性相似的列表元素,然后将第二个元素的值添加到第一个元素

azure - Sql-Azure 上的重复超时