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 查询优化改写技巧与案例》 有教无类 落落 著
相关文章推荐
- sql查询优化
- 【转】SQL 高性能查询优化语句
- 利用索引和表扫描原理优化查询SQL语句
- 一次查询一条数据花费6分钟的SQL优化到0.05s的经历
- [转载] ORACLE中SQL查询优化研究
- 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
- sql查询优化总结ing
- 对SQL查询优化的补充--(in篇)
- sql 多表查询优化
- 对SQL查询优化的补充--(in篇)
- SQL查询和优化(二)
- SQL联合查询优化 用union all来代替union
- SQL查询语句优化
- 161.Oracle数据库SQL开发之 SQL优化——比较执行查询的成本
- SQL查询执行计划优化
- 使用嵌套子查询优化hive的SQL
- sql查询优化小结
- 【sql查询与优化】3.操作多个表
- SQL查询的where条件优化之一
- 记一条子查询的SQL优化