内连接外连接子查询效率比较,请高手指点

mfc198666_002 2013-06-13 12:06:35
大家好,我想问一个查询效率的问题,关于内联外联和子查询那个效率高

数据库

A表

id name
1 小白
2 小红
3 小黑

B表

id pid type
1 1 S
2 1 S
3 1 L
4 2 L
5 2 L
6 3 S

其中 Pid 是外键

现在要查询小白的每个类型多少个

SELECT Name,
(SELECT count(*) from B where B.pid=A.id and B.type = 'S') as 总S,
(SELECT count(*) from B where B.pid=A.id and B.type = 'L') as 总L
from A where A.Name = '小白'

这个是子查询,然后下面用的内连接

SELECT A.[name],
(CASE WHEN B.[type] = 'S' THEN count(B.[type]) end) AS 总S,
(CASE WHEN B.[type] = 'L' THEN count(B.[type]) end) AS 总L
FROM A inner join B on A.id=B.pid WHERE A.[name] = '小白'
GROUP BY A.[name],B.[type]

请问这俩种哪个查询效率高,一般情况下应该用子查询还是内联查询?
...全文
1217 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
最爱午夜 2013-06-14
  • 打赏
  • 举报
回复
物理读取,是从磁盘读取到内存中, 逻辑读取,是查询执行器通过访问方法尝试读取的次数。
gogodiy 2013-06-14
  • 打赏
  • 举报
回复
像你这个,联接后使用group by应该更快。
mfc198666_002 2013-06-13
  • 打赏
  • 举报
回复
谢谢你的帮助,但是我还有一点小问题 请问怎么去区分物理读和逻辑读,什么时候他是物理读,什么时候他是逻辑读,可以帮我简单解释一下吗?谢谢
Mr_Nice 2013-06-13
  • 打赏
  • 举报
回复
引用 2 楼 mfc198666_002 的回复:
哦哦,这样子啊,就当前这个示例和数据库, 第一个子查询 开销是35% 第二个内联查询 开销是65% 开销多好还是少好 ?
需要衡量的指标一般是 物理读越少越好(减少io) 能走索引的seek就走seek(使用索引) 执行时间越短越好(反应时间)
mfc198666_002 2013-06-13
  • 打赏
  • 举报
回复
哦哦,这样子啊,就当前这个示例和数据库, 第一个子查询 开销是35% 第二个内联查询 开销是65% 开销多好还是少好 ?
Mr_Nice 2013-06-13
  • 打赏
  • 举报
回复
一般用内连接, lz可以使用ctrl+L 查看执行计划。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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