由delete导致的超时已过期问题
1. 问题
开发人员反映应用程序中一条简单的delete语句执行报“超时已过期”错误。delete语句形式如下:
delete * from table_1 where id=@value
2. 分析
1)验证delete检索字段是否有索引
首先我想到的是检索字段 id 列上是否有索引,即是否能很快找到这条待删除的语句。
查看表的索引列表后,发现id上是存在索引的,而且是聚集索引。
单独执行 select * from table_1 where id=@value 走的是聚集索引查找,速度是非常快的
所以不是因为检索字段缺失索引导致的
2)验证是否存在阻塞
接下来猜测是不是发生了阻塞,即delete语句等待其他会话释放KEY上的锁以获得X锁来执行删除
使用sys.sysprocesses查询当前delete会话状态,发现并未阻塞
3)查看delete语句的预估执行计划
前两步验证完毕后,越发觉得有点无从下手的感觉。抛下自己所谓的经验,先看下delete语句执行计划吧
因为语句执行超时,不能查看真正的执行计划,所以查看估计的执行计划来分析问题。
以在AdventureWorks2012测试删除为例
执行delete from Person.Person where BusinessEntityID=6,执行计划部分截图为:

3. 结论
从执行计划中,发现了问题原因:
删除数据的表被其他表所引用,SQLServer在删除被引用表数据时,会检查引用表是否存在引用值记录,以保证数据的参照完整性。
而目前引用表在外键字段上没有索引,导致使用索引扫描来查找,并且引用表记录数在百万以上,导致删除超时
4. 处理
在引用表的外键字段上增加非聚集索引
5. 思考
1)应用程序的物理删除数据是否合理及必须呢?是否可以通过增加删除标记或者单据状态之类,来实现逻辑删除呢?
2)引用表中字段的外键是否必须建立呢?看了一些应用系统,如用友、金蝶的系统,表中的外键字段很少。外键字段过多对插入删除的速度会有一定的影响。
3)如果建立了外键约束的话,引用表的外键字段和被引用表的主键字段应该最好要建立索引
如有不对的地方,欢迎拍砖,谢谢!O(∩_∩)O
由delete导致的超时已过期问题的更多相关文章
- 解决SQL查询总是超时已过期
解决SQL查询总是超时已过期 .在WIN8里提示:OLE DB 或 ODBC 错误 : 查询超时已过期; HYT00 1.由于数据库设计问题造成SQL数据库新增数据时超时 症状: Microso ...
- 关于查询报表总是"超时已过期"的问题解决
"超时已过期" 的问题一直在烦扰着我, 在查一些数据量比较大的表或者运行一些复杂存储过程的时候就会出现这个提示, 一开始是按下面的来设,有一些报表是可以正常查出来 a.在企业管理器 ...
- DbCommand :执行超时已过期。完成操作之前已超时或服务器未响应。
问题:“Timeout 时间已到.在操作完成之前超时时间已过或服务器未响应.”的解决方法 在一个链接数据库的时候,老是出现超时的错误:执行超时已过期.完成操作之前已超时或服务器未响应. 就是给这个链接 ...
- [C#.net]SqlDataAdapter 执行超时已过期 完成操作之前已超时或服务器未响应
随着数据库数据的不断增大,查询时间也随之增长.而客户端与数据库连接时间以及命令的执行时间都是有限的.默认为30s.所以在查询数据的时候,程序会出现 “超时时间已到.在操作完成之前超时时间已过或服务器未 ...
- 使用history.back()出现"警告: 网页已过期的解决办法"
原因: 表单提交页面中使用了 session_start 函数.由于我们后退浏览的是缓存页,而该函数会强制当前页面不被缓存. 解决: PHP: 此提示出现在一个POST提交的页面,点到其它页面后,通过 ...
- Chrome浏览器无法观看视频,一直提示“adobe flash player 已过期” ?
很多新用户在安装了Chrome浏览器或者更新过的的时候,经常提示“ adobe flash player 已过期”的问题,反复提示,导致无法观看视频.于是从网上也找了很多办法都没有解决.这里给大 ...
- 安卓,支付宝app登录时,提示 服务器安全证书已过期或不可信任,请问怎么解决
安卓,支付宝app登录时,提示 服务器安全证书已过期或不可信任,请问怎么解决 请把手机时间调成当前时间.
- 分配给 主机的 Evaluation Mode 许可证已过期。建议升级许可证。
参考文献 http://247its.wordpress.com/2012/04/02/new-build-esxi-5-complaints-licence-has-expired/ http:// ...
- SQL2012 提示评估已过期 解决方案- sql server问题
SQL2012 提示评估已过期 解决方案提示评估已过期的解决方法和 sql2008一样 第1步:进入SQL2012配置工具中的安装中心第2步:再进入维护界面,选择版本升级第3步:进入产品密钥,输入密钥 ...
随机推荐
- Java_反射机制详解
本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象 ...
- 原生js动态添加style,添加样式
原生js动态添加style,添加样式 第一种 var style="[assign-url='"+str+"']{display:initial}"; var ...
- tomcat 日志详解
1 tomcat 日志详解 1.1 tomcat 日志配置文件 tomcat 对应日志的配置文件:tomcat目录下的/conf/logging.properties. tomcat 的日志等级有 ...
- springboot-19-整合dubbox
springboot 整合dubbox 1, 没了,,, 2, 安装zookeeper 可见: http://www.cnblogs.com/wenbronk/p/6636926.html 2.1 下 ...
- Linux-文件和目录属性
文件系统的是用来组织和排列文件存取的,所以它是可见的,在Linux中,我们可以通过ls等工具来查看其结构,在Linux系统中,见到的都是树形结构:比如操作系统安装在一个文件系统中,他表现为由/ 起始的 ...
- Java 集合框架(二)—— ArrayList
二.数组列表 —— ArrayList 1.构造方法 ArrayList 是 Java 中的动态数组,底层实现就是对象数组,只不过数组的容量会根据情况来改变. 它有个带 int 类型参数的构造方法,根 ...
- Spanner:谷歌新一代全球部署的列式数据库
Spanner 是一个可扩展的.全球分布式的数据库,提供分布式ACID. 架构 universe:一个部署的实例成为universe,目前谷歌有3个,分别为开发/测试/线上 Zone:一个数据中心,相 ...
- Class.forName(),Class.forName().newInstance() ,New ,类名.class,,class.forName(),,getClass()
在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法.通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为 ...
- 将AJAX Post的Data转为对应的Class
在使用DataTables从服务端获取数据时,在非MVC的情况下没有MVC的自动绑定功能,所以需要自己写一个绑定,将Post过来的InputStream转为对应的类. HTML: <form i ...
- select样式
select设置了宽高: 样式是这样的: 如果在select的标签内部加入size="2" size的值只要大于1,select的设置大小会起作用 样式是这样的: 3.点击中 ...