我正在使用 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 数千年的 DateTime
的 Ticks
值使用 18 位十进制数字。如果您决定将分区键基于小时、分钟或秒而不是 100 ns 刻度,那么您可以相应地缩短分区键的长度。
关于c# - Azure表存储查询分区键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36616605/