SQL server left join 优化

keflying 2017-07-23 10:43:01
select a.*,ISNULL(b.Detail,'') from User_ScoreRec a left join User_ScoreRec_Detail b on a.ID=b.ID and a.hadDetail = 0 where a.RecType = 2

(8 行受影响)
表 'User_ScoreRec_Detail'。扫描计数 1,逻辑读取 17 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'User_ScoreRec'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。


这条语句,子表User_ScoreRec_Detail 的连接前提是主表RecType = 2 。
虽然子表没有查到数据,还是有逻辑读取次数,这个如何优化呢。

表结构:


想问下是表的结构设计有问题,还是啥。
...全文
436 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
OwenZeng_DBA 2017-07-23
  • 打赏
  • 举报
回复
引用 楼主 keflying 的回复:
select a.*,ISNULL(b.Detail,'') from User_ScoreRec a left join User_ScoreRec_Detail b on a.ID=b.ID and a.hadDetail = 0 where a.RecType = 2 (8 行受影响) 表 'User_ScoreRec_Detail'。扫描计数 1,逻辑读取 17 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'User_ScoreRec'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 这条语句,子表User_ScoreRec_Detail 的连接前提是主表RecType = 2 。 虽然子表没有查到数据,还是有逻辑读取次数,这个如何优化呢。 表结构: 想问下是表的结构设计有问题,还是啥。
就这么点逻辑读,就不要想着优化了。不会有什么性能问题
shoppo0505 2017-07-23
  • 打赏
  • 举报
回复
先将a中符合条件的数据取出来: with data as (select * from User_ScoreRec a where a.RecType = 2) 然后再join b 但是这中也有一个缺点,就是当数据量大的时候,效率不高,因为CTS表格没有index。 不过可以使用带有index的表变量来解决问题。就是语句会复杂些。

22,209

社区成员

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

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