【かーそる】

カーソル(DB) とは?

最終更新:
💡 検索結果の位置を持ち、必要な行を取り出して処理する

データベースのクエリ結果に対する位置を持ち、そこから行を取り出す仕組み。1行ずつ、または複数行ずつ処理できる。DBのサーバー側カーソルと、ライブラリのカーソルオブジェクトでは、結果の保持場所や取得方法が異なることがある。

📌 このページのポイント
結果の位置を持ち、行を取り出す クエリ結果 ID 商品 1 ノートPC 2 マウス 3 キーボード 橙:現在の位置の例 FETCH 1行・複数行 取り出して処理 省メモリの効果は、取得・保持の方式次第 使い終わったカーソルは閉じる
結果表から行を取得する模式例で、橙の指示は現在位置を示し、右向きの矢印は取得を表します。表の順序は例です。1行取得と全結果をクライアントへ保持しないことは別で、サーバー側カーソルやドライバーの設定を確認します。
ひよこ ひよこ
カーソルって画面のカーソルと同じ?
ペンギン先生 ペンギン先生
どちらも位置を扱うけど、DBではクエリ結果の位置を持つ仕組みだよ。FETCHで行を取得すると位置が進む。最初の行より前や最後の行より後にある状態もあり、必ず現在の1行だけを指しているわけではないんだ。
ひよこ ひよこ
1行ずつしか取り出せないの?
ペンギン先生 ペンギン先生
1行ずつも、指定した件数をまとめても取り出せるよ。たとえばPostgreSQLのFETCH NEXTは次の1行、FETCH FORWARD 100は前方へ最大100行を取得する。戻れるかどうかなどはカーソルの設定によるので、順方向だけとは限らないんだ。
ひよこ ひよこ
Pythonのcursorも同じ?
ペンギン先生 ペンギン先生
Psycopgではcursorからexecute()でSQLを送り、fetchone()やfetchmany()、fetchall()で結果を受け取るよ。ただし通常のカーソルは結果をクライアントへまとめて転送するので、fetchone()で処理していても、全体がメモリに置かれていることがあるんだ。
ひよこ ひよこ
大量データでメモリを節約するには?
ペンギン先生 ペンギン先生
Psycopgの名前付きカーソルは、PostgreSQLのサーバー側カーソルを使って、制御した件数をクライアントへ転送できるよ。それでも受け取った行を全部リストに残せばメモリは増える。ドライバーのバッファ方式と、処理後に何を保持するかを確認しよう。
ひよこ ひよこ
カーソルは使わない方がいいこともある?
ペンギン先生 ペンギン先生
行ごとの処理が必要なときには役立つよ。一方、同じ更新を多数の行に行うなら、条件付きのUPDATEなど、まとめて表現できるSQLも検討する。速度はデータ量や実行計画、行ごとに何を行うかにもよるよ。使い終わったカーソルは閉じて資源を解放しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「カーソル(DB)」って出てきたら「検索結果の位置を持ち、行を取り出す仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Cursor」 = 現在位置を示すもの
💬 画面では入力や操作の位置を示す言葉として使うよ。DBでは、クエリ結果のどの位置から行を取得するかを扱うんだ

参考資料

← 用語集にもどる