您的位置:首页 > 数据库

SQL查询和优化(十五)

2017-08-17 20:49 162 查看
我们来生成一些模拟数据如下:
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 查询优化改写技巧与案例》 有教无类 落落 著
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: