问题标签 [azure-tablequery]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Azure 表存储:将 C# 转换为 NodeJS - 如何使用 CompareTo?
互联网上有很多关于如何使用 CompareTo 和 Azure 表存储来基本上从 C# 进行一些子字符串搜索的示例,但我找不到任何显示如何在 NodeJS 中执行此操作的内容以及我拥有的所有语法试图放在一起只是抛出各种语法或无效的查询存储异常。
谁能告诉我如何在这个网站上做与 C# 示例等效的操作,但来自 NodeJS? https://lifeportal.azurewebsites.net/azure-table-storage-searching-entities-using-query-like-substring-or-left/
最明显的是:
结果是:
c# - 调用 ExecuteQuerySegmented 时获取下载速度
我知道 ExecuteQuerySegmented 针对 Azure 表存储运行查询。我想知道调用 ExecuteQuerySegmented 时如何输出下载速度?就像是:
任何建议,将不胜感激。
azure - 唯一分区键的 Azure 表存储查询
我的问题如下,我有一个这样设置的 Azure 表存储:
- 分区键:字符串
- 行键:数字
我想做一个查询,给定一个数字 X,我想为每个分区键返回小于 X 的最大数字行键。这是一种令人困惑的措辞,所以这里有一个例子:
分区键、行键
“你好”,7
“你好”,9
“你好”,12
“其他”,6
如果我用数字 10 进行查询,我想返回一个类似 [("hello", 9), ("other", 6)] 的列表。请注意,我只想要唯一的分区键和小于 10 的最大数字。
我可以为特定名称执行此操作,例如(为简洁起见,省略一些内容):
但我似乎无法弄清楚如何使用所有不同的分区键来做到这一点。这可能在单个查询中吗?谢谢你的帮助!
azure-table-storage - Azure 表查询中的最大 $filter 比较
这个页面(https://docs.microsoft.com/en-us/rest/api/storageservices/querying-tables-and-entities)说:
请注意,在 $filter 字符串中最多允许进行 15 个离散比较。
然而,在我的实验中,我已经达到了这个极限并且没有任何副作用。例如,这是来自 Azure 存储资源管理器:
storageacct/table 的统计信息(“PartitionKey eq '1' or PartitionKey eq '2' or PartitionKey eq '3' or PartitionKey eq '4' or PartitionKey eq '5' or PartitionKey eq '6' or PartitionKey eq '7' or PartitionKey eq '8' 或 PartitionKey eq '9' 或 PartitionKey eq '10' 或 PartitionKey eq '11' 或 PartitionKey eq '12' 或 PartitionKey eq '13' 或 PartitionKey eq '14' 或 PartitionKey eq '15' 或 PartitionKey eq ' 16' 或 PartitionKey eq '17' 或 PartitionKey eq '18' 或 PartitionKey eq '19' 或 PartitionKey eq '20' 或 PartitionKey eq '21' 或 PartitionKey eq '22' 或 PartitionKey eq '23' 或 PartitionKey eq '24'或 PartitionKey eq '25' 或 PartitionKey eq '26'或 PartitionKey eq '27' 或 PartitionKey eq '28' 或 PartitionKey eq '29' 或 PartitionKey eq '30' 或 PartitionKey eq '31' 或 PartitionKey eq '32' 或 PartitionKey eq '33' 或 PartitionKey eq '34' 或 PartitionKey eq '35' 或 PartitionKey eq '36' 或 PartitionKey eq '37' 或 PartitionKey eq '38' 或 PartitionKey eq '39' 或 PartitionKey eq '40' 或 PartitionKey eq '41'"): 0 个实体或 PartitionKey eq '38' 或 PartitionKey eq '39' 或 PartitionKey eq '40' 或 PartitionKey eq '41'"): 0 个实体或 PartitionKey eq '38' 或 PartitionKey eq '39' 或 PartitionKey eq '40' 或 PartitionKey eq '41'"): 0 个实体
鉴于 15 个比较限制,我希望这个 $filter 会导致请求失败。
在我需要以某种方式解释“15 个离散比较”的情况下,我尝试了这个查询与各种和/或组合。它总是成功的。
上一代 Azure 表 API 的限制是否不再存在?
$filter 还有其他限制吗?比如最大字符串长度?
谢谢
** 编辑 **
我一直在对此进行更多尝试。假设Development Storage Emulator和真实的服务一样,一个查询中可以使用的比较运算符的数量并不是一个固定的数量。以下是一些实验结果,它们给出了成功的结果,其中当递增 1 时会导致错误:
(PK==V) and ((RK==V) or (RK==V) ... 97x) // 98 次比较,97 次非 PK 比较
(PK==V 和 RK==V)或(PK ==V and RK==V) ... 97x // 194 次比较,97 次非 PK 比较
(RK==V) 或 (RK==V) ... 98x // 98 次比较,98 次非 PK 比较
(PK==V) 或 (PK==V) ... 98x // 98 次比较,0 次非 PK 比较
(PK==V and RK==V and Prop=V) or (PK==V and RK ==V and Prop=V) ... 93x // 279 次比较,186 次非 PK 比较
我不确定从中得出什么结论。我可以安全地执行 (PK==V and RK==V) or'd 97 次,但我可以执行 (RK==V) or'd 98 次。我已经用相同的值和不同的值以及其他比较运算符进行了测试,而不仅仅是等于。
有了这些结果,我们怎么能预见到服务器会根据查询字符串返回错误呢?
数字 15 在哪里发挥作用?
** 编辑 **
我刚刚在实时存储帐户上尝试了所有测试,发现没有最大值。事实上,我能够继续成功添加运算符,直到它开始返回:
远程服务器返回错误:(414) Request-URI Too Long。
因此,我从存储模拟器获得的所有这些随机结果显然不适用于实时服务。而且15个比较限制根本不存在?(推测)
经过反复试验,当完整 URI 大约有 32768 (32KB) 个字符长时,我似乎开始收到 414 错误。这是一个完全编码的 URL,包括所有其他参数、方案、主机名等。我认为没有一种可靠的方法来预先计算 ExecuteQuery 生成的确切 URI 长度,所以我想可以只拆分请求开始在大约 32500 个字符的 $filter 字符串之后?然后不要指望它可以与存储模拟器一起使用......
azure-table-storage - Azure 表查询“或”谓词会导致扫描吗?
假设以下查询:
PartitionKey==1 AND (RowKey==A OR RowKey==B)
甚至这个:
(PartitionKey==1 AND RowKey==A) OR (PartitionKey==2 AND RowKey==B)
这些中的任何一个都会导致扫描吗?
我问是因为这个 PDC 谈话表明它确实:
https://channel9.msdn.com/Events/PDC/PDC09/SVC09
特别是在 27:30,演讲者和幻灯片状态:
键上的“或”谓词 => 没有查询优化 => 导致扫描
这在 29:30 再次重申,建议使用并行查询。在网上搜索后,我也发现了这个线程:
查询中的“OR”目前尚未优化,但正如我上面提到的,我们对此提出了功能要求。
现在所有这些信息都有 7-8 年的历史,而且可能已经发生了变化。上一个链接表明这是一个功能请求,今天它可能已经发生了。有吗?
如果它确实导致扫描,为什么?鉴于两个所需元素的唯一键都是已知的,扫描一个或多个分区的技术原因是什么?
考虑一个场景,其中一个人试图获取数百/数千个实体,其中每个实体的 Partition+RowKey 是预先知道的。执行单个查询以并行获取每个实体是否更快,或者使用“OR”谓词对每个调用进行批处理以最小化并行查询的数量?
最后一个问题 - 在单个查询中跨不同分区获取多个实体时是否有任何性能影响(问题顶部的第二个查询示例)?还是将查询保存在单个分区中更好(问题顶部的第一个查询示例)?25:20 的 PDC 谈话似乎表明,让查询将工作分配到多个分区实际上更好,这样工作可以并行进行。然而,讨论直接针对分区上的范围查询,而不是在两个不同的分区上使用“或”谓词。
谢谢!
** 编辑 **
我决定自己测试一下性能。对于测试,我创建了一个包含一个分区和一百万个实体的表。分区键为“0”,行键为“0”到“999999”的递增值。
运行测试时,我做了:
在第一个测试中,我构建了一个如下所示的查询:
(PK eq '0' 和 RK eq '0') 或 (PK eq '0' 和 RK eq '500') 或 ... x400
总共有 400 个“或”组。行键增加了 500 以分散请求。
运行此查询需要 Azure 3:26。
接下来,我使用同一个查询的更简洁的形式进行了测试:
PK eq '0' 和(RK eq '0' 或 RK eq '500' 或 ... x400)
同样,总共有 400 个 'OR'd 表达式。再次将行键增加 500 以分散请求。
运行此查询需要 Azure 1:19。更好,但仍然完全不可接受的性能。
最后,我使用 TableOperation.Retrieve<> 测试了 400 个并行请求。
Azure 平均只需 3 秒即可并行运行所有这些查询。
显然,永远不要在表达式中使用“OR”并始终使用并行查询。IMO 'OR' 的性能是不可接受的,如果微软不对其进行优化,他们应该将其删除。
azure-diagnostics - WADLogs 表中的 RowIndex 是什么?
如何在 azure 诊断 WADLogs 表中计算 RowIndex?我看到它不是跨行的连续顺序。它是随机生成的唯一编号吗?
RowKey 包含 RowIndex 作为其字符串的最后一段。了解如何计算 RowIndex 将帮助我根据行键(已编入索引)查询 WADLogs 表。
azure - Azure Table 未将属性加载到对象中
我有一个Record
具有 aName
和 a的对象Theme
。
Theme 是嵌入在类型化类中的 KeyValue 对,例如“01”-“Sport”、“02”-“Home”等
我有一个这样的对象:
问题是当我尝试从 Azure 表中加载该记录时,如下所示:
我获得了record.Name
,但record.Theme
仍然始终为“null”,不会从“记录”表中加载,就像:
也在我的“主题”表中
我试图将构造函数添加到“主题”类
但这并没有改变结果......
有没有办法明确地说“取字符串“主题”并用于new Theme(string)
创建Theme
属性”
azure-table-storage - 使用 Array 或 List 属性创建 TableEntity?
我在 Azure 表中存储了一些这样的枚举
en
, , fr
, de
etc... 是语言代码,分别是表中的列名。
我应该创建什么样的TableEntity
才能正确加载它
然后像myFoo["fr"]
...一样使用它们有可能吗?
假设我有英文 GUI,我需要显示一个Foo
带有Eune
/Edoe
作为选择值的选择。
azure - Azure 表存储筛选器查询
我正在尝试针对字符串类型列过滤行。基本上我想用部分字符串过滤。它与 MySQL 中的 LIKE 操作非常相似。
我已经浏览了这个文档https://docs.microsoft.com/en-us/rest/api/storageservices/querying-tables-and-entities
但是,我找不到符合我要求的相关信息。任何建议更有帮助。
azure - TableQuery.CombineFilters 中 FilterCondition 的最大数量
我需要使用 Azure 表存储执行类似批量获取的操作。我有一个已知 RowKeys 和 PartitionKeys 的列表,我想检索每一个。
我想知道是否有比单独查询每个实体更好的方法——比如批量 GET。
在这个答案中,有一个建议的解决方案:
但另一个答案提到:
有没有办法知道一个表查询有多长?或者使用建议的答案安全地查询表的解决方案?