新足迹

 找回密码
 注册

精华好帖回顾

· 补习班颁奖之杂七杂八(2011年11月20日更新) (2009-11-22) patrickzhu · 中國文化澳洲行即將開幕 澳洲史上最大中國文化活動 (2006-1-15) horseanddragon
· 十年回首两茫茫,返澳半年找工经历回顾有感 (2009-4-17) 北雁南飞 · 跟风做辣椒酱---辣!辣!辣!!!!!!(多图详解) (2012-3-22) tina50
Advertisement
Advertisement
查看: 2823|回复: 46

Database tunning实际问题 - 86秒的查询 [复制链接]

发表于 2011-1-28 08:51 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
刚说完Database tunning, 就碰到个实际性能问题, 我们系统中一个查询耗时86秒, 这是一个web app中用到的查询, 这个Response Time是不能被接受的, 头疼在这个问题不是每次都出现。Developers测试时2秒内完成, 但Marketing team测试就是这么久。

这86秒是用profiler抓出来的, 这是用的是.net sqlClient Data Provider.
同样的sql statement用SSMS运行就只花2秒
不像是lock的问题, 没有什么对表的写操作。

这种情况, 足迹各位高手有没有什么idea? 会是什么原因造成的。
Advertisement
Advertisement

发表于 2011-1-28 09:05 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
看一下execution plan先
有其他什么同时运行吗?

发表于 2011-1-28 09:12 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
由于是live system, 其他的数据库操作肯定有

发表于 2011-1-28 09:16 |显示全部楼层
此文章由 teddymu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 teddymu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
maybe re-build the index or re-create the stats

发表于 2011-1-28 09:17 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
独立测试没问题,上prod有问题,有相当一部分是locking的问题,你怎么rule out lock的?

发表于 2011-1-28 09:19 |显示全部楼层
此文章由 HappyRain 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 HappyRain 所有!转贴必须注明作者、出处和本声明,并保持内容完整
关键是定位,有一种可能是查询本身没有问题,问题出在调用查询的代码哪部分。也就是为什么Marketing team在做集成测试时,点击按钮后,响应时间太长。可以把那个查询单独抓出来,在Marketing team的机器上运行,如果时间正常那就是application的调用查询的代码占用时间长。可以把时间点写在LOG里,逐步缩小范围。GOOD LUCK!

评分

参与人数 1积分 +2 收起 理由
混不到坑的萝卜 + 2 所见略同

查看全部评分

Advertisement
Advertisement

发表于 2011-1-28 09:21 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Run a new Trace for 2~4 hours
Save the result to a table
From there you may get some useful information

发表于 2011-1-28 09:25 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2011-1-28 10:17 发表
独立测试没问题,上prod有问题,有相当一部分是locking的问题,你怎么rule out lock的?


还没有完全rule out。只是和查询相关的table被modify的可能性很小。

发表于 2011-1-28 09:27 |显示全部楼层

还有可能就是connection pool

此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果你的app每次访问数据库都打开关闭connection也可能导致很长时间。检查你的connection pool设定。尽量使用pooled connections,如果大量connection同时被占用,需要考虑从新设计,尽量快地释放connection。没有write操作可以考虑尽量用sqlDataReader而不是SqlDataAdapter etc etc

发表于 2011-1-28 09:28 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 HappyRain 于 2011-1-28 10:19 发表
关键是定位,有一种可能是查询本身没有问题,问题出在调用查询的代码哪部分。也就是为什么Marketing team在做集成测试时,点击按钮后,响应时间太长。可以把那个查询单独抓出来,在Marketing team的机器上运行,如果时间正常那就是application的调用查询的代码占用时间长。可以把时间点写在LOG里,逐步缩小范围。GOOD LUCK!


developer team也是做集成测试, 响应很快。 不过你的建议也对, 要去他们机器上看看。

发表于 2011-1-28 09:28 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
“Developers测试时2秒内完成”
在dev还是live?
Advertisement
Advertisement

发表于 2011-1-28 09:29 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
What kinds of SQL version?
Are you using stored procs?

发表于 2011-1-28 09:31 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我觉得profile得到的86秒,所以应该不是app server的问题
问题你还是在你的database方面
1. 确定没有lock
2. execution plan

评分

参与人数 1积分 +3 收起 理由
flyspirit + 3 感谢分享

查看全部评分

发表于 2011-1-28 09:32 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果不是很经常的应用,你找一个不忙的时段,在prod上作一下profiler,里马能定位statement级别的问题,原来我经常这么干,到这个公司就严格很多,连prod pwd都没有 

发表于 2011-1-28 09:37 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 北风 于 2011-1-28 10:28 发表
“Developers测试时2秒内完成”
在dev还是live?


都是live system.

发表于 2011-1-28 09:41 |显示全部楼层

你这86秒和SSMS的2秒是怎么来的?

此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Profile上看Query Duration? 还是看End Time - Start Time?
Advertisement
Advertisement

发表于 2011-1-28 09:42 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 于 2011-1-28 10:29 发表
What kinds of SQL version?
Are you using stored procs?


SQL Server 2005

We using store procedure, but the statement is created on the fly.

发表于 2011-1-28 09:43 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 北风 于 2011-1-28 10:31 发表
我觉得profile得到的86秒,所以应该不是app server的问题
问题你还是在你的database方面
1. 确定没有lock
2. execution plan


请教用什么手段可以排除lock?

发表于 2011-1-28 09:43 |显示全部楼层
此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2011-1-28 09:42 发表
We using store procedure, but the statement is created on the fly.

你是说Stored proc里面用了dynamic sql吧?

发表于 2011-1-28 09:44 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 混不到坑的萝卜 于 2011-1-28 10:41 发表
Profile上看Query Duration? 还是看End Time - Start Time?


profiler 里面的duration.

发表于 2011-1-28 09:46 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 混不到坑的萝卜 于 2011-1-28 10:43 发表

你是说Stored proc里面用了dynamic sql吧?


对的, Something like

exec sp_executesql N'SELECT pd.ProductID AS ProductID124_0_, ....................

exec sq_executesql 里面都是dynamic sql.
Advertisement
Advertisement

发表于 2011-1-28 09:47 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2011-1-28 10:32 发表
如果不是很经常的应用,你找一个不忙的时段,在prod上作一下profiler,里马能定位statement级别的问题,原来我经常这么干,到这个公司就严格很多,连prod pwd都没有 


感觉被捆绑住了吧

发表于 2011-1-28 09:48 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
One thing you can try with the stored proc
Change the parametter
For example
Proc abc(p1 as varchar)

Change to:
Proc abc(temp_p1 as varchar)
declare p1 as varchar
set p1=temp_p1

-------

It's strange and hard to say why. Last time we fixed a similar problem by doing that.

----

But you say it's dynamic, it means a lot of re-compiling??
You can try this: Put some hints to avoid re-compiling

[ 本帖最后由 典 于 2011-1-28 09:51 编辑 ]

评分

参与人数 1积分 +3 收起 理由
flyspirit + 3 感谢分享

查看全部评分

发表于 2011-1-28 09:51 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整

评分

参与人数 2积分 +5 收起 理由
混不到坑的萝卜 + 2 你有不少好货么!
flyspirit + 3 我去看看

查看全部评分

发表于 2011-1-28 09:53 |显示全部楼层
此文章由 HappyRain 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 HappyRain 所有!转贴必须注明作者、出处和本声明,并保持内容完整
解决这种在开发环境和product环境运行时间长短不一致问题的关键是:找出两种环境的不同点。在这种情况下,我们通常会认为两个环境完全一样。实际上必定有不同点存在,否则也不会每次在develop环境下运行时间正常,而每次在product环境下运行时间就很长了。大体可以从软件环境和硬件(物理)环境两方面着手,比如网络、防火墙,系统服务等等,两种环境都完全一样吗?能不能找第3台机器再测一下? 列出一个软件和硬件的CHECK LIST,细心一点,一定会找到的。

这还有一个链接,希望能帮到你。Checklist for Analyzing Slow-Running Queries http://msdn.microsoft.com/en-us/library/ms177500.aspx

[ 本帖最后由 HappyRain 于 2011-1-28 10:58 编辑 ]

发表于 2011-1-28 09:53 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
About lock,
No writing dosn't mean No Locking,

评分

参与人数 1积分 +3 收起 理由
flyspirit + 3 有道理

查看全部评分

Advertisement
Advertisement

发表于 2011-1-28 10:01 |显示全部楼层
此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 于 2011-1-28 09:53 发表
No writing dosn't mean No Locking,


是呀,先用sp_who, sp_who2看看有没有哪些deadlock,缩小范围

评分

参与人数 1积分 +3 收起 理由
flyspirit + 3 谢谢奉献

查看全部评分

发表于 2011-1-28 10:05 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 HappyRain 于 2011-1-28 10:53 发表
解决这种在开发环境和product环境运行时间长短不一致问题的关键是:找出两种环境的不同点。在这种情况下,我们通常会认为两个环境完全一样。实际上必定有不同点存在,否则也不会每次在develop环境下运行时间正常,而每次在pr ...


谢谢连接,不过都是live system下测得啦。

发表于 2011-1-28 10:24 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2011-1-28 11:05 发表

谢谢连接,不过都是live system下测得啦。


你的live system指的什么?仅仅是database吗? developer直接用VS和marking team测IIS中host的app结果可能是不一样的.

如果一个是vs,一个是IIS, 加一个WITH RECOMPILE option 试一下.

FYI - http://aspadvice.com/blogs/ssmit ... agement-Studio.aspx

发表于 2011-1-28 10:28 |显示全部楼层

回复 29# 的帖子

此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
都是live, 从Web server到 Database server

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部