Row count exceeded 100,000

PlanetScaleからデータを取得する時に出るこのエラーの原因と解決方法この記事で解説します。

Error: 
Invalid `prisma.post.findMany()` invocation:


Error occurred during query execution:
ConnectorError(ConnectorError { user_facing_error: None, kind: QueryError(Server(ServerError { code: 1105, message: "target: post.-.primary: vttablet: rpc error: code = Aborted desc = Row count exceeded 100000 (CallerID: x319apmjisyi4914cih6)", state: "HY000" })), transient: false })
目次

エラーの原因

PlanetScaleにはこれらの制限があります。

PlanetScaleは、長時間実行されるクエリーやトランザクションを防ぐために、いくつかのシステム制限を導入しています:

利用可能なリソースをすべて積み上げ、消費してしまう。
他の重要で短時間のクエリやトランザクションの完了をブロックしてしまう。
再起動しないと復旧できないほどデータベースに負荷がかかる。
計画的なフェイルオーバーや重要なアップグレードが妨げられる。

https://planetscale.com/docs/reference/planetscale-system-limits#query-limits

これらの制限は具体的に以下の様に設定されています。

TypeLimit
Per-query row100k
Per-query DML timeout30s
Per-query SELECT timeout30s
Per-transaction timeout20s

今回のエラーはPer-query rowの10万件の制限に引っかかっています。

エラー・制限の回避方法

ページネーションなどで、大きなクエリを分割

10万件以上のレコードを返すクエリがある場合はページネーションなどで、小さなクエリに分割することでデータを取得することができます。

OLAPモードを利用する

公式では推奨方法となっていませんが、OLAPモードで10万件のデータを取得する事ができます。

OLAPモードはPlaneScaleのコンソールで以下の様にworkloadolapにすることでOLAPモードで利用することができます。

mysql> set workload=olap;

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

目次