2

テーブルエンティティがあるとしましょう:

Partitionkey Rowkey テーブルのユーザー ID 作成日

うまく機能するクエリを見てみましょう。これを使用すると、特定の 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 のすべての行を取得できますか、それとも partitionkey レベルに固執していますか?

4

2 に答える 2

3

この方法でテーブルにクエリを実行できますが、お気づきのように、それは良い考えではありません。PartitionKey がなければ、ストレージ サーバーはまさにあなたが疑ったことを行っています。つまり、テーブル内のすべてのエンティティを読み取っています。Azure テーブルの用語では、"テーブル スキャン" と呼ばれますが、これは非常に低速です。

これを回避する唯一の方法は、クエリに PartitionKey を含めることです。このようなクエリを頻繁に実行する必要がある場合は、そのクエリを高速化する PartitonKey/RowKey スキームを使用して別のテーブルを保持するか、適切なインデックスを持つ SQL データベースを使用することを検討してください。

于 2012-09-26T22:37:48.043 に答える
0

パーティション キーと行キーはどちらも必須フィールドですが、指定せずにクエリを実行するとテーブル スキャンが発生し、実際にはすべての結果が Azure テーブルからアプリケーションに読み込まれ、行ごとに有効性がチェックされる場合があります。

パーティション キーと行キーの両方にインデックスが付けられます。パーティション キーは、実際にはテーブルをパーティション間で分割して、一部のパーティション (より頻繁に使用される) へのアクセスを高速化するために使用されます。パーティション内では、行はすべてまとめられています。

ここでは、パーティション キーを使用してマルチテナント アプリケーションのテナントを分類し、行を使用して特定の ID で取得します。この方法は非常に高速であることがわかりましたが、残念ながら、お気づきのように、これら 2 つのインデックス付き ID のうち少なくとも 1 つを使用しない限り、あまり検索に適していません。

お役に立てれば、

于 2012-09-27T14:09:03.537 に答える