阅读了关于RBAR和this的链接后,我对 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;
在程序版本中,一次只更新一个员工行;在基于集合的版本中,“部门 X 的员工集合”中的所有行都会立即更新(就我们而言)。
不确定这会增加您在链接中已经阅读的内容,但我想我会尝试一下!
我将指出基于集合的处理可能涉及循环。如果您想在一个基于集合的过程中将一百万条记录加载到它们中时分批处理而不是捆绑多个表,您可以遍历一批记录,这比一次操作一行的游标更快,并且对于您的数据库而言,可能比执行一个巨大的插入语句要好得多。
一些 RBAR 进程看起来也不像游标或循环。这些将包括相关的子查询和许多用户定义的函数。