求具体的原理?
3 个解决方案
#1
lz这个问题,需要看具体环境条件。
1、没有资源的阻塞,锁定等,可以考虑是否有recompile的过程。
2、是否有对应的数据结构变化,比如索引重建等。
3、内存中预读是一直存在,还是刚刚用上? (重启机器后首次)
这些条件确定了,才好继续往后面查。
1、没有资源的阻塞,锁定等,可以考虑是否有recompile的过程。
2、是否有对应的数据结构变化,比如索引重建等。
3、内存中预读是一直存在,还是刚刚用上? (重启机器后首次)
这些条件确定了,才好继续往后面查。
#2
因为第2次执行时,所需的数据都已经载入内存中,不需要物理I/O读取数据了.
LZ可以试试: 在第1次执行完成后,执行一下DBCC DROPCLEANBUFFERS,第2次执行也要第1次的时间了.
LZ可以试试: 在第1次执行完成后,执行一下DBCC DROPCLEANBUFFERS,第2次执行也要第1次的时间了.
#3
执行存储过程的时候会存在三个过程,即分析,编译,执行
分析阶段:分析是否有语法错误
编译:主要分析存储过程引用的对象是否存在,分析连接的方式,应该是该使用哪种索引最好,是否使用并行查询等,然后生成执行计划,
最后一个阶段就是执行阶段了 ,
sqlserver生成执行计划后会将执行计划存储在内存中,以便下次执行相同存储过程的时候不需要再去编译存储过程,
所以在你第一次执行存储过程的时候时间要长是很正常的事,这一点跟内存没有什么关系的
#1
lz这个问题,需要看具体环境条件。
1、没有资源的阻塞,锁定等,可以考虑是否有recompile的过程。
2、是否有对应的数据结构变化,比如索引重建等。
3、内存中预读是一直存在,还是刚刚用上? (重启机器后首次)
这些条件确定了,才好继续往后面查。
1、没有资源的阻塞,锁定等,可以考虑是否有recompile的过程。
2、是否有对应的数据结构变化,比如索引重建等。
3、内存中预读是一直存在,还是刚刚用上? (重启机器后首次)
这些条件确定了,才好继续往后面查。
#2
因为第2次执行时,所需的数据都已经载入内存中,不需要物理I/O读取数据了.
LZ可以试试: 在第1次执行完成后,执行一下DBCC DROPCLEANBUFFERS,第2次执行也要第1次的时间了.
LZ可以试试: 在第1次执行完成后,执行一下DBCC DROPCLEANBUFFERS,第2次执行也要第1次的时间了.
#3
执行存储过程的时候会存在三个过程,即分析,编译,执行
分析阶段:分析是否有语法错误
编译:主要分析存储过程引用的对象是否存在,分析连接的方式,应该是该使用哪种索引最好,是否使用并行查询等,然后生成执行计划,
最后一个阶段就是执行阶段了 ,
sqlserver生成执行计划后会将执行计划存储在内存中,以便下次执行相同存储过程的时候不需要再去编译存储过程,
所以在你第一次执行存储过程的时候时间要长是很正常的事,这一点跟内存没有什么关系的