sql常遇到的问题(SQL语句执行超时引发网站首页访问故障问题)
sql常遇到的问题
SQL语句执行超时引发网站首页访问故障问题非常抱歉,今天早上 6:37~8:15 期间,由于获取网站首页博文列表的 SQL 语句出现突发的查询超时问题,造成访问网站首页时出现 500 错误,由此给您带来麻烦,请您谅解。
故障的情况是这样的。
故障期间日志中记录了大量下面的错误。
2020-02-03 06:37:24.635 [Error] An unhandled exception has occurred while executing the request./Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareSystem.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (258): Unknown error 258 at System.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__126_0(Task`1 result)
数据库服务器(阿里云 RDS SQL Server 2016 实例)的 CPU 消耗突增。
数据库服务器的 IOPS 暴增。
通过阿里云 RDS 控制台的 CloudDBA 可以查看到故障期间获取首页博文的 SQL 语句被执行了3万多次,执行这么多次是由于查询超时,无法建立缓存,每次请求都要访问数据库。
发现故障后,我们通过阿里云 RDS 的主备切换恢复了正常。
经过对故障的排查分析,锁定的最大嫌疑对象是 SQL Server 参数嗅探(详见园子里的博文 什么是 SQL Server 参数嗅探)。
对于这种因为重用他人生成的执行计划而导致的水土不服现象,SQL Server 有一个专有名词,叫“参数嗅探 parameter sniffing”。
而且我们找到了引发 SQL Server 参数嗅探问题的条件。
在我们的 open api 中提供了获取首页博文列表的 web api ,但没有限制可以获取的最大博文数,也就是下面的 ItemCount 参数(除了 open api ,其他地方调用时 ItemCount 值都是 20 )。
SELECT TOP (@ItemCount)
假如有人调用 open api 时给 ItemCount 传了一个很大的值,比如 20000 ,虽然调用的是同样的 SQL 语句,但由于 ItemCount 的值不同, SQL Server 可能会生成相差很大的执行计划,对于 ItemCount 20000 性能比较好的执行计划,对于 ItemCount 20 可能性能极差。如果查询 ItemCount 20000 时生成的执行计划被缓存下来,查询 ItemCount 20 时继续使用这个执行计划,就会出现本来好好的 SQL 查询突然变得性能极差。我们今天遇到的故障很可能就是这个原因,而且故障时就一个 SQL 语句出现问题(正好就这个 SQL 查询缓存了水土不服的执行计划),其他都正常,也验证了这个猜测。
通过这次故障,我们吸取的教训是一定要在代码中对 ItemCount 与 PageSize 的最大值进行限制,它不仅仅是带来不必要的低性能查询,而且可能会因为 SQL Server 参数嗅探问题拖垮整个数据库。
总结
以上所述是小编给大家介绍的SQL语句执行超时引发网站首页访问故障问题,希望对大家有所帮助!
- mysql建表时指定聚簇索引(一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的)
- mysql字符类型长度限制
- sql服务器停止后无法启动(SQL服务器无法启动的解决方法)
- sqlserver怎么查看数据库版本(Sql Server数据库各版本功能对比)
- dedecms栏目怎么调用友情链(DedeCms用SQL语句调用数据库任意内容方法)
- mysql千万数据如何优化(MySQL千万级数据的表如何优化)
- 简单的sql注入举例(分享一个简单的sql注入)
- SQL Server中row_number的用法
- mysql显示所有数据库语句(MySQL数据库自动补全命令的三种方法)
- sqlserver基本知识(sql server学习基础之内存初探)
- mysql中如何进行模糊查询(MySQL模糊查询用法大全正则、通配符、内置函数)
- SQL Server的恢复模式
- mysql和navicat怎么用(如何用Navicat操作MySQL)
- mysql索引的比较规则(MySQL的Flush-List和脏页的落盘机制)
- sqlserver字符串格式化(SQL server中字符串逗号分隔函数分享)
- thinkphp框架切换数据库(ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例)
- 上海迪士尼攻略(上海迪士尼攻略旅游)
- 哪里可以看熊猫(成都哪里可以看熊猫)
- oppo手机的三种录屏方法,你知道有哪些吗(oppo手机的三种录屏方法)
- 吉林神秘传染链跨省 传染源尚未找到,舒兰 封城(吉林神秘传染链跨省)
- 吉林舒兰 封城 聚集性疫情传播链已延至沈阳,有一个细节让人忧心(吉林舒兰封城)
- 1天密接者猛增77人,患者轨迹透露危险信号 吉林市全面封闭管理(1天密接者猛增77人)
热门推荐
- 如何降低SQL语句复杂度
- dedecms不生成文档(dedecms批量替换文章中超链接的方法)
- win7用iis搭建服务器(win7配置iis服务器图文教程)
- 微信小程序语音录入(微信小程序使用同声传译实现语音识别功能)
- sqlserver数据类型和长度(SqlServer 数据库 三大 范式)
- laravel5.1获取数据(laravel5表单唯一验证的实例代码)
- ASP.NET 生成条形码
- 怎么运行xampp中的mysql(本地安装了mysql导致xampp的mysql服务启动失败)
- 如何使用HttpModule实现sql防注入
- 织梦怎么添加图片(织梦怎么去掉上传图片的水印改为自己设计的水印)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9