设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

如何诊断和调优,才能轻松与数据库“timeout”说再见?(3)

发布时间:2021-01-07 13:04 所属栏目:53 来源:网络整理
导读:传入连接:查询超时 对于查询超时,针对SQL Server 2012以下的版本,使用Profiler的TSQL_Duration模板的基础上,添加“Errors and Warnings”下的“Attention”,根据捕获到的Attention结合上下文去查找相应的语句;对

传入连接:查询超时

对于查询超时,针对SQL Server 2012以下的版本,使用Profiler的TSQL_Duration模板的基础上,添加“Errors and Warnings”下的“Attention”,根据捕获到的Attention结合上下文去查找相应的语句;对于SQL Server 2012及以上版本,直接使用扩展事件监控sqlserver.attention事件,直接输出sql_text.

以下为XE脚本:

调优建议

对于连接耗时,当然务必要找到具体原因,是网络问题还是验证问题;对于查询超时,多为语句性能问题导致,如阻塞、未使用合理的索引、输出数据量太大等原因.对于临时解决问题,可以在连接配置里、或在程序里的语句级参数属性调大配置值.应及时找出问题的根源并解决.

传入连接:数据库跨实例远程访问超时

链接服务器远程访问导致的连接超时和查询超时,我们可以在目标数据库服务器上来使用以上方法来监控和分析.

调优建议

当使用链接服务器(LinkedServers)时,最昂贵的代价就是网络带宽间大量数据的传输.在正确的服务器书写正确的代码是非常重要的,因为每一个错误都会导致在网络带宽上付出非常昂贵的代价.

尽量避免使用链接服务器向远程推送数据,而是使用LinkedServer.DatabaseName.dbo.TableName为源从远程拉取数据.

跨服务器查询时,为了在两台服务器之间的数据集之间执行JOIN操作,SQLServer需要将数据从一台服务器传送到另外一台服务器.如果传送的数据是一个非常大的表,这个过程可能会非常痛苦.通常来说,数据会从远程服务器传送到本地服务器.为了防止大量数据在服务器之间大传送,你可以通过在查询条件中过滤数据,通过一个远程存储过程只取回相关数据来达到目的,万一你需要使用INNERJOIN关联两个不同服务器之间的数据集,而且本地表的数据量远小于远程服务器的那个表.你可以使用REMOTEJOINHINT,这样就会将数据从本地服务器将数据传送到远程服务器,从而提高性能.

正如JOIN操作,UNIION不同服务器之间的两个数据集必定导致从远程服务器传送数据到本地服务器.即使你执行远程查询合并(UNION)同一个远程服务器的两个数据集,还是会先将两个数据集传送到本地服务器,然后UNION两个数据集,可以通过远程存储过程,函数或视图先UNION数据库来阻止这个.

避免书写太复杂的查询语句.优化器不能总是能明白你需要做什么,尤其是你的SQL语句中使用了链接服务器时,保持SQL脚本简单.

当数据库位于同一个实例时不要使用链接服务器.而是直接使用跨库访问Database.dbo.TableName来访问.

链接服务器的滥用可能会导致数据库出现很多ASYNC_NETWORK_IO等待事件.你可以通过发布-订阅或者作业将数据集(表)数据先同步到本地服务器,然后将SQL脚本中的链接服务器去掉,这样对SQL查询性能有非常大的提升,尤其是查询比较频繁或数据量大的SQL语句.

对于链接服务器的对象调用,尽量使用同义词,这样简化了管理.

文章出处:DBAplus社群(订阅号ID:dbaplus)

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读