首页 > 解决方案 > Azure SQL Server 与表存储性能对比

问题描述

我已经阅读了很多关于 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 行。

当我在分区键上查询表存储时,它会在 36.5 秒内返回 100000 行。

我希望表存储速度更快。特别是因为该表的数据少得多,而且我只使用分区键。SQL Server 真的更快吗?我很惊讶,因为大多数文章都说表存储是如此之快。

SQL Server 查询 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-sql-databaseazure-table-storage

解决方案


仅对于 azure 表存储(我不熟悉 azure sql),仅通过使用查询表存储并不是一个好习惯,partition_key它将执行partition scan需要更多时间。

对于 azure table 查询,性能从好到差是:Point Query -> Range Query -> Partition Scan -> Table Scan。

详细信息如下(您也可以从此文档中找到):

点查询:点查询是最有效的查找方式,建议用于大容量查找或需要最低延迟的查找。通过指定 PartitionKey 和 RowKey 值,此类查询可以使用索引非常有效地定位单个实体。例如:$filter=(PartitionKey eq 'Sales') 和 (RowKey eq '2')

范围查询:它使用 PartitionKey 并过滤一系列 RowKey 值以返回多个实体。PartitionKey 值标识特定分区,RowKey 值标识该分区中实体的子集。例如:$filter=PartitionKey eq 'Sales' and RowKey ge 'S' and RowKey lt 'T'

分区扫描:它使用 PartitionKey 并过滤另一个非键属性,并且可能返回多个实体。PartitionKey 值标识特定分区,属性值选择该分区中实体的子集。例如:$filter=PartitionKey eq 'Sales' 和 LastName eq 'Smith'

表扫描:它不包括 PartitionKey 并且效率非常低,因为它会依次搜索构成表的所有分区以查找任何匹配的实体。无论您的过滤器是否使用 RowKey,它都会执行表扫描。例如:$filter=LastName eq 'Jones'


推荐阅读