Azure sql database Azure SQL Server与表存储性能

Azure sql database Azure SQL Server与表存储性能,azure-sql-database,azure-table-storage,Azure Sql Database,Azure Table Storage,我读了很多关于Azure表存储性能的文章。我的收获是,如果只使用partionkey Azure表存储是闪电般快的话。为了测试它,我创建了两个场景 基本价格层上有1300万行的SQL server。所有列都编制了索引。 具有120000行的表存储。 两者具有相同的实体: public class Item { [Key] public int Id { get; set; } public string Path { get; set; } public bo

我读了很多关于Azure表存储性能的文章。我的收获是,如果只使用partionkey Azure表存储是闪电般快的话。为了测试它,我创建了两个场景

基本价格层上有1300万行的SQL server。所有列都编制了索引。 具有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 server时,它在28秒内返回706326行

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

我希望表存储速度快得多。特别是因为表中的数据要少得多,而我只使用partion键。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;
CloudTable table=tableClient.GetTableReference(“项”);
var q=来自表中的s.CreateQuery()
其中s.PartitionKey==“1”
选择s.JobId;
var sw=新秒表();
sw.Start();
var ee=q.ToList();
sw.Stop();
var ms=sw.eassed.total毫秒;

你们有没有其他经验?我在这里遗漏了一些东西,或者SQL server可能会更快一些?我认为这个特定的场景应该有利于表存储。

仅对于azure表存储(我不熟悉azure sql),仅使用
分区\u键来查询表存储不是一个好的做法,它将执行
分区扫描
,这将花费更多的时间

对于azure表查询,性能从好到坏依次为:点查询->范围查询->分区扫描->表扫描

详情如下(您也可以在此找到):

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

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

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


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

仅针对azure表存储(我不熟悉azure sql),仅使用
分区键来查询表存储不是一个好做法,它将执行
分区扫描
,这将花费更多的时间

对于azure表查询,性能从好到坏依次为:点查询->范围查询->分区扫描->表扫描

详情如下(您也可以在此找到):

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

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

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


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

但是如果您需要给定分区中的所有行怎么办?这就是我的设想。从数据量超过100倍的SQL server执行此操作需要28秒。正如我提到的,如果你想得到给定分区中的所有行,你应该尝试使用范围查询(这比只使用分区键要快)。您需要根据本文设计azure表存储:。我还试图找到一些文档,这些文档应该可以证明表存储速度更快,但是运气不好。如果您有此类文档,您可以将其添加到您的问题中。谢谢。但是如果您需要给定分区中的所有行呢?这就是我的设想。从数据量超过100倍的SQL server执行此操作需要28秒。正如我提到的,如果你想得到给定分区中的所有行,你应该尝试使用范围查询(这比只使用分区键要快)。您需要根据本文设计azure表存储:。我还试图找到一些文件来证明ta