标量子查询优化外连接

同事发来2个语句,说语句1跑得慢,语句2很快就出结果。一执行,果然很慢。仔细发现,2个语句不等价。

语句1:

select l.*,o.object_name
from v$locked_object l left join all_objects o on l.object_id=o.object_id;

语句2:

select l.*,o.object_name
from v$locked_object l,all_objects o where l.object_id=o.object_id;

左外连接,少了一个加号,改一改语句2,使它等价为语句1.

语句3:

select l.*,o.object_name
from v$locked_object l,all_objects o where l.object_id=o.object_id(+);

改成等价后也非常慢。

虽然语句2不等价,为什么语句2要比1和3快?看了一会执行计划,明白了。语句1中OBJ$走的是全表,语句2中OBJ$走的是索引。

性能瓶颈主要是all_objects非常慢,count一下花了超过15分钟,有100w以上的数据。

最终返回数据量才80条。

标量子查询的优化方法有哪些?

一种是建立索引优化,一种是外连接。

那么是不是标量子查询任何时候性能都要比外连接差呢,不一定。

下面改成标量子查询的语句

语句4:

select l.*,(select o.object_name from all_objects o where l.object_id=o.object_id) from v$locked_object l;

现在这种情况本身有索引了,可以改写成标量子查询,也是非常快。

避免了OBJ$的全表,all_objects有100w多记录

改写后等价于原来左外连接的意思,速度杠杠的,2s内出结果。

时间: 2024-08-24 12:44:54

标量子查询优化外连接的相关文章

MySQL数据库 多表查询 交叉连接 自然连接 内连接 自连接 外连接 子查询 多表查询练习 单表查询练习 𚳮

原文: http://blog.gqylpy.com/gqy/466 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

外连接 内链接 子查询

  笛卡尔积查询:(没有意义) 语法: * select * from A,B; * 笛卡尔积的查询的结果不是想要的结果!!! 内连接查询 语法: * select * from A inner join B on 条件; --- inner 可以省略!!! * select * from A join B on 条件; 案例: * select * from dept join emp on dept.did = emp.dno; 等价于 * select * from dept,emp wh

数据库SQL Server2012笔记(四)——多表查询、子查询、分页查询、用查询结果创建新表和外连接

1.多表查询 1)笛卡尔集: select  *  from  表名1,表名2 select  *  from  表名1,表名2  where   表名1.字段名=表名2.字段名 注: 若有两张表有相同名字的字段,则使用时需带表名(别名). order  by  置于where 条件之后. 2)自连接:同一张表的连接查询,将一张表视为两张表或多张表. eg:显示公司每个员工名字和他的上级的名字.将emp表看做两张表worker和boss select  worker.ename  雇员,boss

MySQL 外连接、内连接,连接查询、多表查询、子查询、视图

MySQL连接查询.多表查询.子查询: 连接查询:事先将两张或多张表join,根据join的结果进行查询: [导入hellodb.sql数据库],输入密码即可 [[email protected] home]# mysql -uroot -p  mydb < /home/hellodb.sql     hellodb.sql数据库下载链接:http://pan.baidu.com/s/1pJKK4w7 密码:a0re [查看students表] mysql> select * from stu

Oracle 自连接 / 外连接 / 子查询

--连接查询的三种格式 select ename, deptno,dname from emp natural join dept; select ename, deptno,dname from emp join dept using(deptno); select emp.ename, emp.deptno,dept.dname from emp join dept on emp.deptno!=dept.deptno; --自连接,将一张表当成两张表来看待 select e.ename,m

HIVE:用外连接替代子查询

由于hive也支持sql,很多人会把hql跟标准sql进行比较,甚至有的时候会直接套用.hive不支持事务也不支持索引,更不支持追加写,但是对于一般的sql都是能够支持的.但是对于一些子查询确实无法支持的,例如 ? 1 select * from t_ext_1_bkdoubledelete where f1=(select max(f1) from t_ext_1_bkdoubledelete) 这个sql在mysql中是能够支持的,意思是找到val最大的那一行记录,然后在hive中运行确实报

SQL优化--逻辑优化--子查询优化(MySQL)

1)子查询概念:当一个查询是另一个查询的子部分时,称之为子查询(查询语句中嵌套有查询语句). 子查询出现的位置有: a)目标列位置:子查询如果位于目标列,则只能是标量子查询,否则数据库可能返回类似"错误:  子查询必须只能返回一个字段"的提示. b)FROM子句位置:相关子查询出现在FROM子句中,数据库可能返回类似"在FROM子句中的子查询无法参考相同查询级别中的关系"的提示,所以相关子查询不能出现在FROM子句中:非相关子查询出现在FROM子句中,可上拉子查询到

MySQL学习笔记-子查询和连接

MySQL学习笔记-子查询和连接 使客户端进入gbk编码方式显示: mysql> SET NAMES gbk; 1.子查询 子查询的定义: 子查询(Subquery)是指出现在其他SQL语句内的SELECT子句. 例如:  SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中SELECT * FROM t1 称为Outer Query / Outer Statement (外部查询) SELECT col2 FROM t2 , 被称为Su

子查询与连接

子查询(Subquery)是指出现在其他SQL语句内的SELECT子句 例如: SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中SELECT * FROM t1,称为Outer Query/Outer Statement(外层查询) SELECT col2 FROM t2,称为Subquery 子查询指嵌套在查询内部,且必须始终出现在圆括号内 子查询可以包含多个关键字和条件,如DISTINCT.GROUP BY.ORDER BY.LI