111,120
社区成员
发帖
与我相关
我的任务
分享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秒
*/
我不确定你是否创建过索引。删除我记得会用到索引,
有利有弊吧。
因为删除数据,导致索引重新调整也是有消耗的。
而你的代码存在 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)
这样会不会快一点?