多次调用 Azure Table 存储以请求少于 10 行

Multiple call to Azure Table storage to request less than 10 rows

我们正在使用 TableQuery 查询 Azure Table 存储以检索数据。 Table 包含近 50,000 个实体,而我的查询 returns 少于 10 条记录。

一切正常。当我们对其进行负载测试时,问题就来了。为了检索那些少于 10 条记录,我们的应用程序发送 5 到 8 个请求链 ContinuationToken

问题:如何阻止 Azure Table 提供商发送多个请求(每个请求 5 到 7 秒)以检索少于 10 条记录?注意:这仅在我们对应用进行负载测试时发生。

App Insights 中清楚地捕获了请求。

这是 App Insights 捕获的 Table 存储请求 url(前 3 个)。注意:每个请求都需要很长时间才能完成。

https://redacted.table.core.windows.net:443/Redacted?$filter=%28PartitionKey%20eq%20%27RedactedA%27%29%20and%20%28RedactedB%20eq%20%2763601%27%29

https://redacted.table.core.windows.net:443/Redacted?$filter=%28PartitionKey%20eq%20%27RedactedA%27%29%20and%20%28RedactedB%20eq%20%2763601%27%29&NextPartitionKey=1%2112%21WmlwQ29kZXM-&NextRowKey=1%218%21MTU4Nzc-

https://redacted.table.core.windows.net:443/Redacted?$filter=%28PartitionKey%20eq%20%27RedactedA%27%29%20and%20%28RedactedB%20eq%20%2763601%27%29&NextPartitionKey=1%2112%21WmlwQ29kZXM-&NextRowKey=1%218%21MjIzMzY-

这是我们的 table 查询

TableQuery<DynamicTableEntity> dynamicQuery = cloudTable.CreateQuery<DynamicTableEntity>();
var query = dynamicQuery.Where(x => x.PartitionKey == tableStorageMeta.PartitionKey &&
                               x.Properties[searchField].StringValue == searchValue).Select(x => x);

Table 存储针对 PartitionKeyRowKey 字段进行了优化。它会在单个聚集索引中使用这些自动为您的实体编制索引,因此点查询使用起来最有效。除了 PartitionKey 和 RowKey 上的聚簇索引之外,没有其他索引。

您的查询是分区扫描(第三个最佳选项),因为您也在查询其他字段。这可能是多次查询执行失败的原因:需要扫描整个分区。

Third best is a Partition Scan that uses the PartitionKey and filters on another non-key property and that may return more than one entity. The PartitionKey value identifies a specific partition, and the property values select for a subset of the entities in that partition. For example: $filter=PartitionKey eq 'Sales' and LastName eq 'Smith'

来源:Design for querying

Question: How to stop Azure Table Provider from sending multiple request for retrieving less than 10 records?

简单的回答是你不能(除了优化你的查询)。为了执行查询,Azure Table Storage 会分配固定的时间来执行该查询(5 秒)。如果查询执行花费的时间比这更长,Azure Table 存储 returns 到目前为止它获取的任何数据(最多 1000 个实体),如果有更多数据可用,它会 return 延续标记。

从这个link:

A query against the Table service may return a maximum of 1,000 items at one time and may execute for a maximum of five seconds. If the result set contains more than 1,000 items, if the query did not complete within five seconds, or if the query crosses the partition boundary, the response includes headers which provide the developer with continuation tokens to use in order to resume the query at the next item in the result set.

如果您想要高级索引选项而无需对数据进行反规范化以有效查询较小的分区,您可以使用 Cosmos DB Table API 作为最新 Azure.Data.Tables 客户。 Cosmos 自动索引所有字段,而不仅仅是存储的 PK 和 RK Tables.

更多信息在这里:https://docs.microsoft.com/en-us/azure/cosmos-db/table/introduction