假设我有一个表实体:
Partitionkey Rowkey 表 用户身份 dateCreated会
让我们看一个效果很好的查询,用它我可以检索所有具有特定ID的条目(用作PartitionKey)
Dim azt_query As CloudTableQuery(Of adlog)
azt_query = azt_context.CreateQuery(Of adlog)("adlog").Where(Function(e) (e.PartitionKey = "myid" And e.table = "mytable" And e.userid = "myuserid" And e.datecreated >= dateStart And e.datecreated <= dateEnd)).AsTableServiceQuery()
现在我想查询表而不知道PartitionKey但是基于USERID
就像那样:
Dim azt_query As CloudTableQuery(Of adlog)
azt_query = azt_context.CreateQuery(Of adlog)("adlog").Where(Function(e) (e.table = "mytable" And e.userid = "myuserid" And e.datecreated >= dateStart And e.datecreated <= dateEnd)).AsTableServiceQuery()
但现在删除e.PartitionKey =“myid”需要永远。我认为查询想要检索表的所有行并使用参数在其中搜索。
但是有数百万行。使用partitionkey查询实际上非常快。
有没有办法查询这个? 我可以检索特定USERID的所有行,还是我坚持使用分区键级别?
答案 0 :(得分:3)
您可以通过这种方式查询表格,但正如您所注意到的那样,这不是一个好主意。如果没有PartitionKey,存储服务器正在执行您所怀疑的操作:它正在读取表中的每个实体。在Azure Tables中称为“表扫描”的用语非常慢。
唯一的方法是在查询中包含PartitionKey。如果你需要做很多这样的查询,你可能会考虑使用PartitonKey / RowKey方案保持一个单独的表,这个方案可以快速地进行查询,或者使用带有适当索引的SQL数据库。
答案 1 :(得分:0)
分区和行键都是必填字段,而您可以在不指定它们的情况下查询它会导致表扫描可能实际上导致所有结果从azure表加载到您的应用程序中逐行检查是否有效。
分区和行键都被编入索引。分区键实际上将用于在分区之间拆分表以访问某些分区(更频繁地使用)以更快,在分区内,行都在一起。
我们在此处使用分区键来分解多租户应用程序的租户,然后使用行来按特定ID进行检索。我们发现这种方法非常快,但不幸的是,就像你观察到的那样,除非你使用这两个索引ID中的至少一个,否则它不是非常友好的搜索。
希望这有帮助,