起因是如此简单的一句sql

DELETE FROM tablename  WHERE timekey=20150416

提示:Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。

提供几种解决思路:

1、检查WHERE条件中字段是否已建索引

2、检查是否被其他表引用,引用表外键字段上是否已建索引

3、分批次删除,根据容量大小设置条数

4、重建索引

第3点,稍微展开一下:

写法1:

首先我们能想到的分批肯定是 TOP

DELETE TOP(5000)  FROM tablename  WHERE timekey=20150416

top多少合适呢,具体还要根据实际场景自己试。

条数多了会造成锁阻塞,即使条数少了也不是没有阻塞可能的,而且听说频繁的删除操作会造成相同语句的IO差距很大,比较不稳定,没有亲自试,不知道传闻是不是真的。

*注:DELETE TOP(10) PERCENT  还有介样按百分比删除的写法,性能也不是很好。

执行结果:

执行计划:

写法2:

有自增列且自增列有索引的情况下,分两步走,①取一批次ID,②删除

DELETE FROM tablename  WHERE ID IN (54321,54322,54323......5000个ID...)

执行结果:

执行计划:

写法3:

有自增列且自增列有索引的情况下,根据MIN(ID),MAX(ID)区间分批次删除。

DELETE FROM tablename
WHERE
ID>=MIN(ID)+5000
and ID<MIN(ID)+10000
and ID<=MAX(ID)
and timekey=20150416

当然,最好是将MIN(ID),MAX(ID)先读出来啦,我这里只是示意一下。

执行结果:

执行计划:

结论:

写法3在各方面都更为优质。当然这个结论是基于我的表约3000w条数据,每批5000条删除的情况,不排除其他场景下的会得到其他结论的可能。没有万能的语句,大家还是要自己试的啊。

提醒自己:

1、select min 和 max id 的时候记得写 with(nolock)啊啊啊

2、删除间隙记得 WAITFOR DELAY '0:0:1'  给其他程序一个时间啊啊啊啊啊啊

ADO.NET 使用DELETE语句批量删除操作,提示超时,删除失败,几种优化解决思路的更多相关文章

  1. SQL替换语句 批量修改、增加、删除字段内容

    sql替换语句,用该命令可以整批替换某字段的内容,也可以批量在原字段内容上加上或去掉字符. 命令总解:update 表的名称 set 此表要替换的字段名=REPLACE(此表要替换的字段名, '原来内 ...

  2. 微信小程序:删除时提示是否删除

    代码如下: wx.showModal({ title: '提示', content: '确定要删除吗?', success: function (sm) { if (sm.confirm) { // ...

  3. SQL truncate 、delete与drop区别及 MSSQL、MySQL 数据库删除大批量千万级百万级数据的优化

    C#_Stopwatch 类 http://www.cnblogs.com/zhw511006/archive/2009/07/22/1528405.html http://blog.csdn.net ...

  4. Elasticsearch删除操作详解

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484022&idx=1&sn=7a4de21 ...

  5. JSON相关知识,转载:删除JSON中数组删除操作

    一:JSON是什么 JSONg格式:对象是一个无序的“名称/值”对的集合. 对象以括号开始,括号结束. 名称冒号分隔值. "名称/值"之间用逗号分隔 例: var people = ...

  6. MySQL DELETE语句和TRUNCATE TABLE语句的区别

    MySQL DELETE语句和TRUNCATE TABLE语句的区别 2010-10-08 16:05 佚名 互联网 字号:T | T 在MySQL数据库中,DELETE语句和TRUNCATE TAB ...

  7. MySQL DELETE 语句

    MySQL DELETE 语句 你可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录. 你可以在mysql>命令提示符或PHP脚本中执行该命令. 语法 以下是S ...

  8. 吴裕雄 14-MySQL DELETE 语句

    以下是 SQL DELETE 语句从 MySQL 数据表中删除数据的通用语法:DELETE FROM table_name [WHERE Clause]如果没有指定 WHERE 子句,MySQL 表中 ...

  9. 十五、MySQL DELETE 语句

    MySQL DELETE 语句 你可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录. 你可以在 mysql> 命令提示符或 PHP 脚本中执行该命令. 语法 ...

随机推荐

  1. arcgis server 无法手动删除切片

    背景 问题 场景如下: 切片放置在专门的文件服务器上,通过unc共享路径对外共享.文件服务器的OS为windows server2008R2 想手动更新切片服务的切片.发现同一切片服务,有的比例级别文 ...

  2. MySQL5.7安装手册

    MySQL安装文档 1. 安装依赖包 yum install -y autoconf automake imake libxml2-devel expat-devel cmake gcc gcc-c+ ...

  3. TestLink安装手册

    环境准备 系统CentOS Linux release 7.3.1611 (Core) 搭建LAMP所需的集成包 xampp-linux-x64-7.2.0-0-installer.run 下载地址 ...

  4. Golang&Python测试thrift

    接上篇,安装好之后,就开始编写IDL生成然后测试. 一.生成运行 参考 http://www.aboutyun.com/thread-8916-1-1.html 来个添加,查询. namespace ...

  5. 22.Atomicity and Transactions-官方文档摘录

    原子性和事务 1 在单个文档修改多个嵌入文档,写操作都在文档级别上都是原子的 2 在单个写操作修改多个文档时,每个文档的修改都具有原子性,但是,作为一个整体的操作,并不是原子的.其他操作可能有交互.使 ...

  6. Win2003X64位,IIS6.0 32位 浏览报错的解决方案

    目录 问题案例 原因分析 解决问题 其他 问题案例 1)服务浏览出现: service unavailable 2)服务浏览出现:HTTP 404 当前页找不到 3)在事件查看器:应用程序中报错:在同 ...

  7. (2.5)Mysql之SQL基础——数据类型

    (2.5)Mysql之SQL基础——数据类型 关键词:mysql数据类型 目录: 一.整数型 二.小数型(以下均不能使用无符号) 三.日期时间型 四.字符串型 一.整数型 额外参数示例: int [( ...

  8. python的scikit-learn的主要模块和基本使用

    在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法. 加载数据(Data L ...

  9. nanomsg(ZeroMQ with C)

    1.应用手册 https://github.com/nanomsg/nanomsg % mkdir build % cd build % cmake .. % cmake --build . % ct ...

  10. Html.DropDownListFor的用法总结

    在ASP.NET MVC中可以用DropDownListFor的方式来让用户选择已定列表中的一个数值. 注:重点是要将DropDownList的数据源转换成IEnumerable<SelectL ...