将点查询连接在一起时,Azure Table 存储中的性能不可靠

Unreliable performance in Azure Table Storage when joining point queries together

我在 Azure Table 存储的性能方面一直存在问题。我正在查询一个包含用户帐户的 table。 table 将 userId 存储在 PartitionKeyRowKey 中,因此我可以轻松进行点查询。

我的问题是因为在某些情况下我需要在单个查询中检索多个用户。为了实现这一点,我有一个 class 为我构建过滤器字符串。它的工作方式与问题无关,但这是输出示例:

(PartitionKey eq '00540de6-dd2b-469f-8730-e7800e06ccc0' and RowKey eq '00540de6-dd2b-469f-8730-e7800e06ccc0') or 
(PartitionKey eq '02aa11b7-974a-4ee9-9a8e-5fc09970bb99' and RowKey eq '02aa11b7-974a-4ee9-9a8e-5fc09970bb99') or 
(PartitionKey eq '040aec50-ebcd-4e5d-8f58-82aea616bd82' and RowKey eq '040aec50-ebcd-4e5d-8f58-82aea616bd82') or 
// up to 22 more (25 total)

第一次执行查询时,执行时间很长,在 2-5 秒之间,并且缺少导致错误的数据。 运行 第二次查询需要 0.2 到 0.5 秒才能完成,并且其中包含所有数据。

请注意,我也尝试过只提供 PartitionKey,但没有任何区别。我原以为点查询会执行得更好。

根据这个错误的介绍,我只能假设它是由于数据在第一次请求时是 'cold',然后在连续请求时从 'hot' 缓存中提取的。

如果是这种情况,我该如何更改过滤器字符串以提高性能?或者,如何更改 table 存储查询的超时时间以使其有更多时间完成?是否可以增加我的 table 存储的扩展?

请不要使用与 'or' 连接的点查询字符串,因为 Azure 存储 Table 无法将其视为多点查询。相反,Azure Table 会将其视为完整 table 扫描,这在性能上很糟糕。您应该分别执行25个点查询以提高性能。