exec sp_executesql带参数比不带参数慢几十倍,怎么优化?

Anuohome 2012-02-15 10:12:12
exec sp_executesql N' SELECT BusinessDate,
BusinessHourName,
DiningTableName,
DepartmentName,
FoodName,
FoodNo,
Specification,
Price,
Quantity,
Dues4Food,
OrderDatetime,
OrdererName,
FoodTypeName ,
DepartmentNo,
FoodTypeNo
FROM Meal.V_AllOrderFoods
where
FoodTypeName LIKE @FoodTypeName and
OrderDatetime between @begintime and @endtime and
BusinessHourNo like @businessHourNo and
ordererNo like @ordererno
and DiningTableNo like @tableno
and FoodNo like @foodno
and DiningAreaName like @DiningAreaName
and IsCheckedOut = ''1''
Order by DepartmentNo,FoodTypeNo,FoodNo,OrderDatetime',N'@FoodTypeName varchar(20),@begintime datetime,@endtime datetime,@businessHourNo varchar(2),@ordererno varchar(5),@tableno varchar(5),@foodno varchar(8),@DiningAreaName nvarchar(20)',@FoodTypeName='%',@begintime='2012-01-01 00:00:00:000',@endtime='2012-02-15 23:59:00:000',@businessHourNo='%',@ordererno='%',@tableno='%',@foodno='%',@DiningAreaName=N'%'

比写成下面这样执行慢几十倍

exec sp_executesql N' SELECT BusinessDate,
BusinessHourName,
DiningTableName,
DepartmentName,
FoodName,
FoodNo,
Specification,
Price,
Quantity,
Dues4Food,
OrderDatetime,
OrdererName,
FoodTypeName ,
DepartmentNo,
FoodTypeNo
FROM Meal.V_AllOrderFoods
where
FoodTypeName LIKE ''%'' and
OrderDatetime between ''2012-01-01 00:00:00:000'' and ''2012-02-15 23:59:00:000'' and
BusinessHourNo like ''%'' and
ordererNo like ''%''
and DiningTableNo like ''%''
and FoodNo like ''%''
and DiningAreaName like ''%''
and IsCheckedOut = ''1''
Order by DepartmentNo,FoodTypeNo,FoodNo,OrderDatetime'

有什么设置可以提高传入参数的执行速度


...全文
374 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anuohome 2012-02-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qianjin036a 的回复:]

这个不是传入参数的问题,而是你用了 like 来模糊查询的问题.
你可以测试一下,把本应传入的参数作为一个值,直接放到 %%之间,你会发现,查询同样会很慢.
[/Quote]

测试了一下,并不慢
-晴天 2012-02-15
  • 打赏
  • 举报
回复
这个不是传入参数的问题,而是你用了 like 来模糊查询的问题.
你可以测试一下,把本应传入的参数作为一个值,直接放到 %%之间,你会发现,查询同样会很慢.
Anuohome 2012-02-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sql77 的回复:]

重编译执行计划.REPLINE
[/Quote]
参数是由客户端程序动态确定的
在什么时候重新编译执行计划?
怎样执行?
Anuohome 2012-02-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 acherat 的回复:]

每次运行都是那么慢么?
[/Quote]

每次都很慢

动态sql传入参数的需要执行5分多种

非传入参数2秒钟就能执行玩
AcHerat 2012-02-15
  • 打赏
  • 举报
回复
每次运行都是那么慢么?
SQL77 2012-02-15
  • 打赏
  • 举报
回复
重编译执行计划.REPLINE
Anuohome 2012-02-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 acherat 的回复:]

那把参数在前台拼接好字符串后在数据库中运行,直接执行一个string,不要再把参数带进去了。
[/Quote]

同样的动态sql,在有的sql数据库服务器执行是很快的,有的sql数据库服务器执行的慢
能帮忙分析一下什么原因吗?
Rock_Wu 2012-02-15
  • 打赏
  • 举报
回复
应该没有多大影响

是不是因为缓存,所以提高了速度了呀
AcHerat 2012-02-15
  • 打赏
  • 举报
回复
那把参数在前台拼接好字符串后在数据库中运行,直接执行一个string,不要再把参数带进去了。
Anuohome 2012-02-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acherat 的回复:]

写存储过程直接拼接字符串动态执行吧!
[/Quote]

动态sql是.net dataadapter 自动生成的,这种应用很多,没法所有用到dataadapter 的地方都用存储过程,还有需要update之类的功能
现在知道有的sql服务器执行是很快的,有的执行的慢
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acherat 的回复:]

写存储过程直接拼接字符串动态执行吧!
[/Quote]

create proc
AcHerat 2012-02-15
  • 打赏
  • 举报
回复
写存储过程直接拼接字符串动态执行吧!

22,209

社区成员

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

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