azure-sql-database - 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 表存储(我不熟悉 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'
推荐阅读
- react-native - 反应原生嵌套文本组件的可访问性
- python - 如果要关闭文件,是否需要再次打开文件?
- php - Docker 容器 MySQL 和 PHP “LOAD DATA LOCAL INFILE”权限问题
- javascript - 无法在使用 *[Symbol.iterator]() 生成器 javascript 创建的可迭代对象上使用 next()
- swift - Swift - 覆盖默认编码/解码
- python - Spark 3.0 和 Cassandra Spark / Python Conenctors:在写入之前未创建表
- javascript - HTTPS POST 请求未传递任何数据
- javascript - rails webpacker错误:ModuleNotFoundError:找不到模块:错误:无法解析“/home/deploy/clotho/app/javascript/packs”中的“logo.svg”
- python - 以最佳方式找到二维网格中点之间的欧式距离
- python - 数组numpy回归线性