讨论SQL语句联合查询的效率问题

cdisk 2012-03-24 10:28:51
A

select * from b where id in (select id from a where leibie=1)
select * from b , a where b.id=a.id and a.leibie=1

----------------------------------------------------------
B

select (select mc from b where b.id=a.id) from a
select b.mc from a, b where a.id=b.id




上诉A,B中的两种方案,哪种更效率呢 ? 为什么呢?~ 个中有缺点又是什么呢?~
...全文
292 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdisk 2012-05-01
  • 打赏
  • 举报
回复
这........... 可以更详细吗
ssqtjffcu 2012-05-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
A

SQL code

select * from b where id in (select id from a where leibie=1)
select * from b , a where b.id=a.id and a.leibie=1


----------------------------------------------------------
B

……
[/Quote]
A,B方案中的两个语句根本就不是等价的,没有什么好比较,两条语句出来的结果有可能不一样
mailking 2012-03-24
  • 打赏
  • 举报
回复
A方案还是要看情况的
in查询不一定会比两表连接要慢,这取决与子查询返回的记录数,如果子查询返回的记录数量非常少的情况下,b 表非常大的情况下in查询也是非常快的
B方案
select (select mc from b where b.id=a.id) from a 是相关子查询,它会对a表做全表扫描,并且会一条一条的扫描,如果与b表有id相等的时候才会返回记录。如果a表很小只有不到10条记录而b表非常大,执行的效率也会非常快,反之a表非常大效率就慢了

对于两表关联查询这个主要是要靠索引来提高查询效率,如果两表都非常大,索引没建好的话执行效率也不敢恭维,很有可能走全表扫描或者全索引快速扫描
lxyzxq2008 2012-03-24
  • 打赏
  • 举报
回复
A方案中,一个是子查询,一个是连接查询
这个,按照正常的认识来说应该是连接查询快,尤其是数据量大的时候,数据量很小的时候应该体现不出来
原因:子查询,需要不停的遍历表,而连接查询一般只遍历一次。

B方案,我从来没用过,这个无法比较
数据库语言解析 各种数据库的流程 目录........................................................................................................................................ 2 第 1章 模块功能概要描述................................................................................................... 4 第 2章 SQL 语句编写注意问题 .......................................................................................... 5 2.1 IS NULL 与 IS NOT NULL.................................................................................... 5 2.2 联接列...................................................................................................................... 5 2.3 带通配符(%)的 like语句 .................................................................................. 6 2.4 Order by 语句 ...................................................................................................... 6 2.5 NOT......................................................................................................................... 6 2.6 IN 和 EXISTS........................................................................................................ 7 第 3章 SQL 语句性能优化 .................................................................................................. 9 3.1 选用合适的 ORACLE 优化器................................................................................ 9 3.2 访问 Table的方式................................................................................................... 9 3.3 共享 SQL 语句...................................................................................................... 10 3.4 选择最有效率的表名顺序(只在基于规则的优化器中有效)............................. 11 3.5 WHERE 子句中的连接顺序................................................................................. 12 3.6 SELECT子句中避免使用 ‘ *’ ............................................................................. 13 3.7 减少访问数据库的次数........................................................................................ 13 3.8 使用 DECODE 函数来减少处理时间.................................................................. 14 3.9 整合简单,无关联的数据库访问........................................................................... 15 3.10 删除重复记录...................................................................................................... 16 3.11 用 TRUNCATE 替代 DELETE.......................................................................... 16 3.12 尽量多使用 COMMIT........................................................................................ 16 3.13 计算记录条数...................................................................................................... 17 3.14 用 Where子句替换 HAVING子句.................................................................... 17 3.15 减少对表的查询.................................................................................................. 17 3.16 通过内部函数提高 SQL 效率............................................................................ 18 3.17 使用表的别名(Alias) .......................................................................................... 20 3.18 用 EXISTS替代 IN............................................................................................. 20 3.19 用 NOT EXISTS 替代 NOT IN........................................................................... 21 3.20 用表连接替换 EXISTS....................................................................................... 21··············································································································································

17,137

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧