使用存储过程,但非常慢,帮忙看看

dgbuild 2008-11-19 11:39:30
MS SQL SERVER 2000

CREATE PROC SearchTomdb
@veh nvarchar(50),
@prov nvarchar(50)
AS
BEGIN
Select * From tomdb Where veh=@veh And prov=@prov Order By temp_date Desc
END
GO


使用存储过程执行时间:3,562.500 ms

直接运行SQL语句执行时间:593.750 ms

为什么会这样?
...全文
102 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
时光瞄 2008-11-20
  • 打赏
  • 举报
回复
我想问下8楼,输入参数引起选择性剧烈变化是什么意思?
-晴天 2008-11-20
  • 打赏
  • 举报
回复
存储过程有调用,编译,参数赋值等操作,而单一语句没有其中的一些操作,所以会慢一些.
但存储过程一次调用后,会保存编译内容于缓存中,再次调用时,会快很多,这是单一语句所不能比的.
不信,你调用一下,再调用一下,试试两次调用的时间差是多少.并与单一语句比较一下.
tangweikai 2008-11-20
  • 打赏
  • 举报
回复
感觉 [@veh nvarchar(50),] 也太长了些,不可能用这么长的主键吧..建议控制在 20左右,这直接影响电脑的工作效率吧..
等不到来世 2008-11-20
  • 打赏
  • 举报
回复
1.如果你的输入参数引起选择性剧烈变化,sql可能会选择一个不合适的计划来执行你的查询,反而降低性能。
此时可指定with recompile选项,不缓存查询计划。
CREATE PROC SearchTomdb
(
@veh nvarchar(50),
@prov nvarchar(50)
)
WITH RECOMPILE
AS
BEGIN
Select * From tomdb Where veh=@veh And prov=@prov Order By temp_date Desc
END
GO


2.注意参数@veh,@prov的类型和长度要和表中字段严格一致。
否则大数据量的查询中,隐式转换会损伤性能。
wjfmail 2008-11-20
  • 打赏
  • 举报
回复
建议修改where 条件的顺序,还可以增加索引或副索引.还有如果返回结果太多,建议分页查询.
yms_wangxm 2008-11-20
  • 打赏
  • 举报
回复
学习
zjybushiren88888 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qianjin036a 的回复:]
存储过程有调用,编译,参数赋值等操作,而单一语句没有其中的一些操作,所以会慢一些.
但存储过程一次调用后,会保存编译内容于缓存中,再次调用时,会快很多,这是单一语句所不能比的.
不信,你调用一下,再调用一下,试试两次调用的时间差是多少.并与单一语句比较一下.
[/Quote]

正解
dgbuild 2008-11-20
  • 打赏
  • 举报
回复
运行过好多次,没有低于1000 ms 以下的
oraclelogan 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qianjin036a 的回复:]
存储过程有调用,编译,参数赋值等操作,而单一语句没有其中的一些操作,所以会慢一些.
但存储过程一次调用后,会保存编译内容于缓存中,再次调用时,会快很多,这是单一语句所不能比的.
不信,你调用一下,再调用一下,试试两次调用的时间差是多少.并与单一语句比较一下.
[/Quote]

正解!
hyde100 2008-11-20
  • 打赏
  • 举报
回复
存储过程第一次运行需要编译花费时间,下一次就不需要了
keung_lan 2008-11-20
  • 打赏
  • 举报
回复
好奇,这种查询要求也需要动用存储过程?直接查询不行吗?

22,207

社区成员

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

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