SQL查询和优化(十五)

我们来生成一些模拟数据如下:
DROP TABLE t_object RURGE;
DROP TABLE t_tables PURGE;
CREATE TABLE t_objects AS SELECT * FROM dba_objects;
CREATE TABLE t_tables AS SELECT * FROM dba_tables;
ALTER TABLE t_objects ADD tablespace_name VARCHAR2(30);
现在需要把t_tables.tablespace_name 同步至 t_objects.talbespace_name,一般常用的是UPDARE:
UPDATE t_objects o
   SET o.tablespace_name = 
      (SELECT t.tablespace_name 
        FROM t_tables t
        WHERE t.owner = o.owner AND t.table_name = o.object_name)
WHERE EXISTS(SELECT t.tablespace_name
        FROM t_tables t
        WHERE t.owner = o.owner AND t.table_name = o.object_name);
注意上面的写法:两个子查询要保持一致,这样不会更新新范围之外的数据,也容易维护
像这种关联更新一般要改为MERGE,因为UPDATE语句有两次扫描t_tables表,而且其中一次相当于标量子查询
改写方法如下:
1、目标表(t_objects o)放在MERGE INTO后面
2、源表(t_tables)放在USING后面
3、关联条件(t.owner = o.owner AND t.table_name = o.object_name)放在on后面,注意关联条件放在括号里,否则会报错。
4、更新句子( SET o.tablespace_name = t.tablespace_name).注意:只能更新目标表,所以 o.tablespace_name一定要放在前面。
MERGE INTO t_objects o
USING t_talbes t ON(t.owner = o.owner AND t.table_name = o.object_name)
WHEN MATCHED THEN UPDATE
   SET o.tablespace_name = t.tablespace_name;
去掉了“标量子查询”,对t_tables只扫描了一次

选自《Oracle 查询优化改写技巧与案例》 有教无类 落落 著

猜你喜欢

转载自blog.csdn.net/every__day/article/details/77341010