如何在 Power Query 中高效筛选 Azure Table 存储数据

How to efficiently filter Azure Table Storage data in Power Query

我想从 azure table 存储中提取数据到 Excel 2016 / Power Query。很难找到关于到底发生了什么的好的文档,但不管它是什么,它都很慢。我有一个很大的 table,所以我想确保在 Azure 端应用过滤器,而不是将所有数据拉给我并在客户端过滤。

到目前为止,这是我的查询(使用设计器构建,但这是高级编辑器版本):

let
    Source = AzureStorage.Tables("mystorageaccount"),
    ElmahLogs1 = Source{[Name="ElmahLogs"]}[Data],
    #"Filtered Rows" = Table.SelectRows(ElmahLogs1, each [Timestamp] > #datetime(2016, 5, 12, 12, 0, 0)),
    #"Expanded Content" = Table.ExpandRecordColumn(#"Filtered Rows", "Content", {"HostName", "Type", "Source", "Message", "User", "StatusCode", "AllXml", "PublicId"}, {"Content.HostName", "Content.Type", "Content.Source", "Content.Message", "Content.User", "Content.StatusCode", "Content.AllXml", "Content.PublicId"})
in
    #"Expanded Content"

如您所见,我首先尝试按时间戳进行过滤,假设这可以在 Azure 上快速处理。但这似乎需要几分钟而不是几秒钟。

有没有办法查看过滤是在客户端还是服务器端完成的?

是否有更好的方法将过滤器表达式传递给 Azure,例如在 AzureStorage.Tables() 函数或 Source() 函数的某处放置一个 OData 过滤器?

仅在时间戳上过滤会导致整个 table 扫描,效率非常低。 Azure Table 查询的最佳做法是至少过滤 PartitionKey。对于您的场景,请考虑重新设计每个日志尾模式 table here(我强烈建议您阅读整篇文章,因为它可以帮助您更好地理解 Azure Table)。

目前还没有通用的方法来查看过滤是发生在客户端还是服务器端,但我们认为这会有所帮助!

由于 Azure Tables 在内部使用 HTTP,如果您熟悉 Fiddler,您可以检查 Power Query 发出的 Web 请求并查看是否正在发送筛选器。