Azure SQL 服务器与 Table 存储性能
Azure SQL Server vs Table Storage performance
我阅读了很多有关 Azure Table 存储性能的文章。我的收获是,如果只使用 partionkey Azure Table 存储速度快如闪电。为了测试它,我创建了两个场景。
一个 SQL 服务器,基本价格层,有 1300 万行。所有列都已编入索引。
具有 120000 行的 table 存储。
两者具有相同的实体:
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 秒内 returns 706326 行。
当我在分区键上查询 table 存储时,它在 36.5 秒内 returns 100000 行。
我希望 table 存储速度更快。特别是因为 table 的数据少得多,而且我只使用分区键。 SQL 服务器真的更快吗?我很惊讶,因为大多数文章都说 Table 存储速度如此之快。
SQL 服务器查询 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;
Table存储查询:
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 服务器可能会更快?我认为这种特定情况应该有利于 Table 存储。
仅用于 azure table 存储(我对 azure sql 不熟悉),仅使用 partition_key
查询 table 存储不是一个好习惯它将执行 partition scan
这将花费更多时间。
对于azuretable查询,性能从好到坏依次为:点查询->范围查询->分区扫描->Table扫描。
详情如下(你也可以从这个doc找到):
点查询:点查询是最有效的查询,建议用于大容量查询或需要最低延迟的查询。这样的查询可以通过指定 PartitionKey 和 RowKey 值使用索引非常有效地定位单个实体。例如:$filter=(PartitionKey eq 'Sales') 和 (RowKey eq '2')
范围查询: 它使用 PartitionKey 并在一系列 RowKey 值上进行过滤以 return 多个实体。 PartitionKey 值标识特定分区,RowKey 值标识该分区中实体的子集。例如:$filter=PartitionKey eq 'Sales' and RowKey ge 'S' and RowKey lt 'T'
分区扫描: 它使用 PartitionKey 并过滤另一个非键 属性 并且可能 return 多个实体。 PartitionKey 值标识特定分区,属性 值 select 用于该分区中实体的子集。例如:$filter=PartitionKey eq 'Sales' 和 LastName eq 'Smith'
Table 扫描: 它不包括 PartitionKey 并且效率非常低,因为它会依次搜索构成 table 的所有分区对于任何匹配的实体。无论您的筛选器是否使用 RowKey,它都会执行 table 扫描。例如:$filter=LastName eq 'Jones'
我阅读了很多有关 Azure Table 存储性能的文章。我的收获是,如果只使用 partionkey Azure Table 存储速度快如闪电。为了测试它,我创建了两个场景。
一个 SQL 服务器,基本价格层,有 1300 万行。所有列都已编入索引。 具有 120000 行的 table 存储。 两者具有相同的实体:
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 秒内 returns 706326 行。
当我在分区键上查询 table 存储时,它在 36.5 秒内 returns 100000 行。
我希望 table 存储速度更快。特别是因为 table 的数据少得多,而且我只使用分区键。 SQL 服务器真的更快吗?我很惊讶,因为大多数文章都说 Table 存储速度如此之快。
SQL 服务器查询 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;
Table存储查询:
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 服务器可能会更快?我认为这种特定情况应该有利于 Table 存储。
仅用于 azure table 存储(我对 azure sql 不熟悉),仅使用 partition_key
查询 table 存储不是一个好习惯它将执行 partition scan
这将花费更多时间。
对于azuretable查询,性能从好到坏依次为:点查询->范围查询->分区扫描->Table扫描。
详情如下(你也可以从这个doc找到):
点查询:点查询是最有效的查询,建议用于大容量查询或需要最低延迟的查询。这样的查询可以通过指定 PartitionKey 和 RowKey 值使用索引非常有效地定位单个实体。例如:$filter=(PartitionKey eq 'Sales') 和 (RowKey eq '2')
范围查询: 它使用 PartitionKey 并在一系列 RowKey 值上进行过滤以 return 多个实体。 PartitionKey 值标识特定分区,RowKey 值标识该分区中实体的子集。例如:$filter=PartitionKey eq 'Sales' and RowKey ge 'S' and RowKey lt 'T'
分区扫描: 它使用 PartitionKey 并过滤另一个非键 属性 并且可能 return 多个实体。 PartitionKey 值标识特定分区,属性 值 select 用于该分区中实体的子集。例如:$filter=PartitionKey eq 'Sales' 和 LastName eq 'Smith'
Table 扫描: 它不包括 PartitionKey 并且效率非常低,因为它会依次搜索构成 table 的所有分区对于任何匹配的实体。无论您的筛选器是否使用 RowKey,它都会执行 table 扫描。例如:$filter=LastName eq 'Jones'