关于多表关联查询优化的问题

piao2004 2017-02-05 09:45:29
比如有两个表,
一个是操作记录表
一个是用户表。

操作记录表中,记录用户的操作,【其中用一个字段UserID来保存操作者(即用户)的ID】
我的查询语句是这样的:

select top 20 a.*, u.Name from 操作表 a JOIN 用户表 u on a.UserID=u.ID order by a.ID desc
(则读取最新的20条操作记录,连同操作者的姓名同是给读出来)

这样是没有问题的。
但是,当操作表数据行多到百万级时,问题来了。
【操作表已对需要查询的列创建了索引】
【用户表由于只有几十人,没有建索引】
执行上面那条语句就变得很慢!(10多20秒!)

如果我只读取操作表:
select top 20 a.* from 操作表 a order by a.ID desc
那很快,毫秒级

那么,一定要把用户姓名读出来啊,我换了另外两种写法,一定很快,毫秒级:
select top 20 a.*, u.Name from 操作表 a LEFT JOIN 用户表 u on a.UserID=u.ID order by a.ID desc
【就是把很慢的JOIN改为LEFT JOIN,就变得很快了】

如果下面这样写,也是快得不要不要的
select top 20 a.*, u.Name from 操作表 a, 用户表 u where a.UserID=u.ID order by a.ID desc

为什么只用JOIN的写法会很慢啊?
只想知道原因。

...全文
318 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Andy-W 2017-02-06
  • 打赏
  • 举报
回复
看样子是SQL SERVER执行计划问题。 查看执行计划,对比各种写法的执行计划,内部使用的物理运算方法不同,那么会导致查询性能不同,如index scan和index seek性能就会有差异。
xiaoxiangqing 2017-02-06
  • 打赏
  • 举报
回复
这个跟用户表没有建索引有关,具体看下执行计划就知道了。
0与1之间 2017-02-06
  • 打赏
  • 举报
回复
这个和你表的数据大小也有一定的关系,具体的看看执行计划吧
卖水果的net 版主 2017-02-05
  • 打赏
  • 举报
回复
楼主贴一下执行计划吧。 第一种和第三种,应该是一样的; 另外,把索引情况也说一下
二月十六 版主 2017-02-05
  • 打赏
  • 举报
回复
这个和表中的数据有关系,两个表共有部分较多的,left join要快,如果共有部分少的话inner join 快,因为inner join 会忽略共有部分,另外你也可以看看执行计划

34,594

社区成员

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

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