2

假设我有一个表实体:

Partitionkey Rowkey 表 userid 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 的所有行还是我坚持分区键级别?

4

2 回答 2

3

您可以通过这种方式查询表,但您注意到这不是一个好主意。如果没有 PartitionKey,存储服务器正在做您所怀疑的事情:它正在读取表中的每个实体。在 Azure Tables 中,这被称为“表扫描”,它非常慢。

解决这个问题的唯一方法是在查询中包含 PartitionKey。如果你需要做很多这样的查询,你可以考虑使用 PartitonKey/RowKey 方案保留一个单独的表,这将使查询快速,或者使用具有适当索引的 SQL 数据库。

于 2012-09-26T22:37:48.043 回答
0

Partition 和 Row Keys 都是必填字段,虽然您可以在不指定它们的情况下进行查询,但它会导致表扫描,这实际上可能会导致所有结果从 azure 表加载到您的应用程序,在那里将逐行检查它们的有效性。

分区键和行键都被索引。分区键实际上将用于在分区之间拆分表,以更快地访问某些分区(更常用),在一个分区内,行都在一起。

我们在这里使用分区键来分解我们的多租户应用程序的租户,然后使用行来按特定 ID 检索。我们发现这种方法非常快,但不幸的是,就像您观察到的那样,它对搜索不是很友好,除非您使用这两个索引 ID 中的至少一个。

希望这可以帮助,

于 2012-09-27T14:09:03.537 回答