我已经阅读了很多关于 Azure 表存储性能的信息。我的结论是,如果仅使用partionkey Azure表存储是闪电般的快。为了测试它,我创建了两个场景。
具有 1300 万行的基本价格层上的 SQL 服务器。所有列都已编制索引。 包含 120000 行的表存储。 两者都具有相同的实体:
public class Item
{
[Key]
public int Id { get; set; }
public string Path { get; set; }
public bool Deleted { get; set; }
public int JobId { get; set; }
public DateTime Started { get; set; }
public int DurationInMS { get; set; }
public int Status { get; set; }
}
当我查询 SQL 服务器时,它会在 28 秒内返回706326行。
当我在分区键上查询表存储时,它会在 100000 秒内返回 36,5 行。
我希望表存储要快得多。特别是因为该表的数据要少得多,而且我只使用分区键。SQL服务器真的更快吗?我很惊讶,因为大多数文章都说表存储如此之快。
SQL Server query EF:
var db = new CleanupDB(_config.DBConnection);
var sw = new Stopwatch();
sw.Start();
var dd = db.Items.Where(p => p.JobId == 4).ToList();
sw.Stop();
var ms = sw.Elapsed.TotalMilliseconds;
表存储查询:
CloudTable table = tableClient.GetTableReference("items");
var q = from s in table.CreateQuery<ItemItemEntity>()
where s.PartitionKey == "1"
select s.JobId;
var sw = new Stopwatch();
sw.Start();
var ee = q.ToList();
sw.Stop();
var ms = sw.Elapsed.TotalMilliseconds;
你们有其他经验吗?我在这里错过了一些东西,或者SQL服务器可能更快?我认为这种特定场景应该有利于表存储。
仅适用于 azure 表存储(我不熟悉 azure sql(,仅使用partition_key
查询表存储不是一个好的做法,它将执行partition scan
这将花费更多时间。
对于 Azure 表查询,性能从好到坏依次为:点查询 ->范围查询 ->分区扫描 ->表扫描。
详细信息如下(您也可以从此文档中找到它(:
点查询:点查询是最有效的查找,建议用于大容量查找或需要最低延迟的查找。此类查询可以通过指定分区键和行键值,使用索引非常有效地查找单个实体。例如:$filter=(PartitionKey eq 'Sales'( 和 (RowKey eq '2'(
范围查询:它使用分区键并筛选一系列 RowKey 值以返回多个实体。"分区键"值标识特定分区,"行键"值标识该分区中实体的子集。例如:$filter=PartitionKey eq 'Sales' and RowKey ge 'S' and RowKey lt 'T'
分区扫描:它使用分区键并筛选另一个非键属性,这可能会返回多个实体。PartitionKey 值标识特定分区,属性值为该分区中的实体子集选择。例如:$filter=PartitionKey eq 'Sales' and LastName eq 'Smith'
表扫描:它不包括分区键,效率非常低,因为它依次搜索组成表的所有分区以查找任何匹配的实体。无论您的筛选器是否使用 RowKey,它都将执行表扫描。例如:$filter=姓氏等式"琼斯">