承接国内外服务器租用托管、定制开发、网站代运营、网站seo优化托管接单、网站代更新,新老站点皆可!!咨询QQ:3787320601

SQL性能优化之定位网络性能问题的方法(DEMO)

管理员 2023-08-04 08:04:55 互联网圈 0 ℃ 0 评论 5338字 收藏

最近项目组同事跟我说遇到一个SQL性能问题,他说全表只有69条记录,客户端履行耗费了两分多钟,很不科学。我帮了分析出了缘由并得到解决。下面小编安装类似表结构,构造了一个案例,测试截图以下所示:

这个表有13800KB(也就是13M多大小),由于该表将图片保存到数据库(Item_Photo字段为iamge类型),这个是历史缘由,暂且不喷这类的设计。看来这个SQL履行时间长的性能问题不在于IO和SQL本身履行计划会不会有问题,而是在网络数据传时间上(服务器与客户端位于异地,两地专线带宽6M,不过很多利用、邮件、系统都依赖此专线)

sp_spaceused ‘Item_Test’ name rows reserved data index_size unused———– ————- ———- ————– ———– ————-Item_Test 69 13864 KB 13800 KB 16 KB 48 KB

为了验证我的想法,我在服务器本机测试时间为2秒,以下截图所示

从上面我们知道在客户端履行完该SQL语句,总共耗费了2分23秒。那末客户真个到底获得了多少字节数据,数据传输耗费了多长时间呢? 能否查看这些DETAIL信息呢? 答案是可以。在SSMS工具栏,勾选“Include Client Statistics”或使用快捷键SHIFT+ALT+S,然后履行SQL语句,就可以得到以下截图的相关信息。

Client Statistics(客户端统计信息)包括三大块: Query Profile Statistics, Network Statistics, Time Statistics。
这些部份的内容很容易理解,无需多说,那末我们来看看吧

Network Statistics(网络统计信息) Number of server roundtrips: 服务器来回的次数 TDS packets sent from client: 从客户端发送的TDS数据包(个数) TDS packets received from server: 从服务端接收的TDS数据包(个数) Bytes sent from client: 从客户端发送的字节数 Bytes received from server: 从服务器接收的字节数 Time Stattistics:(时间统计信息) Client processing time: 客户端处理时间 Total execution time: 总履行时间 Wait time on server replies: 服务器应对等待时间

从客户端发送的字节和从服务端接收的数据大小都很清晰、明了,那末数据从服务器端发送给客户端所需的时间这里没有,其实它基本上接近客户端处理时间(Client processing time),我们也能够将客户端处理时间权当网络数据传输时间,从上面案例,我们可以看到这个时间耗费了140秒(140132 ms),可以肯定这个SQL性能慢在网络数据传输上,而不是慢在数据库那一块(Server Processing Time).

我们来看看下图,这个是SQL SERVER的要求接收和数据输出的一个大致流程图,当客户端发送要求开始,当服务器接收客户端发来的最后一个TDS包,数据库引擎开始处理要求,要求完成后,将数据发送给客户端,从图中可以看出,客户端接收伏务器端返回的数据也是需要一个进程的(或说时间)

我们在SQL优化进程中,如果一个SQL出现性能问题时,我们应当站在一个全局的角度来分析问题,从CPU资源、网络带宽、磁盘IO、履行计划等多方面来分析,这样才能有助于你分析、定位问题本源,而不要只要SQL响应很慢时,就一味条件反射式先入为主:这是数据库问题。数据库也不能老背这个黑锅。

在数据库等待事件中,ASYNC_NETWORK_IO可以从另外一个侧面反应网络性能问题。关于ASYNC_NETWORK_IO等待类型:

This waittype indicates that the SPID is waiting for the client application to fetch the data before the SPID can send more results to the client application.

那末回到怎么优化这个SQL的问题上来,我们可以从下面因素有哪些来进行优化。

1: SQL只取一定要的字段数据

像这个案例,其实它根本不需要Item_Photo字段数据,那末我们可以修改SQL,只取我们需要的字段数据,就能够避免这个问题,提高SQL性能,另外根据我的经验,开发人员习惯性使用SELECT *,从不管那些数据是需要或者不需要的,先全部取过来再说,这类习惯性行动确切不是一个好习惯。

2:避免这类脑残设计

图片应当以文件情势保存在利用服务器上,数据库只保存其路径信息,这类将图片保存到数据库的设计纯属脑残行动。

以上所述是小编通过一个小demo给大家介绍的SQL性能优化之定位网络性能问题的方法,希望对大家有所帮助!

文章来源:丸子建站

文章标题:SQL性能优化之定位网络性能问题的方法(DEMO)

https://www.wanzijz.com/view/69310.html

相关文章

Related articles

X

截屏,微信识别二维码

微信号:weimawl

(点击微信号复制,添加好友)

打开微信