【かーそる】

カーソル(データベース) とは?

最終更新:
💡 検索結果の位置を持ち、行を取り出す

データベースの問い合わせ結果に対する位置を管理し、行を取り出す仕組み。1行ずつも複数行ずつも取得でき、移動方向や寿命はDBと設定によって異なる。

📌 このページのポイント
カーソル:検索結果の位置を保持 検索結果の例 ID 都市 値 1 東京 100 2 大阪 200 3 名古屋 150 位置 FETCH NEXT 次の1行へ進む 複数行も取得可 位置・取得方向・寿命はDBや設定による PostgreSQLの操作例:DECLARE → FETCH → CLOSE
PostgreSQLではFETCHで行を取り出す。複数行取得も可能で、1行ずつ読むだけで必ず省メモリになるわけではない。
ひよこ ひよこ
SELECTで一括取得するのと何が違う?
ペンギン先生 ペンギン先生
カーソルは結果の位置を持ち、そこから行を取り出すよ。PostgreSQLのFETCH NEXTなら次の1行、FETCH FORWARD 100なら前方へ最大100行を取得する。SELECTの結果をどこまで一度に転送・保持するかは、DBやドライバーの方式によるんだ
ひよこ ひよこ
カーソルならメモリを節約できる?
ペンギン先生 ペンギン先生
例えばPsycopg 3の通常のcursorは、結果全体をクライアント側に保持する。fetchone()で1行ずつ処理しても全体はメモリにあるんだ。サーバー側カーソルなら転送件数を制御できるけれど、DB側の資源は使うし、受け取った行を全て保存すればメモリは増えるよ
ひよこ ひよこ
どんなときに使うの?
ペンギン先生 ペンギン先生
結果を少しずつ読みながら、行ごとに処理したいときに役立つよ。同じ更新を多くの行に適用するなら、まとめて書けるSQLも検討しよう。速さは処理内容や実行計画によるので、「数十倍速い」「特定のカーソルが最速」と一律にはいえないんだ
ひよこ ひよこ
途中でコミットしても読み続けられる?
ペンギン先生 ペンギン先生
製品と設定次第だよ。PostgreSQLでは通常、作成したトランザクションの終了時に閉じる。WITH HOLDなら正常なコミット後も同じセッションで利用できるけれど、結果を一時ファイルやメモリへ保存する。使い終わったらCLOSEで資源を解放しよう
ひよこ ひよこ
カーソルベースページネーションとは別物?
ペンギン先生 ペンギン先生
APIでは次のページを取得するための印やトークンを使うよ。SlackのAPIではnext_cursorを次のリクエストへ渡す。これはDBの結果位置を管理するカーソルそのものとは違い、単純なIDや日時とは限らない。高速性や一貫性の保証もAPIの設計によるんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「カーソル(データベース)」って出てきたら「検索結果の位置を持ち、行を取り出す仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Database Cursor」 = データベースの現在位置を扱う仕組み
💬 結果のどの位置から行を取り出すかを管理するよ。最初の行より前や最後の行より後にある状態もあるんだ

参考資料

← 用語集にもどる