用SQL处理集合
Set Processing in SQL
SQL 完全基于集合(Set)来处理数据。对大部分更新或删除操作而言 —— 如果不是针对整个表的话 —— 你必须先精确定义出要处理的记录的集合。这定义了该处理的粒度(granularity),可能是对大量记录的粗粒度操作,有可能是只影响少数记录的细粒度操作。
将一次“大批量数据的处理”分割成多次“小块处理”是个坏主意,除非对数据库的修改太昂贵,否则不要使用,因为这种方法极其低效:
(1)占用过多的空间保存原始数据,以备事务(transaction)回滚(rollback)之需;
(2)万一修改失败,回滚消耗过长的实践。
许多人认为,进行大规模修改操作时,应在操作数据的代码中有规律地多安排些commit
命令。其实,严格从实践角度来讲,“从头开始重做”比“确定失败发生的时间和位置,接着已提交部分重做”要容易得多、简单得多、也快得多。
处理数据时,应适应数据库的物理实现。考虑事务失败时回滚所需日志的大小,如果要为undo保存的数据量确实巨大,或许应该考虑数据修改的频率问题。也就是说,将大规模的“每月更新”,改为规模不大的“每周更新”,甚至改为规模更小的“每日更新”,或许是个有效方案。
总结:几千个语句,借助游标(cursor)不断循环,很慢。换成几个语句,处理同样的数据,还是较慢。换成一个语句,解决上述问题,最好。
图书导读






