Azure SDK for python (cosmos DB): partition_key を指定して、パフォーマンスへの悪影響を避ける

# 背景

Cosmos DB に対して SQL 調査していた際に出たエラーの対処記録

具体的なエラーは以下 

method: 
- <code>container_proxy.query_items</code>

SQL:
- aggregation を利用 (AVG) 

```powershell: 実際のエラー
Query contained NonValueAggregate, which the calling client does not support.
ActivityId: {ActivityId}, Microsoft.Azure.Documents.Common/2.14.0
Code: BadRequest
Message: Query contains 1 or more unsupported features. Upgrade your SDK to a version that does support the requested features:
Query contained NonValueAggregate, which the calling client does not support.
ActivityId: {ActivityId}, Microsoft.Azure.Documents.Common/2.14.0
```

# 結論 

<code>partition_key</code> をきちんと指定してやる

そもそも、指定してないとパフォーマンスに影響がある

今回は、query_items() だったが、他のメソッドでも同じ   

# 詳細

## エラーメッセージ的には、SDK update?

最新にしても特に変わらず。

Azure Portal では正常に動くのも確認。

ってことで、以下が疑われる
1. SDK の問題
1. 使い方の問題  
    で、こっちを調べてみたら解決

## partition_key を省略するとどうなるのか？

ドキュメントを見てみると、aio の場合、省略すると、cross-partition query になるって書いてある。 

- aio の partition_key
   ![2024-10-04_11h35_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/40e57775-9666-a8d1-0e0a-f870e033d79a.png)

- sync の partition_key
   ![2024-10-04_11h35_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/ca58573f-59f8-871f-c353-69e42953d6a1.png)

しかしながら <code>enable_cross_partition_query</code> は、aio には存在しない :thinking: 

- aio では、エラーになる。以下で、エラーについて記述してた 

https://qiita.com/baku2san/items/1aae9c3f9698c1f61e0d#typeerror-clientsession_request-got-an-unexpected-keyword-argument-enable_cross_partition_query

- sync にはあって、sample 等では、True に設定されている
![2024-10-04_11h46_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/a76b549e-b530-b8b2-9c38-56dee2da7f23.png)

では、そもそも、<font color=red><code>**cross_partition_query**</code></font> ってなに？って話だが・・ 以下を見ると、

- パーティションを横断してクエリを実行するってこと

![2024-10-04_11h55_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/f1c2f8b4-f638-8b2d-47a3-9bec99a1248a.png)

https://learn.microsoft.com/ja-jp/azure/cosmos-db/nosql/how-to-query-container#cross-partition-query

- で、パーティションは以下の図に詳しい
   そう、きちんと、container 内で partition_key を使っていれば高速になるよねって話 
![](https://learn.microsoft.com/ja-jp/azure/cosmos-db/media/partitioning-overview/logical-partitions.png)

https://learn.microsoft.com/ja-jp/azure/cosmos-db/partitioning-overview#replica-sets

## 何故、enable_cross_partition_query が、aio にないのか？

指定してないなら、cross にするよーって話。ドキュメントに記載の話
![2024-10-04_12h15_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/782f2c8b-7205-3abc-27e0-5d5dcb19b626.png)

https://github.com/Azure/azure-sdk-for-python/issues/30735

## 何故、aio で、cross_partition_query がダメなのか？

省略してても、普通に動く <code>query</code> はあることから、

Aggregation Query だから unsupported ってことだと思われる。

それについて根拠は見つけられなかったので、とりあえず今回は諦め 

---

# 公式ドキュメント 
## SDK reference of query_items() 

https://learn.microsoft.com/en-us/python/api/azure-cosmos/azure.cosmos.containerproxy?view=azure-python#azure-cosmos-containerproxy-query-items

- aio 用

https://learn.microsoft.com/en-us/python/api/azure-cosmos/azure.cosmos.aio.containerproxy?view=azure-python#azure-cosmos-aio-containerproxy-query-items


# 参考
## エラー内容に関連した github issues

それっぽかったけど、2019 なんで、片付いている印象

![2024-10-04_10h48_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/70eec284-7191-9379-7f97-9aef63500756.png)

https://github.com/dotnet/efcore/issues/16146

# genspark に対処法を聞いてみた結果

非常にいい感じなんだけど、答えまでは行きつけてない

![2024-10-04_10h48_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/6609f675-cdc5-f10d-c603-5d3b8b573bc7.png)


https://www.genspark.ai/spark?id=3d51a61f-5eb4-4b81-9b91-43387fcbab04

# Cross Partition Query について

https://www.genspark.ai/spark?id=def0ca01-2067-4648-93a2-0ff57dd2d2c8


---

# あとがき

サンプルを元にやってたから、partition key 指定してなかったことが多かったけど、
ちゃんと設定していこうと改めて思いましたとさ :sweat: