RBAR与基于Set的SQL编程

sup*_*er9 10 sql set-based

看了这个链接RBAR这个,我RBAR的认识达这样的:

  1. 任何有循环和游标的东西
  2. 任何未设置的东西

我知道这听起来有点完全,这就是为什么我要问是否有人对基于集合的编程什么更优雅的解释(在SQL上下文中).

Ton*_*ews 13

基于集合的编程基于集合的数学概念,并且具有一次处理整个集合的运算符.程序(RBAR)编程更多地基于文件和记录的传统计算机概念.因此,要将X部门所有员工的工资提高10%:

基于集合:

UPDATE employees SET salary = salary * 1.10 WHERE department = 'X';
Run Code Online (Sandbox Code Playgroud)

程序(极端例子,伪代码):

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;
Run Code Online (Sandbox Code Playgroud)

在程序版本中,一次只更新一个员工行; 在基于集合的版本中,"部门X中的一组员工"中的所有行都会立即更新(就我们而言).

不确定这会增加你已经在你的链接中读到的内容,但我想我会有机会看到它!


HLG*_*GEM 9

我将指出基于集合的处理可能涉及循环.如果你想在一个基于集合的进程中加载​​一百万条记录时批量处理而不是捆绑多个表,你可以遍历批量记录,这比一次操作一行的游标更快,对于你的数据库而言,可能比做一个巨大的insert语句要好得多.

有些RBAR进程看起来不像游标或循环.这些将包括相关子查询和许多用户定义的函数.

  • 同意并陈述清楚。 (2认同)