SQL 查询结果数据集,作为另一个查询的条件,效率问题

oN5GrzoN 2011-08-23 11:39:32
有3个表,
班级表
班级ID 班级名

学生表
学生ID 学生名 所在班级ID

设备表
设备ID 所属班级ID

现在输入班级名,得到这些班级下的所有学生以及所有设备

select * from student where classid in (select classid from class where classname like '%str%');
select * from device where classid in (select classid from class where classname like '%str%');

这样两次查询,是可以得到结果的,但两个查询里都用了select classid from class where classname like '%str%',数据库会不会很智能的记录这个结果,在第二需要用的时候,就不再查一遍了?

还有个办法是用临时表,但我看SQL Server效率分析那个东西,"select * into 临时表"这个操作是最费时间的。

大神们怎么看呢?
...全文
640 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
NBDBA 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 on5grzon 的回复:]
引用 5 楼 nbdba 的回复:

是否用表变量或者临时表,需要分析具体情况,如果select classid from class where classname like '%str%'
返回量很大,临时表示最快的

如果返回量不大,而这个语句执行慢,表变量是最合适的
如果返回量不大,而这个语句执行快,可能最好就是两个子查询不用修改

不过我还是有个疑问,N年前我问过类似的问……
[/Quote]
这不否认,所以具体问题要具体分析,经常测试结果才是最后的结论,其他分析结果往往有不同程度偏差
oN5GrzoN 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ssp2009 的回复:]

引用楼主 on5grzon 的回复:
很智能的记录这个结果

查询优化器是有缓存机制,具体查看执行计划
[/Quote]
嗯,又有大神发话了,欣慰
oN5GrzoN 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nbdba 的回复:]

是否用表变量或者临时表,需要分析具体情况,如果select classid from class where classname like '%str%'
返回量很大,临时表示最快的

如果返回量不大,而这个语句执行慢,表变量是最合适的
如果返回量不大,而这个语句执行快,可能最好就是两个子查询不用修改
[/Quote]
不过我还是有个疑问,N年前我问过类似的问题,有个大牛好像说过,数据库都是很智能的,有时候会分析查询条件,像那种子条件如果多次出现的话,会记录结果,而不是每次都重查一遍,不知道这是不是真的。
快溜 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 on5grzon 的回复:]
很智能的记录这个结果
[/Quote]
查询优化器是有缓存机制,具体查看执行计划
oN5GrzoN 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nbdba 的回复:]

是否用表变量或者临时表,需要分析具体情况,如果select classid from class where classname like '%str%'
返回量很大,临时表示最快的

如果返回量不大,而这个语句执行慢,表变量是最合适的
如果返回量不大,而这个语句执行快,可能最好就是两个子查询不用修改
[/Quote]
哦,行,先就这样吧
NBDBA 2011-08-23
  • 打赏
  • 举报
回复
是否用表变量或者临时表,需要分析具体情况,如果select classid from class where classname like '%str%'
返回量很大,临时表示最快的

如果返回量不大,而这个语句执行慢,表变量是最合适的
如果返回量不大,而这个语句执行快,可能最好就是两个子查询不用修改

oN5GrzoN 2011-08-23
  • 打赏
  • 举报
回复
看了一下,是那个快捷键,叫执行计划
oN5GrzoN 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nbdba 的回复:]

"select * into 临时表"这个操作是最费时间的。
这个结论有根据吗?
[/Quote]
SQL Server 2005 在查询的时候按ctrl+l还是什么快捷键,会有一个查询效率分析什么的东西,我忘了名字了,会显示,哪句SQL语句占用了百分之多少的时间
NBDBA 2011-08-23
  • 打赏
  • 举报
回复
如果返回的数据量小,可以用表变量代替临时表
NBDBA 2011-08-23
  • 打赏
  • 举报
回复
"select * into 临时表"这个操作是最费时间的。
这个结论有根据吗?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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