SqlServer一次删除大量数据

jiaoshiyao 2017-09-30 01:41:17
表有id、哈希值(int)、哈希字符串(string)、下标(int)和其他列

删除的时候不知道ID,只知道哈希值,哈希字符串,下标

但是每条数据的哈希值,哈希字符串和下标都不一样

删除的时候只能

delete table where

  (hashCode = 1 and hash = 'hash' and index = 1)

or(hashCode = 2 and hash = 'hash2' and index = 2)

or(hashCode = 3 and hash = 'hash3' and index = 3)

这只是删了3条。。每次删除的数据都要在1W条以上。。

速度太慢了。。。有什么好的
...全文
799 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2017-10-01
  • 打赏
  • 举报
回复
通过临时表关联删除
吉普赛的歌 2017-10-01
  • 打赏
  • 举报
回复
USE tempdb
GO
--1. 创建测试表
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	id INT IDENTITY(1,1) PRIMARY KEY
	,hashCode INT NOT NULL
	,[hash] VARCHAR(50) NOT NULL
	,[index] INT NOT NULL 
)
GO
SET NOCOUNT ON
--插入 10 万行测试数据 (本机执行大约 30 秒)
INSERT INTO dbo.t (hashCode,[hash],[index]) VALUES(CEILING(RAND()*100),NEWID(),CEILING(RAND()*100))  
GO 100000

--关键1:为这个表加上索引
CREATE INDEX ix_t_hashCode_hash_index ON dbo.t(hashCode,[hash],[index])


--现在要删除其中的一万条数据
--1. 将一万条需要删除的信息插入到表变量
--注: 如果是程序操作,可以构建 DataTable ,将一万条记录加入到 DataTable, 
--     再用 SqlBulkCopy 插入到一个普通表, 这个速度也很快的。
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
CREATE TABLE #tmp(
	hashCode INT NOT NULL
	,[hash] VARCHAR(50) NOT NULL
	,[index] INT NOT NULL
)
--2: 需要删除的临时数据表也加上索引
CREATE CLUSTERED INDEX ix_tmp_hashCode_hash_index ON #tmp(hashCode,[hash],[index])

INSERT INTO #tmp(hashCode,[hash],[index])
SELECT TOP 10000 hashCode,[hash],[index] FROM t

------------- 上面代码建议与下面的代码分开执行 -------------
SET NOCOUNT OFF
DELETE a 
FROM t a,#tmp b 
WHERE 
a.hashCode=b.hashCode 
AND a.[hash]=b.[hash]
AND a.[index]=b.[index]
/*
(10000 行受影响)  本机执行不到1秒
*/
本人QQ-554433626 2017-09-30
  • 打赏
  • 举报
回复
写个小程序呗
正怒月神 2017-09-30
  • 打赏
  • 举报
回复
楼主,上次看见你准备放弃编程呢, 现在看到你还在这条路上,觉得挺好的。 楼主加油,哈哈哈。 我不确定你是否创建过索引。删除我记得会用到索引, 有利有弊吧。 因为删除数据,导致索引重新调整也是有消耗的。 而你的代码存在 or,所以即使存在索引,应该也不会使用到。 接着你的索引还会从新维护。 我觉得你直接做一个批处理, delete table where (hashCode = 1 and hash = 'hash' and index = 1) delete table where (hashCode = 2 and hash = 'hash2' and index = 2) delete table where (hashCode = 3 and hash = 'hash3' and index = 3) 这样会不会快一点?

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧