RBARとこれに関するこのリンクを読んだことで、RBARについての私の理解は次のようになります。
- ループとカーソルがあるもの
- 設定されていないもの
私はこれがちょっと完全に聞こえることを知っています、それが私が誰かがセットベースのプログラミングが何であるかについてもっとエレガントな説明を持っているかどうか尋ねている理由です(SQLコンテキスト内で)。
セットベースのプログラミングは、セットの数学的概念に基づいており、一度にセット全体を処理する演算子があります。手続き型 (RBAR) プログラミングは、従来のコンピューターのファイルとレコードの概念に基づいています。したがって、部門 X のすべての従業員の給与を 10% 増やすには:
セットベース:
UPDATE employees SET salary = salary * 1.10 WHERE department = 'X';
手続き型 (極端な例、疑似コード):
OPEN cursor FOR SELECT * FROM employees;
LOOP
FETCH cursor INTO record;
EXIT WHEN (no more records to fetch);
IF record.department = 'X' THEN
UPDATE employees
SET salary = salary * 1.10
WHERE employee_id = record.employee_id;
END IF
END LOOP
CLOSE cursor;
手続き型バージョンでは、一度に 1 つの従業員行のみが更新されます。セットベースのバージョンでは、「部門 X の従業員のセット」のすべての行が一度に更新されます (私たちの知る限り)。
これがリンクで既に読んだものに何かを追加するかどうかはわかりませんが、私はそれを試してみたいと思いました!
セットベースの処理にはループが含まれる可能性があることを指摘しておきます。1 つのセットベースのプロセスで 100 万のレコードをテーブルにロードする際に複数のテーブルを結合するのではなく、バッチで処理したい場合は、レコードのバッチをループできます。これは、一度に 1 行ずつ操作するカーソルよりも高速で、 1 つの巨大な挿入ステートメントを実行するよりも、データベースにとってはるかに優れている場合があります。
一部の RBAR プロセスは、カーソルやループのようにも見えません。これらには、相関サブクエリと多くのユーザー定義関数が含まれます。