使用分区键、行键和非索引的 Azure 表查询性能
Posted
技术标签:
【中文标题】使用分区键、行键和非索引的 Azure 表查询性能【英文标题】:Azure table query performance with partition key, rowkey and non-index 【发布时间】:2020-05-01 11:14:05 【问题描述】:我在按 PK、RK 和非索引键搜索的下方有一个表查询。
这会减慢数据库搜索速度吗?如果通过c#在web层执行DOB搜索会更快吗?
var name = "John";
var wins = 20;
var dob = DateTimeOffset.Parse("1999-1-1");
string usernameFilter2 =
TableQuery.CombineFilters(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, name),
TableOperators.And,
TableQuery.GenerateFilterConditionForInt("RowKey", QueryComparisons.Equal, wins)),
TableOperators.And,
TableQuery.GenerateFilterConditionForDate("DateOfBirth", QueryComparisons.GreaterThanOrEqual, dob));
【问题讨论】:
我不确定您的查询是否会返回任何结果,因为您正在使用分区键和两个行键进行“与”查询。您的查询中有错字吗? 一种类型。谢谢你指出它 我的答案还是一样。 【参考方案1】:考虑到 PartitionKey/RowKey 组合可能只有一个实体,我认为您的查询的第三个过滤条件是多余的(假设您打算在其中包含另一个属性而不是 RowKey)。
就查询速度而言,再次考虑到您正在搜索具有匹配 PartitionKey 和 RowKey 的实体,此查询将是最快的。如果您从查询中删除 RowKey 并搜索 PartitionKey 和任何其他非索引属性,则速度会变慢,因为查询将执行分区扫描以查找匹配实体。
您可能会发现这篇文章对您有所帮助:https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-design-guide。
【讨论】:
我的意思是在查询中添加 DateOfBirth 属性会更慢?但是在web层加过滤器还是比较好? 仅当您从查询中排除 RowKey 时。如果您在查询中添加 RowKey,则无需添加此 DateOfBirth 过滤器。不确定我是否理解您的第二个问题。 添加DateOfBirth是为了在PK和RK匹配时进一步过滤掉结果。因此,DateOfBirth 是必需的。 只能有一个实体匹配 PK/RK 组合。 DateOfBirth 应该是 ValidDate 或类似的。理想的情况是即使 PK/RK 都匹配,如果 ValidDate 已过期,则不会返回该行。这就是使用 ValidDate 的原因。如果您检查查询语句,将 DateOfBirth 替换为 ValidDate,这可能是有意义的。在这种情况下,在查询中使用 ValidDate 可能会减慢一点,但并不明显?以上是关于使用分区键、行键和非索引的 Azure 表查询性能的主要内容,如果未能解决你的问题,请参考以下文章