【かーそる】

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

💡 クエリ結果を「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(指し示すもの)。結果セットの中で今どの行を指しているかを示すよ
← 用語集にもどる