放100分针求意见:下列SQL语句的性能比较。

treeClimber 2006-02-23 01:53:42
1. SELECT A.* from A INNER JOIN B ON A.id=B.id WHERE B.sampleDate between x1 and x2
2. SELECT A.* from A INNER JOIN (SELECT * FROM B WHERE B.sampleDate between x1 and x2) ON A.id=B.id
3. SELECT A.* from A ,B WHERE A.id=B.id and B.sampleDate between x1 and x2
其中B是视图。

4. SELECT A.*,(select name from Agent where agentId=A.agentId) FROM A
与 SELECT A.*,c.name FROM A,Agent c WHERE c.agentId=A.agentId 是一样吗?

5. 另外,在一条复杂语句中多处用到下列子查询:
select u.* from (select userNo,agentId,activityId from UserInfo where createDate between x1 and x2
是不是在查询的时候会执行N次?而如果将这个子查询的结果插入到一个临时表后引用这个表,性能是否有明显改善?
6. 有人说查询视图等同于执行视图的SQL语句,当一个复杂SQL多次关联视图时,是否也多次执行视图的查询SQL呢?
...全文
234 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
msjqd 2006-02-27
  • 打赏
  • 举报
回复
1. SELECT A.* from A INNER JOIN B ON A.id=B.id WHERE B.sampleDate between x1 and x2
2. SELECT A.* from A INNER JOIN (SELECT * FROM B WHERE B.sampleDate between x1 and x2) ON A.id=B.id
3. SELECT A.* from A ,B WHERE A.id=B.id and B.sampleDate between x1 and x2
其中B是视图

---速度依次是 1》3》2

4. SELECT A.*,(select name from Agent where agentId=A.agentId) FROM A
与 SELECT A.*,c.name FROM A,Agent c WHERE c.agentId=A.agentId 是一样吗?

---不一样 第一句的语法有问题 在name返回多行的情况下报错
这条语句在写sql时最好不使用,因为在使用时必须确定是一条语句,必然用聚合函数或者是top语句。表/索引有可能多次重复扫描
例如: 表a 总记录为 N 如果运行程序 他就要执行 N*N

5. 另外,在一条复杂语句中多处用到下列子查询:
select u.* from (select userNo,agentId,activityId from UserInfo where createDate between x1 and x2)u
基本等于浪费了两倍的资源(慢)

treeClimber 2006-02-27
  • 打赏
  • 举报
回复
没人想领分吗?快快发表你的高见,UP有分。
treeClimber 2006-02-24
  • 打赏
  • 举报
回复
谢谢大家精彩点评!我说明一下,“临时表”并非是MSSQL数据库自带的#temp,而是我创建的,只是说我把它当临时表用,用完之后里面的数据就给删了,里面也可能建立了索引。

再恳请懂这行的朋友们多多指教!
waikey 2006-02-24
  • 打赏
  • 举报
回复
速度3>2>1
4:后者快于前者
5:看不懂
6:不要多次调用视图,可以不用的视图的尽量不要用
ReViSion 2006-02-24
  • 打赏
  • 举报
回复
哈哈,看看
bugchen888 2006-02-24
  • 打赏
  • 举报
回复
5. 另外,在一条复杂语句中多处用到下列子查询:
select u.* from (select userNo,agentId,activityId from UserInfo where createDate between x1 and x2
是不是在查询的时候会执行N次?而如果将这个子查询的结果插入到一个临时表后引用这个表,性能是否有明显改善?

-----是的,最好使用表变量,而不是临时表.

6. 有人说查询视图等同于执行视图的SQL语句,当一个复杂SQL多次关联视图时,是否也多次执行视图的查询SQL呢?

-----是的.
wudan8057 2006-02-24
  • 打赏
  • 举报
回复
6可以这么说
wudan8057 2006-02-24
  • 打赏
  • 举报
回复
比较1、2、3性能
1 的性能优于 2,原因:2方案的子查询返回了B表的结果集,任何结果集的返回都会消耗SQL的资源。如果将二方案改为EXISTS子查询其查询效果等于1。

比较4
2优于1,原因同上

比较5
采用临时表性能未必会提高,原因很简单,临时表没有索引,若将临时表与另一个表连接,将对临时表进行全表扫描,临时表记录越多,效率越低
treeClimber 2006-02-24
  • 打赏
  • 举报
回复
顶一下,恳请精于数据库方面的人指点一下!
rouqu 2006-02-24
  • 打赏
  • 举报
回复
1. SELECT A.* from A INNER JOIN B ON A.id=B.id WHERE B.sampleDate between x1 and x2
2. SELECT A.* from A INNER JOIN (SELECT * FROM B WHERE B.sampleDate between x1 and x2) ON A.id=B.id
3. SELECT A.* from A ,B WHERE A.id=B.id and B.sampleDate between x1 and x2
其中B是视图

---1,2,3的执行计划是一致的 所以性能是相同的 不知道你们怎么看出来不同的

4. SELECT A.*,(select name from Agent where agentId=A.agentId) FROM A
与 SELECT A.*,c.name FROM A,Agent c WHERE c.agentId=A.agentId 是一样吗?

---不一样 第一句的语法有问题 在name返回多行的情况下报错

5. 另外,在一条复杂语句中多处用到下列子查询:
select u.* from (select userNo,agentId,activityId from UserInfo where createDate between x1 and x2)u
是不是在查询的时候会执行N次?而如果将这个子查询的结果插入到一个临时表后引用这个表,性能是否有明显改善?

---一个语句只执行一次 但是表/索引有可能扫描多次 采用临时表存放中间结果的方式可以提高查询的性能 当然这不是绝对的

6. 有人说查询视图等同于执行视图的SQL语句,当一个复杂SQL多次关联视图时,是否也多次执行视图的查询SQL呢?

---查询视图等于执行视图的语句吗?显然是错误的 这个一般不会吧 总之根据查询计划来判断



---
连星入剑端 2006-02-23
  • 打赏
  • 举报
回复
如果不考虑B是视图的因数,在我看来,1、2、3中,由于连接时先生成的纪录集不同,效率2〉1〉3,不知道是不是这样,系统是不是会自动优化呢?
新鲜鱼排 2006-02-23
  • 打赏
  • 举报
回复
mark
jilate 2006-02-23
  • 打赏
  • 举报
回复
第1和第3句是一样的吧。
第2句用了子查询,应该没有第1或者第3句好

5。是的,保存一下,性能会好点的

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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