SQL 2008 CTE 使用小结。原来CTE 没有Index。顺带问个问题。

shoppo0505 shoppo0505 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
标题有点夸张了。不过做了那么久,确实也是刚知道,所以上来通报一声。

本人因为平时写代码比较规范,一般SQL语句都会尽可能简化,而且如果使用CTE,基本上不太会返回大量数据。昨天同事写了存储过程,执行时间竟然超过了10分钟,存储过程本省很简单,前面就是一些变量定义,然后就是使用了CTE语句,CTE返回结果在和5,6个表inner join连接, 表的数据量也就是1,2百万,不算很多。
按照以前的经验,这种语句应该是瞬秒的,但是这次需要这么长时间,肯定不正常。

给几个新表新添了几个Index,但是问题完全没有改善。然后根据自己精良简化语句的原则,改了一下Code,结合刚添加的index,存储过程一下变成瞬秒,执行时间为0秒。后来在网上查了一下,原来CTE没有index的。所以如果CTE返回百万级数据量,然后再和其他表格连接的话,那么超过10分钟的执行时间也是意料之中了。

旧代码 大致如下:
with tb as --返回百万级数据
(
select ...
)
select ...
from 表格1
inner join 表格2 --百万级数据
inner join 表格3 --百万级数据
inner join 表格4 --百万级数据
inner join tb
... --链接几个小数据表格
group by ...
order by ...
执行时间超过10分钟

新代码 大致如下:
with tb as --返回几时行数据
(
select ...
inner join 表格2 --百万级数据
inner join 表格3 --百万级数据
inner join 表格4 --百万级数据
)
select ...
from tb
inner join tb
... --链接几个小数据表格
group by ...
order by ...
执行时间0秒。

再提个问题
我将存储过程的旧代码直接在窗口中执行的话,执行时间大概45秒左右,但是如果作为存储过程,执行时间就超过10分钟,这个上面也浪费我不少时间。
有哪位高人知道是什么原因么?
...全文

相关推荐

评论 44
收藏 已收藏
分享
返回顶部
shoppo0505
应用实例 27,579 成员 68,540 内容