パーティションキーを指定するときに、Azure CosmosクエリのRUが高くなるのはなぜですか?

Jan 03 2021

これに似た質問があります。基本的に、パーティションキーを使用するさまざまな方法をテストしてきましたが、クエリで参照されるパーティションキーが多いほど、RUが高くなることに気づきました。これは非常に一貫性があり、パーティションキーがどのように使用されているかは関係ありません。そこで、テスト用の基本的なクエリに絞り込みました。

まず、このデータベースには約85万のドキュメントがあり、サイズはすべて1KBを超えています。パーティションキーは基本的に数値形式のIDの100モジュラスであり、/ partitionKeyに設定され、コンテナはデフォルトのインデックスポリシーを使用します。

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/\"_etag\"/?"
        }
    ]
}

これが私の基本的なクエリテストです:

SELECT c.id, c.partitionKey
FROM c
WHERE c.partitionKey = 99 AND c.id = '99999'
-- Yields One Document; Actual Request Charge: 2.95 RUs
SELECT c.id, c.partitionKey
FROM c
WHERE c.id = '99999'
-- Yields One Document; Actual Request Charge: 2.85 RUs

Azure Cosmosのドキュメントには、パーティションキーがないと、クエリはすべての論理パーティションに「ファンアウト」すると記載されています。したがって、最初のクエリが単一のパーティションをターゲットにし、2番目のクエリがすべてのパーティションをターゲットにすることを完全に期待します。つまり、最初のクエリのRUは低くなります。Cosmosが各パーティションをファンアウトしてスキャンしているかどうかの証拠としてRUの結果を使用し、ドキュメントに記載されている内容と比較していると思います。

これらの結果の違いはわずか0.1RUです。しかし、私のポイントは、クエリが複雑になるほど、違いが大きくなるということです。たとえば、これまでになく少し複雑な別のクエリを次に示します。

SELECT c.id, c.partitionKey
FROM c
WHERE (c.partitionKey = 98 OR c.partitionKey = 99) AND c.id = '99999'
-- Yields One Document; Actual Request Charge: 3.05 RUs

RUは成長を続け、パーティションキーをまったく指定していないこととは別になっていることに注意してください。代わりに、すべてのパーティションにファンアウトすると思われるパーティションキーチェックがないのと比較して、上記のクエリは2つのパーティションのみを対象とすることを期待します。

他のフィルターの後で(または各パーティションスキャン内で)パーティションキーチェックが行われているのではないかと思い始めています。たとえば、最初のクエリに戻りますが、IDを存在しないものに変更します。

SELECT c.id, c.partitionKey
FROM c
WHERE c.partitionKey = 99 AND c.id = '99999x'
-- Yields Zero Documents; Actual Request Charge: 2.79 RUs
SELECT c.id, c.partitionKey
FROM c
WHERE c.id = '99999x'
-- Yields Zero Documents; Actual Request Charge: 2.79 RUs

RUはまったく同じであり、両方(パーティションフィルターを備えたもの含む)のRUは、ドキュメントが存在する場合よりも少ないことに注意してください。これは、ファンアウトを制限するのではなく、結果に対してパーティションフィルターが実行されていることの症状のようです。しかし、これはドキュメントに書かれていることではありません。

パーティションキーが指定されているのに、なぜCosmosのRUが高くなるのですか?

回答

3 4c74356b41 Jan 03 2021 at 15:39

コメントがポータルを介して(またはコードを介して、ただし指定したクエリを使用して)テストするかどうかを指定するように、特定のパーティションをクエリするのではなく、すべてをクエリしてから別のフィルタを導入するため、コストが高くなります。より多くの費用がかかります。

代わりにすべきことは、コードで適切な方法を使用してパーティションキーを渡すことです。私の結果は非常に印象的でした。PKありで3ru \ s、PKなしで20.000 ru \ sなので、intworksにはかなり自信があります(非常に大きなデータセットがあります)