我有一个Azure表,客户可以在其中发布消息,单个表中可能有数百万条消息。我想找到在过去10分钟内发布消息的最快方法(这是我刷新网页的频率)。由于只对分区键进行了索引,因此我考虑了使用发布消息的日期和时间作为分区键的想法,例如,将字符串作为ISO8601日期格式,如"2009-06-15T13:45:30.0900000“
伪代码示例:
var message = "Hello word!";
var messagePartitionKey = DateTime.Now.ToString("o");
var messageEntity = new MessageEntity(messagePartitionKey, message);
dataSource.Insert(messageEntity);,然后查询最近10分钟内发布的消息,如下所示(再次使用未经测试的伪代码):
// Get the date and time 10 minutes ago
var tenMinutesAgo = DateTime.Now.Subtract(new TimeSpan(0, 10, 0)).ToString("o");
// Query for the latest messages
var latestMessages = (from t in
context.Messages
where t.PartitionKey.CompareTo(tenMinutesAgo) <= 0
select t
)但是,这一点会被指数接受吗?或者它会导致全表扫描?有没有人有更好的主意呢?我知道每个表项上都有一个时间戳,但它没有索引,所以对我来说太慢了。
发布于 2011-09-08 06:07:51
我认为你的基本想法是正确的。你设计的查询应该和你所希望的一样高效。但我可以提供一些改进。
使用Date.UtcNow而不是DateTime.Now。据我所知,实例被设置为使用Utc时间作为它们的基准,但这只是确保您正在比较苹果和苹果,并且您可以在显示它们时可靠地将时间转换回您想要的任何时区。
而不是将时间存储为.ToString("o")将时间转换为刻度并存储,您将减少格式化问题(有时会在最后获得时区规范,有时不会)。此外,如果您总是希望看到这些消息从最新到最旧排序,您可以从最大刻度数中减去刻度数,例如
var messagePartitionKey = (DateTime.MaxValue.Ticks - _contactDate.Ticks).ToString("d19");指定行键也是一个好主意。虽然在完全相同的时间发布两条消息的可能性很小,但也不是不可能。如果您没有明显的行键,那么只需将其设置为Guid即可。
发布于 2012-02-14 21:39:55
表的主键是PartitionKey和RowKey(形成聚集索引)的组合。
在您的示例中,只需使用RowKey而不是ParitionKey(为此提供一个常量值)。
您还可以遵循诊断方法,比如每隔十分钟创建一个新的分区键。但这种方法主要用于归档/清除等需求,
发布于 2011-09-08 12:41:36
我建议做一些类似于Diagnostics API对WADPerformanceCountersTable所做的事情。其中,PartitionKey将多个时间戳分组到单个项目中。例如:它将所有时间戳舍入到最近的几分钟(例如,最近的5分钟)。这样,您就不会有数量有限的分区键,而且仍然能够对它们进行范围查询。
例如,您可以有一个映射到每个时间戳的PartitionKey,该时间戳四舍五入为00:00、00:05、00:10、00:15等。然后将其转换为刻度
https://stackoverflow.com/questions/7340514
复制相似问题