oracle left join执行leftjoin sum时间差距大

查看: 10540|回复: 10
问一个多表left join优化问题
论坛徽章:7
有一个SQL进8个表left join如下:
select t.*,
& && && &t1.col1,
& && && &t2.col2,
& && && &t3.col1,
& && && &t4.col3,
& && && &t5.col1,
& && && &t6.col1,
& && && &t7.col2
from t left join t1 on t.col1=t1.col1
& && && &left join t2 on t.col2=t2.col2
& && && &left join t3 on t.col3=t3.col2
& && && &left join t4 on t4.col1=t2.col3
& && && &left join t5 on t5.col1=t3.col2
& && && &left join t6 on t6.col4=t.col4
& && && &left join t7 on t7.col5=t.col5
主要T表有500W行,t2 表有300W行,而t3-t7都是小条1000行以下。 这个怎么优化
论坛徽章:127
这种语句只要优化器能够得到准确的8表的统计信息, 就能得到最优化的执行计划, 不要去人工制定hints去优化, lz目前可以通过目前语句的执行计划和其他的信息进行分析!
论坛徽章:21
bell6248 发表于
这种语句只要优化器能够得到准确的8表的统计信息, 就能得到最优化的执行计划, 不要去人工制定hints去优化 ...
这种join的都靠系统自动来优化的么?
想请教那一般是哪些种情况需要人工制定hints呢?
论坛徽章:127
smarck 发表于
这种join的都靠系统自动来优化的么?
想请教那一般是哪些种情况需要人工制定hints呢?
看看相关的优化的资料, 尤其是官方的文档,目前都是CBO时代了!
By the way, you'd better believe in the optimizer of oracle.
论坛徽章:21
bell6248 发表于
看看相关的优化的资料, 尤其是官方的文档,目前都是CBO时代了!
By the way, you'd better believe in ...
论坛徽章:1088
小表做基表,nested loop的话,小表做驱动表,先把所有的小表连接做完,然后与次大表做连接,nl的话,大表最好走索引
hash的话一样,小表或小表的小结果集做hash表,
但是你这个t表是基表,不同版本的不同,10g t才可以做成probe table,10g之前只能做hash 表,不能走hash right join
搜集统计信息吧
论坛徽章:1088
注意连接键的索引,一般要有
论坛徽章:9
dingjun123 发表于
小表做基表,nested loop的话,小表做驱动表,先把所有的小表连接做完,然后与次大表做连接,nl的话,大表最 ...
论坛徽章:2
乖乖&&你这个米办法 优化, 唯一的优化就是搜集准确的统计和创建最佳索引
论坛徽章:399
其实都是和t1 left join
itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号:10 广播电视节目制作经营许可证:编号(京)字第1149号在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
现在有两个大表做关联,CM_DEVICE表的ID是主键,在使用LEFT JOIN时,执行计划里走的是全表扫描,但是在使用子查询的时候,却走了主键索引,这是为什么? 使用LEFT JOIN:
使用子查询:
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我理解数据库是不是full table scan还是走索引,是根据where语句。Left join只where了spec_id,那就只走cm_link表的spec_id索引,另一张表并没有where,也就是全表扫描。
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。oracle面试模拟试题
一、选择题(40分)
发出下列select语句:
SQL& select e.empno, e.ename, d.loc
2 from emp e, dept d
3 where e.deptno = d.deptno
4 and substr(e.ename, 1, 1) = &S&;
下列哪个语句是Oracle中可用的ANSI兼容等价语句?
A.select empno, ename, loc from emp join dept on emp.deptno = dept.deptno where
substr(emp.ename, 1, 1) = &S&;
B.select empno, ename, loc from emp, dept on emp.deptno = dept.deptno where
substr(emp.ename, 1, 1) = &S&;
C.select empno, ename, loc from emp join dept where emp.deptno = dept.deptno and
substr(emp.ename, 1, 1) = &S&;
D.select empno, ename, loc from emp left join dept on emp.deptno = dept.deptno and
substr(emp.ename, 1, 1) = &S&;
下列哪个选项表示Oracle中select语句的功能?
A.可以用select语句改变Oracle中的数据 B.可以用select语句删除Oracle中的数据
C.可以用select语句和另一个表的内容生成一个表 D.可以用select语句对表截断
你要操纵Oracle数据,下列哪个不是SQL命令?
A.select * B.set define
C.update emp set ename = 6543 where ename = &SMITHERS&;
D.create table employees(empid varchar2(10) primary key);
你要在Oracle中定义SQL查询。下列哪个数据库对象不能直接从select语句中引用?
A.表 B.序列C.索引 D.视图
你要根据PRODUCT_NAME列从PROFITS表查询中过滤返回的数据。下列哪个子句包含相应过滤条件的引用?
A.select B.from C.whereD.having
用下列代码所示的内容回答后面五个问题:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------ ---------- --------- ---- --------- ---- ---- ------
7369SIMTHCLERK790217-DEC-8080020
7499ALLENSALESMAN769820-FEB-
7521WARDSALESMAN769822-FEB-
7566JONESMANAGER783902-APR-
7654MARTINSALESMAN769828-SEP-
7698BLAKEMANAGER783901-MAY-
7782CLARKMANAGER783909-JUN-
7788SCOTTANALYST756619-APR-
7839KINGPRESIDENT17-NOV-
7844TURNERSALESMAN769808-SET-
7876ADAMSCLERK778823-DEC-
7900JAMESCLERK769803-DEC-8195030
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
以下选项中哪个是下列查询返回的值:select sum(sal) + sum(comm) from emp where job = &ANALYST& or ename like &J%&
A.6000 B.9925C.9975 D.NULL null参与运算后的结果还是null
以下选项中哪个是下列查询返回的值:select count(mgr) from emp where deptno = 10
A.1 B.2 count运算可以忽略空行C.3 D.NULL
以下选项中哪个是下列查询返回的值:select count(*) from emp where mgr = 7700-2
A.5 B.6 C.7 D.NULL
以下选项中哪个是下列SQL命令产生的第三个员工:select ename, sal from emp where job= &SALESMAN& order by empno desc
A.ALLEN B.MARTIN C.TURNER D.WARD
以下选项中哪个是发出下列查询后Oracle返回的值:select substr(job, 1, 3) from emp where ename like upper(&__ar%&)
A.ANA B.CLE C.MAND.SAL
要从ORDERS表中取得数据,其中包括三个列CUSTOMER、ORDER_DATE与ORDER_AMT。可以用下列哪个where子句查询ORDERS表,取得客户LESLIE超过2700的订单?
A.where customer = &LESLIE&;
B.where customer = &LESLIE& and order_amt & 2700;
C.where customer = &LESLIE& or order_amt & 2700;
D.where customer = &LESLIE& and order_amt & 2700;
对表中的某一行,VARCHAR2列包含数值SMITHY,应用程序在右侧填充七个空格。length()函数处理这个列值时,返回什么值?
A.6 B.13C.30 D.60
在Oracle中发出的下列查询:
SQL& select months_between(&15-MAR-83&,&15-MAR-97&)
Oracle返回什么?
A.14 B.-14 C.168D.-168
开发报表时,要连接三个表的信息,这些表为EMP、DEPT与SALGRADE。只需要公司10级员工相应的员工姓名、部门地址与工资的记录。这个查询需要多少条件?
A.2 B.3C.4 D.5
Oracle中发出下列命令:
SQL& select e.ename,a.street_address,a.city,a.post_code
2 from emp e,addr a
3 where e.empno = a.empno(+)
4 and a.state = &TEXAS&;
下列哪个选项显示等价ANSI/ISO语句?
A.select e.ename, a.street_address, a.city, a.state, a.post_code from emp e outer join addr a on e.empno = a.empno where a.state = &TEXAS&;
B.select e.ename, a.street_address, a.city, a.state, a.post_code from emp e left outer join addr a on e.empno = a.empno where a.state = &TEXAS&;
C.select e.ename, a.street_address, a.city, a.state, a.post_code from emp e right outer join addr a on e.empno = a.empno where a.state = &TEXAS&;
D.select e.ename, a.street_address, a.city, a.state, a.post_code from emp e right outer join addr a where e.empno = a.empno(+) and a.state = &TEXAS&;
对数据库运行下列哪个group by查询时会从Oracle产生错误?
A.select deptno, job, sum(sal) from emp group by job,
B.select sum(sal), deptno, job from emp group by job,
C.select deptno, job, sum(sal)
D.select deptno, sum(sal), job from emp group by job,
检查下列SQL的输出
SQL& select a.deptno,a.job,b.loc,sum(a.sal)
2 from dmp a,dept b
3 where a.deptno = b.depton
4 group by a.deptno,a.job,b.loc
5 order by sum(a.sal);
这个查询按哪个列的顺序返回输出?
A.A.DEPTNO B.A.JOB C.B.LOC D.SUM(A.SAL)
用下列代码块回答问题:
SQL& select deptno,job,avg(sal)
2 from emp
3 group by deptno,job
4 having avg(sal)&
5 ( select sal
6 from emp
7 where ename = &MARTIN& );
上述语句使用下面哪种子查询?
A.单行子查询B.多行子查询 C.from子句子查询 D.多列子查询
查询语句返回的结果是单行就是单行子查询
查询语句返回的是多行就是多行子查询
Oracle中要生成数据库表,下列哪个选项是无效表生成的语句?
A.create table cats(c_name varchar2(10), c_weight number, c_owner varchar2(10));
B.create table my_cats as select * from cats where owner = &ME&;
C.create global temporary table temp_cats(c_name varchar2(10), c_weight number, c_owner varchar2(10));
D.create table 51cats as select c_name, c_weight from cats where c_weight & 5;
JOB表有三个列JOB_NAME、JOB_DESC和JOB_WAGE。用下列命令在JOB_DESC表中插入新行:
SQL& insert into job(job_name, job_desc)
2 values (&LUCKEY&, &MAKES COFFEE&);
之后查询这个表时得到的结果:
SQL& select * from job where job_name = &LUCKEY&;
JOB_NAME JOB_DESC JOB_WAGE
--------- ------------ --------
LUCKEY MAKES COFFEE 35
数据是如何填信JOB_WAGE表的?
A.JOB表中的LUCKEY行已经存在,JOB_WAGE设置为35。
B.生成表时JOB_WAGE列定义的default子句指定插入行时的值。
C.insert语句的values子句包含隐藏值,在插入行时加入。
D.惟一理由是对JOB表发出的后一个update语句增加了JOB_WAGE值
二、问答题(20分)
1.写出常见的事务控制语句?举例说说事务具体的应用?
答:常见事物语句:commit,rollback,savepoint
举例:① DML A &&;
② COMMIT;
③ DML B&&;
④ ROLLBACK;
⑥ SAVEPOINT
⑦ DML D&&;
⑧ ROLLBACK TO
分析:第二行提交语句执行过后,第四行的rollback语句回滚只能回滚到第二行,说明第三行的DML语句对数据库操作失效;第六行的设置保存点标记过以后,第八行的回滚就能回滚到sp保存点。
2. oracle中如何获取时间?
答:select to_char(sysdate,&yyyy-mm-dd hh24:mi:ss&)
3.Truncate与 delete的区别?
答:两者都删除了表中数据,区别在于,delete语句只删除了数据,没有释放表的存储空间,而truncate语句既删除了表数据,也自动释放了表的存储空间,效率更高。
4. DDL和DML分别代表什么?
答:DDL:Date Definition Language(数据定义语言),包括alter、rename、create、drop&&
DML:Date Manipulation Language(数据操作语言)
5. Oracle使用什么语句给用户分配权限?
答:grant&&to&&
三、有员工表emp(eno,ename,salary,dno),其中各字段的含义依次为职工号、姓名、工资和所在部门号;有部门表dept(dno,dname),其中各字段的含义依次为部门号、部门名称。(10分)
1)请用SQL语句将&销售部&的那些工资数额低于3000元的职工的工资上调10%.
update emp
set salary=salary*1.1
where salary&3000 and dno=(
select dno from dept where dname=&销售部&);
四、有下列一张数据表:(10分)
1)写一个通用的查询语句,找出所有课程都及格的学生姓名。
select sname
from table_name
group by sname
having min(grade)&=60;博客访问: 290171
博文数量: 66
博客积分: 1416
博客等级: 上尉
技术积分: 922
注册时间:
认证徽章:
高級Oracle DBA,善長Linux系統維運以及Oracle數據庫管理,開發,調優.
具有多年PL/SQL開發經驗.
分类: Oracle 14:46:38
& 我這里說的,用left join update數據的是指
&&& 有a,b兩表,將b表數據根據某個歸則關聯更新到a表.
Oracle.寫法1& 目前用得最多的,& 注意: 當b表沒有對應數據時,& a表 xxx欄位會更新為null
& update a set a.xxx = (select b.eee from b where a.bid = b.id)
Update emp
  Set(sal,comm) = (select sal,comm. From emp1 where emp.empno = emp1.empno)
Oracle.寫法2 用merge
& merge into a
& on (a.a=b.b)
& when matched then update set xxxxx
& when not matched then insert (xxx) values(xxx);
其它寫法,Oracle 不支持
&& update a set a.xxx=b.eee
&& left& join b on a.bid=b.id
阅读(2008) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。left join 会极大的降低效率吗?
[问题点数:40分,结帖人ufopipi]
left join 会极大的降低效率吗?
[问题点数:40分,结帖人ufopipi]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|}

我要回帖

更多关于 oracle left join 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信