小弟不才 有个sql

qq_30335331 2021-05-12 07:22:47
SET STATISTICS PROFILE ON
SET STATISTICS TIME ON
SET STATISTICS IO ON

SELECT Convert(bit,0) Selected,m1.MonthCode,m1.CusId,c.TaskId,m1.LastAmt,m1.DNAmt,m1.DNReAmt,
m1.CusPayAmt,m1.AdjustAmt,m1.CurAmt,CASE WHEN m1.DNAmt+m1.DNReAmt=0 THEN 1 ELSE ISNULL(1 - ROUND(isnull(md.FDAmt,0) / (m1.DNAmt + m1.DNReAmt), 2), 1) END CusDiscount,
1-(case when m1.DNAmt=0 then 0 else (isnull(md2.RAdjustAmt,0)+m1.DNReAmt*-1 /* //注释不要删+isnull(md3.RAdjustAmt,0)*/)/m1.DNAmt end) SalesProb,a.AccType,a.AccNum,a.InterestType,a.InterestNum
FROM dbo.MonthBalance m1
LEFT OUTER JOIN dbo.SalesPersonMonthDetail sm ON sm.MonthCode = m1.MonthCode and m1.CusId=sm.CusId
left outer join Customer c on c.CusId=m1.CusId
left OUTER join (select MonthCode,CusId,isnull(sum(DNAmt)*-1.0,0) FDAmt from MonthDetail2 where PayName='优惠' and Category=3 group by MonthCode,CusId) md on md.MonthCode=m1.MonthCode and md.CusId=m1.CusId
left outer join (select MonthCode,CusId,isnull(sum(DNAmt)*-1.0,0) RAdjustAmt from MonthDetail2 where Category=3 group by MonthCode,CusId) md2 on md2.MonthCode=m1.MonthCode and md2.CusId=m1.CusId
-- left outer join (select MonthCode,CusId,isnull(sum(DNAmt),0) RAdjustAmt from MonthDetail2 where Category=4 and DNAmt>0 group by MonthCode,CusId) md3 on md3.MonthCode=m1.MonthCode and md3.CusId=m1.CusId
left outer join AccountSet a on a.CusId=m1.CusId
WHERE isnull(sm.MonthCode,'0')='0' and m1.MonthCode like '2021-03%' order by CusId

SET STATISTICS TIME OFF
SET STATISTICS IO OFF
SET STATISTICS PROFILE OFF



where条件中的monthcode like 分别为 %x%和 x% 测试


SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(692 行受影响)
表 'MonthDetail2'。扫描计数 699,逻辑读取 16102548 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Customer'。扫描计数 0,逻辑读取 1384 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'SalesPersonMonthDetail'。扫描计数 0,逻辑读取 1384 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'MonthBalance'。扫描计数 7,逻辑读取 687 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'AccountSet'。扫描计数 0,逻辑读取 1384 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(28 行受影响)

SQL Server 执行时间:
CPU 时间 = 133206 毫秒,占用时间 = 25037 毫秒。



SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(692 行受影响)
表 'MonthDetail2'。扫描计数 14,逻辑读取 46472 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Customer'。扫描计数 0,逻辑读取 1384 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'SalesPersonMonthDetail'。扫描计数 0,逻辑读取 1384 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'MonthBalance'。扫描计数 7,逻辑读取 687 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'AccountSet'。扫描计数 0,逻辑读取 1384 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(30 行受影响)

SQL Server 执行时间:
CPU 时间 = 436 毫秒,占用时间 = 83 毫秒。


为何影响的是monthdetail2表 这个表确实是没有索引 我也未建索引测试结果 恳请各位分析一波
网上能搜索到的结论都是 走不走MonthBalance的索引 我属实懵逼了
...全文
146 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengangcsdn 2021-05-13
  • 打赏
  • 举报
回复
要贴执行计看,可以看一下关联表的连接顺序以及所有的联接算法
RINK_1 2021-05-12
  • 打赏
  • 举报
回复
估计是因为%x%导致MonthBalance没走索引,而MonthBalance和monthdetail2的衍生表是通过MonthCode关联的,所以最终导致monthdetail2逻辑读取多了很多。 看看执行计划有什么不同

22,302

社区成员

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

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