小弟不才 有个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的索引 我属实懵逼了
...全文
71 点赞 收藏 2
写回复
2 条回复
chengangcsdn 05月13日
要贴执行计看,可以看一下关联表的连接顺序以及所有的联接算法
回复 点赞
RINK_1 05月12日
估计是因为%x%导致MonthBalance没走索引,而MonthBalance和monthdetail2的衍生表是通过MonthCode关联的,所以最终导致monthdetail2逻辑读取多了很多。 看看执行计划有什么不同
回复 点赞
发动态
发帖子
疑难问题
创建于2007-09-28

9308

社区成员

12.1w+

社区内容

MS-SQL Server 疑难问题
社区公告
暂无公告