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语句执行超时引发网站首页访问故障问题,希望对大家有所帮助!
- SqlParameter的size属性
- SQL中Union,Intersect,Except
- mysql8.0安装及配置(MySQL 8.0 之不可见列的基本操作)
- 执行mysqldump命令后数据库无反应(关于xampp启动不了mysql数据库的解决方法)
- 查看mysql索引缓存(MySQL查询缓存的小知识)
- laravel终止函数执行(laravel 输出最后执行sql 附:whereIn的使用方法)
- mysql sql优化方法(MySQL SQL优化教程之in和range查询)
- sql server使用手册(SQL Server连接查询的实用教程)
- sqlserver查看表和存储过程的架构(SQL Server 远程更新目标表数据的存储过程)
- docker怎么创建mysql服务(Docker部署MySQL8集群一主二从的实现步骤)
- mysql怎么和sqlyog连接(Mysql桌面工具之SQLyog资源及激活使用方法告别黑白命令行)
- SQL Server唯一约束
- sqlserver数据库同步复制(SqlServer将数据库中的表复制到另一个数据库)
- mysql主从复制原理详解(详解MySQL kill 指令的执行原理)
- phpmysql怎么搭建(PHP使用PDO、mysqli扩展实现与数据库交互操作详解)
- mysql8.0安装教程win10(Windows10下mysql 8.0.22 安装配置方法图文教程)
- 冬天来了手脚冰凉 真不是因为上辈子你是折翼的天使(冬天来了手脚冰凉)
- 0 1 岁婴儿最强作息指南,照着做养出天使宝宝(01岁婴儿最强作息指南)
- 沪上这16所高校 萌新 礼包开箱 哪一款让你心动(沪上这16所高校萌新)
- 她救了被绑架的他,而这一切竟是一场阴谋...(她救了被绑架的他)
- 冬季养殖这6种阴生植物,方便又好养,你家有么(冬季养殖这6种阴生植物)
- 阴生植物为什么不怕照不到阳光(阴生植物为什么不怕照不到阳光)
热门推荐
- javascript和jquery的区别详解(JavaScript与JQuery框架基础入门教程)
- phpfpm优化方法(php-fpm超时时间设置request_terminate_timeout资源问题分析)
- mysql连接查询原理(MySQL连接查询你真的学会了吗?)
- python 百度搜索结果(Python模拟百度自动输入搜索功能的实例)
- centos中docker安装部署(三分钟完成 ubuntu16.04初始化,Java,maven,docker环境的部署问题)
- SQL语句分析工具Plan Explorer
- javascript如何建立一个静态变量(JavaScript中子函数访问外部变量的3种解决方法)
- python解析csv文件存到数据库(python读取csv和txt数据转换成向量的实例)
- mvc中使用uploadify批量上传
- dedecms 图片不显示(dedecms图片集添加水印的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9