启动后第一次运行带参数存储过程剧慢,但是第二次执行相同过程很快

tigerjacky 2006-08-04 03:44:45
见鬼了
在查询分析器里
启动SQL2000服务后第一次运行带参数存储过程剧慢,CPU SQLSERVER 占 99% 内存 150M 已经是上限了
但是第二次执行相同过程很快,CPU和内存都没有什么变化
1)存储过程是一个查询动态语句的过程,分页,数据量不会很大.表里不过10几条.
2)WIN2000+SP4+SQL2000+SP4
第一次的统计
------------------------------------------------------------------------
应用程序配置统计
计时器的分辨率(毫秒) 0 0
INSERT、UPDATE、DELETE 语句的数量 1 1
INSERT、UPDATE、DELETE 语句影响的行 56 56
SELECT 语句的数量 2 2
SELECT 语句影响的行 3 3
用户事务数 90 90
平均提取时间 0 0
累计的提取时间 0 0
提取数 0 0
打开的语句句柄数 0 0
打开的语句句柄的最大数 0 0
累计的语句句柄数 0 0

网络统计信息
服务器往返的次数 3 3
所发送的 TDS 数据包的数量 3 3
所接收的 TDS 数据包的数量 82 82
所发送的字节数 886 886
所接收的字节数 272367 272367

时间统计信息
客户端处理累计时间 5629 5629
服务器应答累计等待时间 2.39156e+007 2.39156e+007
--------------------------------------------------------------------------------------
第二次的统计
---------------------------------------------------------------------------------------
应用程序配置统计
计时器的分辨率(毫秒) 0 0
INSERT、UPDATE、DELETE 语句的数量 1 1
INSERT、UPDATE、DELETE 语句影响的行 56 56
SELECT 语句的数量 2 2
SELECT 语句影响的行 3 3
用户事务数 90 90
平均提取时间 0 0
累计的提取时间 0 0
提取数 0 0
打开的语句句柄数 0 0
打开的语句句柄的最大数 0 0
累计的语句句柄数 0 0

网络统计信息
服务器往返的次数 3 3
所发送的 TDS 数据包的数量 3 3
所接收的 TDS 数据包的数量 83 83
所发送的字节数 882 882
所接收的字节数 276883 276883

时间统计信息
客户端处理累计时间 37 37
服务器应答累计等待时间 163 163
---------------------------------------------------------------------------------------
...全文
509 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tigerjacky 2007-01-24
  • 打赏
  • 举报
回复
解决,揭帖.
xo_tobacoo 2006-08-06
  • 打赏
  • 举报
回复
可能是这个原因吧:
存储过程第一次运行时即将被编译,并保存在当前数据库的系统表中,编译存储过程时将优化选择访问表中信息的最佳路径.优化包括表的实际数据模型\有效索引\装载表等.这些编译存储过程可以提高系统的性能.

自动重新编译:
1)当SQL开始,通常是基本操作系统重起后和过程第一次执行时,过程总要被重新编译.
2)过程中引用的表索引删除后,自动重新编译过程的执行计划.
3)如果其他用户正在使用缓冲区的执行计划,那么编译也是对执行计划的重新初始化,将为第二个用户创建第二个执行计划.如果这时执行计划的第一个版本没有使用,那么将使用这个版本,而不是创建新的版本.过程结束后,其他用户可按相应的许可权限再次使用缓冲区执行计划.
4)过程删除或重建后,也将进行自动重新编译.

SQLserver总是试图将最近经常运行的进程调入缓冲区中,以优化存储过程,因而可能装入缓冲区的老的计划.为了避免因此发生错误,必须删除,然后重建过程,或者停止SQL server,然后重新启动,以便刷新过程缓冲区,确保过程执行时所使用的都是新过程.
OracleRoob 2006-08-06
  • 打赏
  • 举报
回复
存储过程在第一次执行时编译,并存储在过程高速缓存的内存中。
编译时系统对其进行优化,以选择最佳的路径来访问数据集中的数据,这种优化考虑了数据集的实际数据结构。
因此存储过程大大提高了系统的性能。
tigerjacky 2006-08-06
  • 打赏
  • 举报
回复
怎么说
realgz 2006-08-06
  • 打赏
  • 举报
回复
估计是数据缓存的问题, @i_ID 改变导致大量的io吧 。
tigerjacky 2006-08-06
  • 打赏
  • 举报
回复
我发现 只要我的传入参数改变了 比如 @i_ID = 1 改成 @i_ID = 2 就会很慢.
总不能一直这么慢啊.有没有什么解决的办法???
这和我在存储过程中使用动态SQL执行有什么必然的关系么?
请指教
昵称被占用了 2006-08-04
  • 打赏
  • 举报
回复
缓存的问题吧

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧