110,500
社区成员
发帖
与我相关
我的任务
分享
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秒
*/