SQL 2008 CTE 使用小结。原来CTE 没有Index。顺带问个问题。
标题有点夸张了。不过做了那么久,确实也是刚知道,所以上来通报一声。
本人因为平时写代码比较规范,一般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分钟,这个上面也浪费我不少时间。
有哪位高人知道是什么原因么?
本人因为平时写代码比较规范,一般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分钟,这个上面也浪费我不少时间。
有哪位高人知道是什么原因么?
...全文
相关推荐
sql server2008 参考资料.zip
sql server的一些讲义资料,资料较全面,有需要的开发者可以自行下载,希望能帮到大家,主要以讲义的形式进行学习
临床预测+医学RAG=结构化EHR建模能力+医学大模型应用能力(二)
临床预测建模的核心要素与队列定义 本文系统阐述了临床预测建模中三个核心要素:预测目标、观察窗口和研究人群的定义方法,并以ICU院内死亡预测为例进行说明。 关键要点: 预测建模的"铁三角"包括明确预测目标(如院内死亡)、设定观察窗口(如ICU入科后24小时)和严格定义研究人群(如首次ICU停留的成年患者)。 时间线设计需确保因果性,所有预测变量必须产生于预测时刻之前,避免数据泄漏。 队列定义需遵循TRIPOD声明,透明报告纳入排除标准,如排除年龄<18岁、ICU停留<24小时等病例。 具体实现通过SQL脚本(
Microsoft.Press.Inside.Microsoft.SQL.Server.2008.T-SQL.Programming
Microsoft.Press.Inside.Microsoft.SQL.Server.2008.T-SQL.Programming.Sep.2009.eBook 英文电子版
关系数据库标准语言SQL讲义
关系数据库标准语言SQL的幻灯片讲义 ppt
T-SQL工具书,要精通就看看吧
T-SQL


应用实例
