由delete导致的超时已过期问题

1. 问题

  开发人员反映应用程序中一条简单的delete语句执行报“超时已过期”错误。delete语句形式如下:

  delete * from table_1 where [email protected]

2. 分析

  1)验证delete检索字段是否有索引

  首先我想到的是检索字段 id 列上是否有索引,即是否能很快找到这条待删除的语句。

  查看表的索引列表后,发现id上是存在索引的,而且是聚集索引。

  单独执行 select * from table_1 where [email protected] 走的是聚集索引查找,速度是非常快的

  所以不是因为检索字段缺失索引导致的

  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导致的超时已过期问题

时间: 2024-10-25 20:29:37

由delete导致的超时已过期问题的相关文章

关于查询报表总是"超时已过期"的问题解决

"超时已过期" 的问题一直在烦扰着我, 在查一些数据量比较大的表或者运行一些复杂存储过程的时候就会出现这个提示, 一开始是按下面的来设,有一些报表是可以正常查出来 a.在企业管理器中,选择菜单上的"工具",再选择"选项": b.在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡 c.在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数

关于rms,打开文档的时候提示您没有权限打开文档,因为您的权限已过期

最近帮客户解决rms的问题,有两个可以分享的.另外一个晚点有空在写,今天先写一个找不到头绪的故障,希望其他哥们遇上了,能尽快解决问题的. sharepoint网站上打开rms加密的文档.打开之后提示 您没有权限打开文档,因为您的权限已过期.您可以从http://XXX.COM/DOCLIB请求更新权限.是否请求更新权限. 无论如何更换用户都无法打开文档.各种资料跟测试经过之后都解决不了问题. 最后一个巧合,我去查看事件查看器.这必须是一个好习惯啊,必须查看.查看找不出问题,我也无奈了.看着看着,

使用history.back()出现"警告: 网页已过期的解决办法"

原因: 表单提交页面中使用了 session_start 函数.由于我们后退浏览的是缓存页,而该函数会强制当前页面不被缓存. 解决: PHP: 此提示出现在一个POST提交的页面,点到其它页面后,通过JavaScript再返回时,IE就会显示这个提示.以前也有碰到过好多次,不过都没太在意,百度一下原来是session在作怪. 在通过IE的后退按钮或者网页中的history.Go(-1)时,我们看到的将是缓存页,但使用了session_start后,这个函数会强制当前页面不被缓存,导致出现“警告:

Chrome浏览器无法观看视频,一直提示“adobe flash player 已过期” ?

   很多新用户在安装了Chrome浏览器或者更新过的的时候,经常提示" adobe flash player 已过期"的问题,反复提示,导致无法观看视频.于是从网上也找了很多办法都没有解决.这里给大家提供一个最完美的解决方案.经亲自测试,完美解决adobe flash player插件过期遇到阻止的问题. 1.在百度搜索 " adobe flash player ppapi ",去官方网站下载完成安装.下载对应操作系统的PPAPI版本,安装,然后重启浏览器,完成.

【故障处理141119】一次数据库不繁忙时一条sql语句2个运行计划导致业务超时的故障处理

1,故障描写叙述: 一条select有两个运行计划.在sqlplus中运行选择好的运行计划.仅仅要40毫秒.而在程序中运行选择了差的运行计划,要1分23秒左右,导致前台业务超时报错. 2.故障解决: 使用outline固定好的运行计划后攻克了该故障. 3,故障发展顺序: (1),早上一上班,说CRM的一个业务报错,crm应用开发者.接口的.tuxdo.dba集中到一起開始诊断错误. (2),业务返回超时错误 (3),数据库这边抓取AWR报告发现例如以下信息: (4),此时应用开发者也发过来了该条

防止shell脚本长时间运行导致ssh超时

在一些对安全性要求较高的场景下,ssh的超时时间是管理员预先设置好的,在闲置一段时间后ssh连接会自动断开.这种情况下如果通过ssh执行脚本,而脚本运行时间又比较长的话,会导致ssh客户端和服务器长时间无交互而超时,命令执行失败. 使用bash子进程可以解决这种问题,思路是由子进程执行具体的逻辑代码,而由主进程来监控子进程的执行状态,同时向控制台输出字符来keep alive. bash创建子进程有多重方式,这里使用"()",然后用"&"将其放在后台执行.虽

【JavaScript】history.back() 网页已过期

使用history.back()进行返回时,有时会提示“网页已过期”, 多数是因为目标页面的form为post提交方式,而且是表单已经提交后的响应页面,无法找到form中的具体参数,而“报错”. 具体解决办法: 一.在要返回的目标页面中,添加<%response.setHeader("cache-control","public"); %> 二.将目标页面的form的method="post"去掉,或改为method="ge

软件提示Internet站点使用已过期的证书或无效证书

问题:提示Internet站点使用已过期的证书或无效证书,如图所示: 解决:1.internet选项中,选择高级标签卡——勾掉 <检查发行商的证书是否吊销>和<检查服务器证书吊销*>. 2.在运行中:输入   regsvr32 softpub.dll .  3.将时间调准即可. 软件提示Internet站点使用已过期的证书或无效证书

谷歌Chrome浏览器提示adobe flash player已过期完美解决办法

最近使用谷歌Chrome浏览器提示adobe flash player已过期,浏览网页时一些flash元素的东西都无法正常显示,在网上尝试寻找很多方法,都不能解决,最后,经测试有效方法如下: 一:下载最新版本adobe flash player插件:(注意,对应系统) 地址:http://www.adobe.com/support/flashplayer/debug_downloads.html