ADO.net超时,查询分析器很快的问题

来源:互联网  责任编辑:小易  时间:2017/5/26 23:00:01
本网有用户碰到这样的问题:ADO.net超时,查询分析器很快的问题,具体问题如下:

本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:

=================1楼=====================

既然查询分析器很快,那么你在调试时。执行完sql后,返回结果快吗?

还有,数据库连接字符串,和你直接执行sql的数据库,是同一个吗?

=================2楼=====================

引用 1 楼 hanjun0612 的回复:
既然查询分析器很快,那么你在调试时。执行完sql后,返回结果快吗?

还有,数据库连接字符串,和你直接执行sql的数据库,是同一个吗?


一个update,没有返回。

数据库连接字符串一模一样。

=================3楼=====================

引用 2 楼 yuwenge 的回复:
Quote: 引用 1 楼 hanjun0612 的回复:

既然查询分析器很快,那么你在调试时。执行完sql后,返回结果快吗?

还有,数据库连接字符串,和你直接执行sql的数据库,是同一个吗?


一个update,没有返回。

数据库连接字符串一模一样。

你可以逐步调试,看代码中excute你的sql是不是速度也很快。然后看看到底是哪里耗时比较长

=================4楼=====================

引用 3 楼 hanjun0612 的回复:
Quote: 引用 2 楼 yuwenge 的回复:

Quote: 引用 1 楼 hanjun0612 的回复:

既然查询分析器很快,那么你在调试时。执行完sql后,返回结果快吗?

还有,数据库连接字符串,和你直接执行sql的数据库,是同一个吗?


一个update,没有返回。

数据库连接字符串一模一样。

你可以逐步调试,看代码中excute你的sql是不是速度也很快。然后看看到底是哪里耗时比较长

调试了,就是代码中excute我的SQL超时,执行完要超过30s,而查询分析器为0秒。

=================5楼=====================

不应该啊。你跨库操作了吗?

=================6楼=====================

引用 5 楼 hanjun0612 的回复:
不应该啊。你跨库操作了吗?


没有,而且只对一张表操作,操作数据只有2000行

=================7楼=====================


 declare @FilterType nvarchar
 set @FilterType='1'
 update TipsterFilterObject set CalculatePoints=
 iif((select STDEV(hitrate) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType )=0,0, 0.3*1000*(hitrate-(select AVG(hitrate) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(hitrate) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))
 +iif((select STDEV(profit) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.3*1000*(profit-(select AVG(profit) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(profit) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))
 +iif((select STDEV(profitbillity) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.1*1000*(profitbillity-(select AVG(profitbillity)  from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(profitbillity)  from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))
 +iif((select STDEV(tipscount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.1*1000*(tipscount-(select AVG(tipscount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(tipscount) from TipsterFilterObject with(NOLOCK) where  FilterType=@FilterType))
 +iif((select STDEV(redtimescount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.2*1000*(redtimescount-(select AVG(redtimescount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(redtimescount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)) where  FilterType=@FilterType


脚本如上,NOLOCK是后加的,然并卵。

=================8楼=====================

将这段sql作为存储过程,然后程序里执行存储过程。

=================9楼=====================

excute只支持单条命令,而你的语句时批处理的。
所以应该 调用存储过程 的方式来执行

=================10楼=====================

ADO.NET 改用调存储过程

=================11楼=====================

https://lostechies.com/jimmybogard/2012/07/18/troubleshooting-sql-index-performance-on-varchar-columns/
估计你就是因为类似这种的隐式转换问题吧
我反正就碰到过数据库是Varchar,我指定的param参数是String,也就是NVarchar,然后查询起码也有1分钟的样子,而在查询分析器里面就是秒查,改成一致后,查询就秒查了

=================12楼=====================

sqlhelper底层那块应该有点问题。看看是否close了,实在测试不出来,就先不用你们的底层,自己简单的update下,看看执行效率如何。

=================13楼=====================

引用 11 楼 starfd 的回复:
https://lostechies.com/jimmybogard/2012/07/18/troubleshooting-sql-index-performance-on-varchar-columns/
估计你就是因为类似这种的隐式转换问题吧
我反正就碰到过数据库是Varchar,我指定的param参数是String,也就是NVarchar,然后查询起码也有1分钟的样子,而在查询分析器里面就是秒查,改成一致后,查询就秒查了


我的其实是int。。。无论改什么都一样。

=================14楼=====================

引用 10 楼 Chinajiyong 的回复:
ADO.NET 改用调存储过程


改成存储过程之后,在查询分析器里执行存储过程都需要30s了。

=================15楼=====================

你说的查询分析器是指?你这个毫秒级不靠谱吧。

=================16楼=====================

引用 15 楼 D56233577 的回复:
你说的查询分析器是指?你这个毫秒级不靠谱吧。


就是 Microsoft SQL Server Management Studio

毫秒级就是执行时间显示0s

=================17楼=====================

引用 16 楼 yuwenge 的回复:
就是 Microsoft SQL Server Management Studio
毫秒级就是执行时间显示0s


你用ADO.NET执行SELECT NEWID()多久返回?

=================18楼=====================

引用 17 楼 D56233577 的回复:
Quote: 引用 16 楼 yuwenge 的回复:

就是 Microsoft SQL Server Management Studio
毫秒级就是执行时间显示0s


你用ADO.NET执行SELECT NEWID()多久返回?

秒回。

=================19楼=====================

引用 7 楼 yuwenge 的回复:

 declare @FilterType nvarchar
 set @FilterType='1'
 update TipsterFilterObject set CalculatePoints=
 iif((select STDEV(hitrate) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType )=0,0, 0.3*1000*(hitrate-(select AVG(hitrate) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(hitrate) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))
 +iif((select STDEV(profit) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.3*1000*(profit-(select AVG(profit) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(profit) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))
 +iif((select STDEV(profitbillity) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.1*1000*(profitbillity-(select AVG(profitbillity)  from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(profitbillity)  from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))
 +iif((select STDEV(tipscount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.1*1000*(tipscount-(select AVG(tipscount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(tipscount) from TipsterFilterObject with(NOLOCK) where  FilterType=@FilterType))
 +iif((select STDEV(redtimescount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.2*1000*(redtimescount-(select AVG(redtimescount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(redtimescount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)) where  FilterType=@FilterType


脚本如上,NOLOCK是后加的,然并卵。


这么多个子查询?我从来没见过程序员能写出这么糟糕的 sql,你是怎么做的?

=================20楼=====================

你就看看你有多少个“from TipsterFilterObject where FilterType=@FilterType”吧!

还有,谁告诉你说可以滥用“with (nolock)”的了?

=================21楼=====================

引用 20 楼 sp1234 的回复:
你就看看你有多少个“from TipsterFilterObject where FilterType=@FilterType”吧!
还有,谁告诉你说可以滥用“with (nolock)”的了?


DECLARE @FilterType NVARCHAR
SET @FilterType = '1'
;WITH t AS (
SELECT 
STDEV(hitrate) AS hitrate_STDEV
,AVG(hitrate)AS hitrate_AVG
,STDEV(profit) AS profit_STDEV
,AVG(profit)AS profit_AVG
,STDEV(profitbillity) AS profitbillity_STDEV
,AVG(profitbillity)AS profitbillity_AVG
,STDEV(tipscount) AS tipscount_STDEV
,AVG(tipscount)AS tipscount_AVG
,STDEV(redtimescount) AS redtimescount_STDEV
,AVG(redtimescount)AS redtimescount_AVG
   FROM   TipsterFilterObject
   WHERE  FilterType         = @FilterType
)
UPDATE TipsterFilterObject
SET    CalculatePoints = IIF(t.hitrate_STDEV= 0,0, 0.3 * 1000 * ( hitrate -t.hitrate_AVG) / t.hitrate_STDEV)
       + IIF(t.profit_STDEV= 0,0, 0.3 * 1000 * ( profit -t.profit_AVG) / t.profit_STDEV)
       + IIF(t.profitbillity_STDEV= 0,0, 0.1 * 1000 * ( profitbillity - t.profitbillity_AVG) / t.profitbillity_STDEV)
       + IIF(t.tipscount_STDEV= 0,0, 0.1 * 1000 * ( tipscount -t.tipscount_AVG) / t.tipscount_STDEV)
       + IIF(t.redtimescount_STDEV= 0,0, 0.2 * 1000 * ( redtimescount -t.redtimescount_AVG) / t.redtimescount_STDEV)
FROM t
WHERE  FilterType= @FilterType

楼主换这个试试

=================22楼=====================

引用 19 楼 sp1234 的回复:
Quote: 引用 7 楼 yuwenge 的回复:


 declare @FilterType nvarchar
 set @FilterType='1'
 update TipsterFilterObject set CalculatePoints=
 iif((select STDEV(hitrate) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType )=0,0, 0.3*1000*(hitrate-(select AVG(hitrate) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(hitrate) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))
 +iif((select STDEV(profit) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.3*1000*(profit-(select AVG(profit) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(profit) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))
 +iif((select STDEV(profitbillity) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.1*1000*(profitbillity-(select AVG(profitbillity)  from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(profitbillity)  from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))
 +iif((select STDEV(tipscount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.1*1000*(tipscount-(select AVG(tipscount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(tipscount) from TipsterFilterObject with(NOLOCK) where  FilterType=@FilterType))
 +iif((select STDEV(redtimescount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)=0,0, 0.2*1000*(redtimescount-(select AVG(redtimescount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType))/(select STDEV(redtimescount) from TipsterFilterObject with(NOLOCK) where FilterType=@FilterType)) where  FilterType=@FilterType


脚本如上,NOLOCK是后加的,然并卵。


这么多个子查询?我从来没见过程序员能写出这么糟糕的 sql,你是怎么做的?


因为整张表只有2000行数据,所以就这么写的。

大婶还是一如既往的光埋汰人,不帮助解决实际问题啊。后来改了with as ,也木有什么卵用。

=================23楼=====================

引用 21 楼 yenange 的回复:
Quote: 引用 20 楼 sp1234 的回复:

你就看看你有多少个“from TipsterFilterObject where FilterType=@FilterType”吧!
还有,谁告诉你说可以滥用“with (nolock)”的了?


DECLARE @FilterType NVARCHAR
SET @FilterType = '1'
;WITH t AS (
SELECT 
STDEV(hitrate) AS hitrate_STDEV
,AVG(hitrate)AS hitrate_AVG
,STDEV(profit) AS profit_STDEV
,AVG(profit)AS profit_AVG
,STDEV(profitbillity) AS profitbillity_STDEV
,AVG(profitbillity)AS profitbillity_AVG
,STDEV(tipscount) AS tipscount_STDEV
,AVG(tipscount)AS tipscount_AVG
,STDEV(redtimescount) AS redtimescount_STDEV
,AVG(redtimescount)AS redtimescount_AVG
   FROM   TipsterFilterObject
   WHERE  FilterType         = @FilterType
)
UPDATE TipsterFilterObject
SET    CalculatePoints = IIF(t.hitrate_STDEV= 0,0, 0.3 * 1000 * ( hitrate -t.hitrate_AVG) / t.hitrate_STDEV)
       + IIF(t.profit_STDEV= 0,0, 0.3 * 1000 * ( profit -t.profit_AVG) / t.profit_STDEV)
       + IIF(t.profitbillity_STDEV= 0,0, 0.1 * 1000 * ( profitbillity - t.profitbillity_AVG) / t.profitbillity_STDEV)
       + IIF(t.tipscount_STDEV= 0,0, 0.1 * 1000 * ( tipscount -t.tipscount_AVG) / t.tipscount_STDEV)
       + IIF(t.redtimescount_STDEV= 0,0, 0.2 * 1000 * ( redtimescount -t.redtimescount_AVG) / t.redtimescount_STDEV)
FROM t
WHERE  FilterType= @FilterType

楼主换这个试试


多谢,后来改了with as。但是之前加了几个索引之后,性能问题解决了。所以也不知道到底是with 起作用了,还是索引起作用了。

=================24楼=====================

引用 23 楼 yuwenge 的回复:
Quote: 引用 21 楼 yenange 的回复:

Quote: 引用 20 楼 sp1234 的回复:

你就看看你有多少个“from TipsterFilterObject where FilterType=@FilterType”吧!
还有,谁告诉你说可以滥用“with (nolock)”的了?


DECLARE @FilterType NVARCHAR
SET @FilterType = '1'
;WITH t AS (
SELECT 
STDEV(hitrate) AS hitrate_STDEV
,AVG(hitrate)AS hitrate_AVG
,STDEV(profit) AS profit_STDEV
,AVG(profit)AS profit_AVG
,STDEV(profitbillity) AS profitbillity_STDEV
,AVG(profitbillity)AS profitbillity_AVG
,STDEV(tipscount) AS tipscount_STDEV
,AVG(tipscount)AS tipscount_AVG
,STDEV(redtimescount) AS redtimescount_STDEV
,AVG(redtimescount)AS redtimescount_AVG
   FROM   TipsterFilterObject
   WHERE  FilterType         = @FilterType
)
UPDATE TipsterFilterObject
SET    CalculatePoints = IIF(t.hitrate_STDEV= 0,0, 0.3 * 1000 * ( hitrate -t.hitrate_AVG) / t.hitrate_STDEV)
       + IIF(t.profit_STDEV= 0,0, 0.3 * 1000 * ( profit -t.profit_AVG) / t.profit_STDEV)
       + IIF(t.profitbillity_STDEV= 0,0, 0.1 * 1000 * ( profitbillity - t.profitbillity_AVG) / t.profitbillity_STDEV)
       + IIF(t.tipscount_STDEV= 0,0, 0.1 * 1000 * ( tipscount -t.tipscount_AVG) / t.tipscount_STDEV)
       + IIF(t.redtimescount_STDEV= 0,0, 0.2 * 1000 * ( redtimescount -t.redtimescount_AVG) / t.redtimescount_STDEV)
FROM t
WHERE  FilterType= @FilterType

楼主换这个试试


多谢,后来改了with as。但是之前加了几个索引之后,性能问题解决了。所以也不知道到底是with 起作用了,还是索引起作用了。

可以删除索引, 再试下效果。
没事就结贴吧。

如果您还有更好的解决方法,请在最下面评论中留下您的解决方法


  • 本文相关:
  • 站长必读,如何真正写好一篇原创文章
  • 互联网之路细嗅蔷薇 资深站长分享掘金之道
  • 企业站的站长的工作重心究竟有哪些
  • 浅析:行业门户网站的一些盈利模式
  • 3000IP的企业网站每天订单不到30个的苦恼
  • 网站想内外兼修?先学习提高网站可用性的6大原则
  • 浅谈网页设计中的简约之美
  • 网页改版实战:日本设计师如何彻底优化旅游网站?
  • 网页改版实战!日本设计师如何彻底优化招聘网站?
  • 2015年值得关注的21个网页设计趋势
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2015 www.zgxue.com All Rights Reserved