先日の勉強会で話題になったので少しだけ。
カーソル処理はパフォーマンス問題の原因になります、という主張についてです。
私は勉強会などでカーソル処理は辞めた方が良い、と言います。
その理由は処理遅延が起きるからです。
その主張の根拠としているのは以下です。
・SQLは結果セットでの処理に適した処理系であり、手続き型言語の処理に合わせたカーソル処理はRDBMSで処理するには無駄が多い(RDBMS内では1行1行処理するので、都度アプリとの通信が発生し、ターンアラウンドの時間が無駄になる)
・SQL Serverではカーソルの中間データは場合によってTEMPDBに保存され、都度呼び出される。つまりDISK IOが発生する要因となる
カーソルは数百行程度の処理であればそれほどパフォーマンス問題は起きにくいと思いますが
数万行、数億行を1行1行丁寧に処理すると、1行の処理そのものは遅くなくても、処理全体で
遅くて使い物にならないというのはよく見かけます。
また数百行程度だと見込んでいた処理が処理件数増大にともなって遅くなっていく様もありがちです。
私が提言したいのはアプリ内のループ処理にカーソル食わせてぶん回すのは辞めましょう、
それなら結果セットを使って対象データを一気に処理しましょうということです。
1行ずつ結果をチェックして他のテーブルにinsertするんだ!だからカーソルは辞められない!
と仰る方もおられますが、それは結果セットを取ってきた後にまとめてデータチェックして
チェック済みデータをinsertすればよいと答えます。
その実装が要件に合わない場合は我慢せざるを得ないわけですが。。。
チューニングでカーソルを廃止したことで、時間が劇的に変わったこともあります。
カーソル実装が原因で苦しむ管理者、開発者が1人でも減りますように。
↧
カーソル処理は遅いことがある
↧