【大话IT】sql优化改写

[复制链接]
查看11 | 回复9 | 2014-2-18 16:49:31 | 显示全部楼层 |阅读模式
本帖最后由 260600sz 于 2015-7-3 23:08 编辑
视图中有一段SQL,请大神们帮忙指点一下,能否改写描述:现在子查询关联列都有索引

selecta.id,b.name
from test_ds_rls_t a,test_ds_con_t bwhere a.confid=b.confid
and exist(select 1 from test_contronl_t con

inner join test_exam_t exam

on con.enid=exam.enid

where exam.enid=b.eid

)


回复

使用道具 举报

千问 | 2014-2-18 16:49:31 | 显示全部楼层
这中语句先要分析一下执行计划, 由于语句本身很简单, 如果子查询不是以连接的方式进行处理,而是用filter处理的, 这样就会有性能问题
回复

使用道具 举报

千问 | 2014-2-18 16:49:31 | 显示全部楼层
bell6248 发表于 2015-7-2 22:36
这中语句先要分析一下执行计划, 由于语句本身很简单, 如果子查询不是以连接的方式进行处理,而是用filter ...

是连接的,只是子查询都是全表
回复

使用道具 举报

千问 | 2014-2-18 16:49:31 | 显示全部楼层
260600sz 发表于 2015-7-2 22:48
是连接的,只是子查询都是全表

全表访问不意味就是不好, 使用索引也不意味就是好, 自己去分析一下执行计划吧
回复

使用道具 举报

千问 | 2014-2-18 16:49:31 | 显示全部楼层
没看到a b有什么关系
回复

使用道具 举报

千问 | 2014-2-18 16:49:31 | 显示全部楼层
1、a表怎么和其它表没有联接关系啊?那就是笛卡尔积了,这是有意为之的吗?。
2、可以改写为不用EXIST的形式:
selecta.id,b.name
from test_ds_rls_t a,test_ds_con_t b,test_contronl_t con,test_exam_t exam
wherecon.enid=exam.enid
and exam.enid=b.eid;

回复

使用道具 举报

千问 | 2014-2-18 16:49:31 | 显示全部楼层
bell版主的 新头像 太艳丽了 有点不习惯了


回复

使用道具 举报

千问 | 2014-2-18 16:49:31 | 显示全部楼层
260600sz 发表于 2015-7-2 22:48
是连接的,只是子查询都是全表

如果你要查询的结果集比较大,那走全表扫描是比走索引要强的
回复

使用道具 举报

千问 | 2014-2-18 16:49:31 | 显示全部楼层
单纯看写法,已经很优化了
回复

使用道具 举报

千问 | 2014-2-18 16:49:31 | 显示全部楼层
from test_ds_rls_t a,test_ds_con_t b
这个是笛卡儿积?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行