大家有没有遇到这种情况

日月路明 2018-03-02 11:18:37
我最近做的KPI软件,从程序中发出KPI的统计命令,很多时候查询时间超过5分钟,导致超时失败(我们自己的系统设置5分钟超时),但是,抓到的脚本在查询分析器中执行,大约25秒就可以结束,这个问题已经困扰了两天,我现在想问的就是大家有没有遇到类似的问题,如果遇到是如何解决的,如果没遇到,就大胆的猜一下,到底是什么原因
...全文
1107 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mywisdom88 2018-03-09
  • 打赏
  • 举报
回复
在论坛上泡了这么久,经常看到大神说,查询时用到 or 时,效率很慢,说是无法利用所以. 楼主上面的这段查询,用了好几个 or ,可见效率很差吧. 论坛上的说,可以用 union all 来代替 or 从你下面的这段,把 y.DateID=d.DateID 改为 1=1,完全不同概念吧. y.DateID=d.DateID 是以ID来关联.而 1=1 好像是完全不需要关联哦 join dbo.Astat d on y.DateID=d.DateID 改写为 join dbo.Astat d on 1=1
日月路明 2018-03-09
  • 打赏
  • 举报
回复
如果有大侠愿意远程,我们约个时间,开QQ远程,帮我一块查找原因
日月路明 2018-03-09
  • 打赏
  • 举报
回复
我不能经常在线,我的手机号13236599580,原因帮忙的话,可以发短消息给我
日月路明 2018-03-09
  • 打赏
  • 举报
回复
感谢各位回复,这两天确定问题有两个原因 1.可能程序在查询的时候,数据库正在进行同步,也就是从其他机器上拉数据,io性能差 2.有一条语句特别奇怪,这条语句执行时间大约19秒,但是在同样的数据条件下,我只要该写一个等价的条件,就可以在3秒内完成,这个等价的条件只在特定数据下才等价,因此,实际环境下无法这样改写,具体是这样的:
select d.UID,y.KPIID,y.[Property],Val=sum(Val)
into #Val
  from dbo.AVal_1 y 
    join dbo.Astat d  on y.DateID=d.DateID
    join dbo.AEmpDep e on d.UID=e.UID and (y.EID=e.EmpID or e.EmpID=0) and (y.DID=e.DepID or e.DepID=0)
  group by d.UID,y.KPIID,y.[Property]

select d.UID,y.KPIID,y.[Property],Val=sum(Val)
into #Val
  from dbo.AVal_1 y 
    join dbo.Astat d  on 1=1
    join dbo.AEmpDep e on d.UID=e.UID and (y.EID=e.EmpID or e.EmpID=0) and (y.DID=e.DepID or e.DepID=0)
  group by d.UID,y.KPIID,y.[Property]
join dbo.Astat d on y.DateID=d.DateID 改写为 join dbo.Astat d on 1=1 就可以从19秒降低到3秒,在我测试的数据中,DateID只有一个值,因此,和1=1涉及到的数据完全相同, 忙了一个晚上,也没有更好的写法比较郁闷,事实上,动用索引,甚至聚簇索引,也没能改善
日月路明 2018-03-02
  • 打赏
  • 举报
回复
如果你遇到过,就说一下是如何解决的,没遇到的甚至不相信我说的现象,事实上,我自己这么多年也就遇到两次,这是第二次,第一次是数据库重建索引解决的,这一次屁用没有
日月路明 2018-03-02
  • 打赏
  • 举报
回复
我再补充一下,不需要考虑客户端的情况,因为从事件探查器看到,客户端发过来的就是执行很慢,事件探查器看到的执行时间和客户端无关,但我在查询分析器中执行就快,脚本不需要贴,没有分析的必要,就是形如:exec proc1 @p1=xxxx,@p2=xxxx,就是这种现象百思不得其解
  • 打赏
  • 举报
回复
mark一下,看看高手解答
日月路明 2018-03-02
  • 打赏
  • 举报
回复
存储过程,ADO连接
吉普赛的歌 2018-03-02
  • 打赏
  • 举报
回复
你们主要是用普通的SQL, 还是存储过程? 不用大胆猜, 就是参数嗅探
fengxiaohan211 2018-03-02
  • 打赏
  • 举报
回复
什么开发语言 怎么连接的数据库啊?
日月路明 2018-03-02
  • 打赏
  • 举报
回复
简单地说就是,同一段脚本,程序发出就很慢,查询分析器很快,超级郁闷的问题
OwenZeng_DBA 2018-03-02
  • 打赏
  • 举报
回复
@日月路明 #8楼 @_大约在冬季_ 的思路不错,我之前也遇到过挺多次这种情况,你可以尝试下。看看是不是参数嗅探的问题。
二月十六 2018-03-02
  • 打赏
  • 举报
回复
找个测试表,数据数量减少些,试试还有这个问题吗。 之前我遇到的就是数据量很小还有这个问题,程序超时,mssm里没问题,是因为用了链接服务器,然后程序上加了事务,导致失败。
吉普赛的歌 2018-03-02
  • 打赏
  • 举报
回复
引用 6 楼 yisuylm 的回复:
我再补充一下,不需要考虑客户端的情况,因为从事件探查器看到,客户端发过来的就是执行很慢,事件探查器看到的执行时间和客户端无关,但我在查询分析器中执行就快,脚本不需要贴,没有分析的必要,就是形如:exec proc1 @p1=xxxx,@p2=xxxx,就是这种现象百思不得其解
将存储过程加上WITH RECOMPILE:
CREATE PROC proc1 
WITH RECOMPILE	--加这里
AS
BEGIN
	SET NOCOUNT ON
	--
END
GO
再试下。 主要是因为数据分布不均匀和执行计划重用造成。

22,209

社区成员

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

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