使用分区键、行键和非索引的 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 表查询性能的主要内容,如果未能解决你的问题,请参考以下文章

Azure 表存储查询性能

Azure 流分析分区键列在表存储中重复

如何降低 Azure 表存储延迟

Azure 表:选择分区/行键的最佳实践

一个具有许多分区键的 Azure 表存储表与许多具有较少分区键的表相比如何?

Azure 表存储:按顺序排列