sql server执行存储过程第一次时间长的原因是?

时间:2021-10-15 17:45:50
sql server执行存储过程第一次时间很长,但是执行第二次就快了很多,这个难道是和内存有关系吗?
求具体的原理?

3 个解决方案

#1


lz这个问题,需要看具体环境条件。 

1、没有资源的阻塞,锁定等,可以考虑是否有recompile的过程。
2、是否有对应的数据结构变化,比如索引重建等。
3、内存中预读是一直存在,还是刚刚用上? (重启机器后首次)

这些条件确定了,才好继续往后面查。

#2


因为第2次执行时,所需的数据都已经载入内存中,不需要物理I/O读取数据了.

LZ可以试试: 在第1次执行完成后,执行一下DBCC DROPCLEANBUFFERS,第2次执行也要第1次的时间了.

#3


 

执行存储过程的时候会存在三个过程,即分析,编译,执行

分析阶段:分析是否有语法错误
编译:主要分析存储过程引用的对象是否存在,分析连接的方式,应该是该使用哪种索引最好,是否使用并行查询等,然后生成执行计划,
最后一个阶段就是执行阶段了 ,

sqlserver生成执行计划后会将执行计划存储在内存中,以便下次执行相同存储过程的时候不需要再去编译存储过程,

所以在你第一次执行存储过程的时候时间要长是很正常的事,这一点跟内存没有什么关系的 

#1


lz这个问题,需要看具体环境条件。 

1、没有资源的阻塞,锁定等,可以考虑是否有recompile的过程。
2、是否有对应的数据结构变化,比如索引重建等。
3、内存中预读是一直存在,还是刚刚用上? (重启机器后首次)

这些条件确定了,才好继续往后面查。

#2


因为第2次执行时,所需的数据都已经载入内存中,不需要物理I/O读取数据了.

LZ可以试试: 在第1次执行完成后,执行一下DBCC DROPCLEANBUFFERS,第2次执行也要第1次的时间了.

#3


 

执行存储过程的时候会存在三个过程,即分析,编译,执行

分析阶段:分析是否有语法错误
编译:主要分析存储过程引用的对象是否存在,分析连接的方式,应该是该使用哪种索引最好,是否使用并行查询等,然后生成执行计划,
最后一个阶段就是执行阶段了 ,

sqlserver生成执行计划后会将执行计划存储在内存中,以便下次执行相同存储过程的时候不需要再去编译存储过程,

所以在你第一次执行存储过程的时候时间要长是很正常的事,这一点跟内存没有什么关系的