关于Left Join极慢的问题!!求高手指点!!!!!

松树林 2012-07-17 04:16:20
原SQL语句:

Select top 10 A.*, B.cName as cInstrName, B.cModel
From Table1 A
Left Join Table2 B on A.cInstrID = B.cID
where B.cName like '%三槽式冷热冲击试验箱%'
order by A.iAutoID desc

说明:
1、A表有自增主键 iAutoID, 非聚集索引cInstrID 等
2、B表有 非聚集索引cID 等
3、A表总数据行数:35000,B表总数据行数:32000
4、单查B表的 B.cName like '%三槽式冷热冲击试验箱%' 是没有记录的,耗时不到一秒

问题:执行上面的SQL语句很慢,平均耗时 9秒左右,为什么这么慢?



...全文
1457 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
松树林 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

select top 10 cID,cName ,cModel From Table2 B where cName like '%三槽式冷热冲击试验箱%'
这样只要找出满足条件的 10 条就不找了,如果不加,就把所有的满足条件的数据都找出来。如果此表数据量大,有上百万的话,就慢了。
[/Quote]


关键是要 Order by A.iAutoID DESC的,加上后,经测试,不加 top 10的话很快,加了top 10很慢,为什么呢??
楠_ 2012-07-17
  • 打赏
  • 举报
回复
select top 10 cID,cName ,cModel From Table2 B where cName like '%三槽式冷热冲击试验箱%'
这样只要找出满足条件的 10 条就不找了,如果不加,就把所有的满足条件的数据都找出来。如果此表数据量大,有上百万的话,就慢了。
楠_ 2012-07-17
  • 打赏
  • 举报
回复
快了吗
松树林 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

如果你只取 top 10的话
这样应该更快
Select top 10 A.*, B.cName as cInstrName, B.cModel
From Table1 A
Inner Join (select top 10 cID,cName ,cModel From Table2 B where cName like '%三槽式冷热冲击试验箱%' ) on A.cInstrID……
[/Quote]


为什么?
天-笑 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 4 楼 的回复:

Select top 10 A.*, B.cName as cInstrName, B.cModel
From Table1 A
Inner Join (select cID,cName ,cModel From Table2 B where cName like '%三槽式冷热冲击试验箱%' ) on A.cInstrID = B.cID


快了很多,现……
[/Quote]

inner join 不能返回Table1 的所有记录(只返回 Table1 与Table2 的交集)
left join 将返回table1 的所有记录以及满足条件的 Table2记录
楠_ 2012-07-17
  • 打赏
  • 举报
回复
如果你只取 top 10的话
这样应该更快
Select top 10 A.*, B.cName as cInstrName, B.cModel
From Table1 A
Inner Join (select top 10 cID,cName ,cModel From Table2 B where cName like '%三槽式冷热冲击试验箱%' ) on A.cInstrID = B.cID
夜予 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
什么时候用inner join ,什么是用left join
[/Quote]
参考:http://topic.csdn.net/t/20030704/15/1990936.html
楠_ 2012-07-17
  • 打赏
  • 举报
回复
你要知道 inner join 、left join 、还有where 里的 in、exists 等之单的区别,
也就是它们判断的原理。什么时候用什么取决于你表的设计,还有表里有多少条数据等。
说用什么好,没有绝对的。
松树林 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

Select top 10 A.*, B.cName as cInstrName, B.cModel
From Table1 A
Inner Join (select cID,cName ,cModel From Table2 B where cName like '%三槽式冷热冲击试验箱%' ) on A.cInstrID = B.cID
[/Quote]

快了很多,现在问题变成:什么时候用inner join ,什么是用left join ???
楠_ 2012-07-17
  • 打赏
  • 举报
回复
Select top 10 A.*, B.cName as cInstrName, B.cModel
From Table1 A
Inner Join (select cID,cName ,cModel From Table2 B where cName like '%三槽式冷热冲击试验箱%' ) on A.cInstrID = B.cID
松树林 2012-07-17
  • 打赏
  • 举报
回复
后来发现:B.cName like '%三槽式冷热冲击试验箱%',如果是有记录的,会很快,求高手答疑??
松树林 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

SQL code

--试下这样查 是不是快点?
Select top 10 A.*, B.cName as cInstrName, B.cModel
From Table1 A
Left Join Table2 B on A.cInstrID = B.cID
where B.cName like '%三槽式冷热冲击试验箱%'
[/Quote]

没分别
天-笑 2012-07-17
  • 打赏
  • 举报
回复

--试下这样查 是不是快点?
Select top 10 A.*, B.cName as cInstrName, B.cModel
From Table1 A
Left Join Table2 B on A.cInstrID = B.cID
where B.cName like '%三槽式冷热冲击试验箱%'

22,210

社区成员

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

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