很奇怪的问题 困扰我很久了

zxkid 2009-03-24 10:09:03
一条SQL语句在SQL Server 2005的Managment Studio中执行很快(0-1秒)的时间,在.net应用程序中却要5-6分钟才出来
返回的结果也就4000条行,SQL Server Profiler跟踪的结果是执行下面的SQL花了很长时间
请各位高手帮我看看,SQL Server的版本2005企业版SP2,硬件是双4核CPU,16G内存

EXEC sp_executesql
N'SELECT i.DataAreaId, i.ItemId, q.ConfigId, c.ItemStatus
, q.InventQty, imi.UnitId, imp.DeliveryTime
, ItemType = e1.ElementNameENG, i.ItemGroupId
, i.ItemCategory, i.ItemName
, ItemBuyer = eb.Name, ItemSouring = es.Name
, i.PrimaryVendorId, VendorName = v.Name
FROM AX4.dbo.InventTable i
INNER JOIN AX4.dbo.DataAreaCompany y
ON y.DataArea = i.DataAreaId
INNER JOIN AX4.dbo.InventTableModule imi
ON imi.ItemId = i.ItemId
AND imi.ModuleType = 0
AND imi.DataAreaId = i.DataAreaId
INNER JOIN AX4.dbo.InventTableModule imp
ON imp.ItemId = i.ItemId
AND imp.ModuleType = 1
AND imp.DataAreaId = i.DataAreaId
INNER JOIN dbo.AxEnum e1
ON e1.EnumName = N''ItemType''
AND e1.ElementValue = i.ItemType
LEFT JOIN
(
SELECT s.DataAreaId, s.ItemId, d.ConfigId
, InventQty = CAST(CAST(SUM(CASE WHEN d.InventLocationId = N''MRB'' THEN 0 ELSE s.PhysicalInvent END) AS NUMERIC(20, 2)) AS FLOAT)
FROM AX4.dbo.InventSum s
INNER JOIN AX4.dbo.InventDim d
ON d.InventDimId = s.InventDimId
AND d.DataAreaId = s.DataAreaId
WHERE s.Closed = 0
GROUP BY s.DataAreaId, s.ItemId, d.ConfigId
HAVING SUM(s.PhysicalInvent) <> 0
) q
ON i.ItemId = q.ItemId
AND i.DataAreaId = q.DataAreaId
LEFT JOIN AX4.dbo.ConfigTable c
ON c.ItemId = q.ItemId
AND c.ConfigId = q.ConfigId
AND c.DataAreaId = q.DataAreaId
LEFT JOIN AX4.dbo.VendTable v
ON v.AccountNum = i.PrimaryVendorId
AND v.DataAreaId = i.DataAreaId
LEFT JOIN AX4.dbo.EmplTable eb
ON eb.EmplId = i.ItemBuyerGroupId
AND eb.DataAreaId = i.DataAreaId
LEFT JOIN AX4.dbo.EmplTable es
ON es.EmplId = i.Souring
AND es.DataAreaId = i.DataAreaId
WHERE i.ItemType <> 3
AND i.DataAreaId = @Company
AND i.ItemId = ISNULL(@ItemId, i.ItemId)
AND CASE WHEN @ItemId IS NULL AND q.InventQty IS NULL THEN 0 ELSE 1 END = 1
ORDER BY i.DataAreaId, i.ItemId, q.ConfigId', N'@Company nvarchar(3), @ItemId nvarchar(60)'
, @Company = N'itc', @ItemId = null
...全文
202 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
dtxh168 2009-04-02
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zxkid 的回复:]
今天 我又仔细研究了一下
在SQL Server 2005 Profiler中我发现一条SELECT SQL如果使用参数,其EventClass为RPC(远程过程调用),其执行效率非常慢
如果不使用参数,则EventClass为SQL,执行速度与Managment Studio一样快

所以我.net应用程序中把这条SQL的参数去掉,速度就正常了
给各位使用.net做开发的兄弟提个醒,能不用参数就尽量不用参数
[/Quote]
收到,谢谢分享
jixiaojie 2009-04-02
  • 打赏
  • 举报
回复
这几天发现了sql2005 的新问题:
如果一个字段是char类型(PK,簇索引),值的长度等于字段定义的长度
比如:Userid char(18) 每个userid 都有18位,
如果用这样的查询,最后一个值是9:
select * from Users where Userid = N'000301010000000029'
就非常慢,最后一个值是1-8 就没事

一些资料:
http://weblogs.sqlteam.com/mladenp/archive/2008/07/14/SQL-Server-2005-bug-when-using-LIKE-searches.aspx
zxkid 2009-03-26
  • 打赏
  • 举报
回复
另一篇
http://support.microsoft.com/kb/912322/en-us

说是打开跟踪标志 840:
DBCC TRACEON (840,-1)
zxkid 2009-03-26
  • 打赏
  • 举报
回复
找到一篇相关的文章
http://support.microsoft.com/kb/942659/en-us

但是我本机的SQL Server 2005升级到了SP3 如果程序中用了参数,速度还是一样的慢
Teng_s2000 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Study_Work_2009 的回复:]
在。net环境中,存储过程的效率很低哦
[/Quote]
比sql语句还低?有过测试吗?
sdhdy 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zxkid 的回复:]
虽然已经找到原因,但是RPC调用也不应该这样慢的,不知道服务器上是那儿没设置好
毕竟不用参数也不是长久之计
[/Quote]
对呀,不可能不用参数的。
wsxcdx 2009-03-26
  • 打赏
  • 举报
回复
up
zxkid 2009-03-26
  • 打赏
  • 举报
回复
虽然已经找到原因,但是RPC调用也不应该这样慢的,不知道服务器上是那儿没设置好
毕竟不用参数也不是长久之计
ljluck7687 2009-03-25
  • 打赏
  • 举报
回复
我觉得还是设法优化语句最重要
zxkid 2009-03-25
  • 打赏
  • 举报
回复
对了再说一下
如果改成存储过程 在程序中还是传递参数的话 速度是一样慢的
dawugui 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zxkid 的回复:]
今天 我又仔细研究了一下
在SQL Server 2005 Profiler中我发现一条SELECT SQL如果使用参数,其EventClass为RPC(远程过程调用),其执行效率非常慢
如果不使用参数,则EventClass为SQL,执行速度与Managment Studio一样快

所以我.net应用程序中把这条SQL的参数去掉,速度就正常了
给各位使用.net做开发的兄弟提个醒,能不用参数就尽量不用参数
[/Quote]
收到.
zxkid 2009-03-25
  • 打赏
  • 举报
回复
今天 我又仔细研究了一下
在SQL Server 2005 Profiler中我发现一条SELECT SQL如果使用参数,其EventClass为RPC(远程过程调用),其执行效率非常慢
如果不使用参数,则EventClass为SQL,执行速度与Managment Studio一样快

所以我.net应用程序中把这条SQL的参数去掉,速度就正常了
给各位使用.net做开发的兄弟提个醒,能不用参数就尽量不用参数
zhoulehua 2009-03-25
  • 打赏
  • 举报
回复
顶起来
shishui508 2009-03-25
  • 打赏
  • 举报
回复
建议从表数据分布来查找原因.以便确定每次执行是seek还是scan
加option(recompile)试试
将每次参数进来的SQL缓存去掉
interfacejava 2009-03-24
  • 打赏
  • 举报
回复
Study_Work_2009 2009-03-24
  • 打赏
  • 举报
回复
在。net环境中,存储过程的效率很低哦
viva369 2009-03-24
  • 打赏
  • 举报
回复
Managment Studio查询的时候是否已经有缓存了
或者.net应用程序查询时被堵塞
ws_hgo 2009-03-24
  • 打赏
  • 举报
回复
要么换成存储过程
要么换成C#
你这样效率超低
zxkid 2009-03-24
  • 打赏
  • 举报
回复
Profiler跟踪的结果大概是read次数有10多万次,持续时间很长1000多秒
加载更多回复(2)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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