最近、TSQLでのカーソルの使用についてこの議論があります...
まず第一に、私は議論のチアリーダーではありません。しかし、誰かがカーソルを言うたびに、義務的な「カーソルは邪悪な」というマントラで飛び跳ねるナックルヘッド(または50)が常にいます。SQL-Serverがセットベースの操作用に最適化されていることは知っています。カーソルは本当に邪悪な化身である可能性がありますが、その背後に客観的な考えを置きたい場合は...
これが私の心の行き先です:
カーソルとセット操作の唯一の違いはパフォーマンスの1つですか?
編集:IDのリストに対して単一のバッチを繰り返し実行したり、テーブルフィールドの行に格納された実際のSQLテキストを実行したりするなど、単にパフォーマンスの問題ではないという良いケースがあります。行ごと。
フォローアップ:カーソルのパフォーマンスは常に低下しますか?
- 編集:@Martinは、カーソルがセットベースの操作をかなり劇的に上回っている良いケースを示しています。これは(ある種のOLAP /データウェアハウスのようなソリューションに頼る前に)あまり頻繁に行うようなことではないと思いますが、それでも、それなしでは本当に生きていけないケースのようです。カーソル。
- カーソルが一般的に信じられているよりも競争力があるかもしれないことを示唆するTPCベンチマークへの参照。
- Sql-Server2005以降のカーソルのメモリ使用量の最適化への参照
セットベースの操作よりもカーソルの方が解決に適しているという、考えられる問題はありますか?
- 編集:セットベースの操作では、文字通りストアドプロシージャなどは使用できません(上記の項目1の編集を参照)。
Execute
- 編集:セットベースの操作は、大規模なデータセットを集約する場合、行ごとよりも指数関数的に遅くなります。
- 編集:セットベースの操作では、文字通りストアドプロシージャなどは使用できません(上記の項目1の編集を参照)。
- 人々がカーソルに頼る最も一般的な問題の見方を説明するMSDNの記事(および、より適切に機能するセットベースの手法の説明)。
- Microsoftは、MSDNの2008 Transact SQLリファレンスで(漠然と)「...結果は一度に1行ずつ処理するのが最適な場合があります」と述べていますが、どのような場合を参照しているのかについては例を挙げないでください。に。
ほとんどの場合、さまざまなアプリケーションに大幅なアップグレードを行う場合は、そこから何かが得られる限り、古いコードでカーソルをセットベースの操作に変換することを心がけています。(私は多くの場合、純粋さよりも怠惰になる傾向があります。つまり、壊れていない場合は修正しないでください。)