【かーそる】

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

最終更新:
💡 クエリ結果を「1行ずつ」取り出して処理する
📌 このページのポイント
データベースカーソルの仕組み 結果セット(Result Set) ID 名前 1 東京 100 2 大阪 200 3 名古屋 150 カーソル FETCH NEXT FETCH PRIOR CLOSE OPEN → FETCH(1行ずつ取得)→ CLOSE カーソルは結果セット内の「現在位置」を指すポインタ
データベースカーソルのイメージ
ひよこ ひよこ
SELECTで一括取得するのと何が違う?
ペンギン先生 ペンギン先生
通常のSELECTは結果を一度にメモリに取得する。100万行あれば100万行分のメモリが必要。カーソルは結果セットを保持しつつ1行ずつ取り出すから、メモリ効率が良い。ただしRDBMSは集合操作(セットベース)が得意だから、カーソルより普通のSQLの方が圧倒的に速いことが多いんだよ
ひよこ ひよこ
いつカーソルを使う?
ペンギン先生 ペンギン先生
①行ごとに異なる処理が必要(行Aの結果に基づいて行Bの処理を変える)、②外部APIを1行ずつ呼び出す必要がある、③バッチ処理で一定件数ごとにコミットしたい。ただし多くの場合、ウィンドウ関数CTEで集合的に書き換えられるから、まずはSQLで解決できないか検討しようね
ひよこ ひよこ
カーソルベースページネーションって別物?
ペンギン先生 ペンギン先生
まったく別の概念だよ。API設計で使う「カーソルベースページネーション」は、最後に取得したレコードのIDや日時を「カーソル」として次のリクエストに渡す方式。OFFSET/LIMITより高速で一貫性がある。TwitterやSlackAPIがこの方式。DBのカーソルとは名前が同じだけで仕組みは違うんだよ
ひよこ ひよこ
パフォーマンスの注意点は?
ペンギン先生 ペンギン先生
カーソルはRDBMSの最適化が効きにくい。100万行をカーソルでループするより、UPDATE ... SET ... WHERE条件で一括更新する方が数十倍速い。SQL Serverでは FAST_FORWARD(読み取り専用・前方のみ)カーソルが最速。PostgreSQLではSERVER CURSORで大量結果のフェッチに使うことがある。原則「カーソルは最後の手段」と覚えようね
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「カーソル」って出てきたら「クエリ結果を1行ずつ処理する仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Database Cursor」 = データベースカーソル(指示子)
💬 Cursor(指し示すもの)。結果セットの中で今どの行を指しているかを示すよ
← 用語集にもどる