千万级数据表删数据

时间:2022-04-05 14:29:01

contents time ip
410048 2015-11-01 00:00:03.900 /122.96.46.175:61337
410048 2015-11-01 00:00:23.950 /122.96.46.175:61337
410048 2015-11-01 00:00:52.323 /122.96.46.175:61337
410048 2015-11-01 00:01:12.357 /122.96.46.175:61337
410048 2015-11-01 00:01:32.450 /122.96.46.175:61337
410048 2015-11-01 00:01:52.497 /122.96.46.175:61337
410048 2015-11-01 00:02:12.603 /122.96.46.175:61337
410048 2015-11-01 00:02:32.637 /122.96.46.175:61337
410048 2015-11-01 00:02:52.723 /122.96.46.175:61337
410048 2015-11-01 00:03:12.773 /122.96.46.175:61337
410048 2015-11-01 00:03:32.850 /122.96.46.175:61337

现在在一张表中有两千多万数据,类似于这种的数据,现在只是查出contents=‘410048’的数据,还有其他的,比如410049等等,现在大约是每20秒增加一条数据。现在就想删除数据,保留3分钟内时间最小的数据,结果如下

contents time ip
410048 2015-11-01 00:00:03.900 /122.96.46.175:61337
410048 2015-11-01 00:03:12.773 /122.96.46.175:61337
410048 2015-11-01 00:06:16.580 /122.96.46.175:61337
410066 2015-11-01 00:00:55.260 /122.96.46.165:61337
410066 2015-11-01 00:03:59.317 /122.96.46.165:61337

请问这个应该如何处理,要写存储过程吗,怎么写呢。

4 个解决方案

#1


建立一个作业,每3 分钟执行一次,删除 3 分之前的,看看效率怎么样,不行的话,再想别的办法。

#2


要删除几千万的数据, 产生的日志不可小看了。
还不如将要保留的数据弄到新表, 旧表保留备份数据。 

类似我下面操作就好, 也许生产环境一两秒受影响,但一劳永逸。
如果按你的做法可能生产环境半小时也未必能正常运转。

--0. 准备测试表及测试数据
IF OBJECT_ID('dbo.T1','U') IS NOT NULL
DROP TABLE dbo.T1
GO
IF OBJECT_ID('dbo.T1_old','U') IS NOT NULL
DROP TABLE dbo.T1_old
GO
CREATE TABLE dbo.T1(
id INT,
d DATETIME,
CONSTRAINT PK_T1 PRIMARY KEY(
id ASC
)
)
GO
INSERT INTO T1(ID,d) VALUES(1, DATEADD(mm, -30, GETDATE()))
INSERT INTO T1(ID,d) VALUES(2, GETDATE())
GO
--1. 原表改名
EXEC sp_rename 'T1', 'T1_old'
GO
--2. 原表中的部分数据插入到新表; 旧表中删除新表有的数据
SELECT * INTO T1 FROM T1_old WHERE d>DATEADD(mm, -30, GETDATE())
DELETE FROM T1_old FROM T1 WHERE T1_old.id=t1.id
GO
--3. 新表加上主键约束
ALTER TABLE T1 ADD CONSTRAINT PK_T1_new PRIMARY KEY (id)
--4. 查看旧表与新表
SELECT * FROM T1
SELECT * FROM T1_old
 

#3


引用 2 楼 yenange 的回复:
要删除几千万的数据, 产生的日志不可小看了。
还不如将要保留的数据弄到新表, 旧表保留备份数据。 

类似我下面操作就好, 也许生产环境一两秒受影响,但一劳永逸。
如果按你的做法可能生产环境半小时也未必能正常运转。

--0. 准备测试表及测试数据
IF OBJECT_ID('dbo.T1','U') IS NOT NULL
DROP TABLE dbo.T1
GO
IF OBJECT_ID('dbo.T1_old','U') IS NOT NULL
DROP TABLE dbo.T1_old
GO
CREATE TABLE dbo.T1(
id INT,
d DATETIME,
CONSTRAINT PK_T1 PRIMARY KEY(
id ASC
)
)
GO
INSERT INTO T1(ID,d) VALUES(1, DATEADD(mm, -30, GETDATE()))
INSERT INTO T1(ID,d) VALUES(2, GETDATE())
GO
--1. 原表改名
EXEC sp_rename 'T1', 'T1_old'
GO
--2. 原表中的部分数据插入到新表; 旧表中删除新表有的数据
SELECT * INTO T1 FROM T1_old WHERE d>DATEADD(mm, -30, GETDATE())
DELETE FROM T1_old FROM T1 WHERE T1_old.id=t1.id
GO
--3. 新表加上主键约束
ALTER TABLE T1 ADD CONSTRAINT PK_T1_new PRIMARY KEY (id)
--4. 查看旧表与新表
SELECT * FROM T1
SELECT * FROM T1_old
 
现在不知道咋写出哪个查询语句了,想好好久,还没考虑到删除的事情 千万级数据表删数据

#4


引用 1 楼 wmxcn2000 的回复:
建立一个作业,每3 分钟执行一次,删除 3 分之前的,看看效率怎么样,不行的话,再想别的办法。
啥是作业啊,没写过

#1


建立一个作业,每3 分钟执行一次,删除 3 分之前的,看看效率怎么样,不行的话,再想别的办法。

#2


要删除几千万的数据, 产生的日志不可小看了。
还不如将要保留的数据弄到新表, 旧表保留备份数据。 

类似我下面操作就好, 也许生产环境一两秒受影响,但一劳永逸。
如果按你的做法可能生产环境半小时也未必能正常运转。

--0. 准备测试表及测试数据
IF OBJECT_ID('dbo.T1','U') IS NOT NULL
DROP TABLE dbo.T1
GO
IF OBJECT_ID('dbo.T1_old','U') IS NOT NULL
DROP TABLE dbo.T1_old
GO
CREATE TABLE dbo.T1(
id INT,
d DATETIME,
CONSTRAINT PK_T1 PRIMARY KEY(
id ASC
)
)
GO
INSERT INTO T1(ID,d) VALUES(1, DATEADD(mm, -30, GETDATE()))
INSERT INTO T1(ID,d) VALUES(2, GETDATE())
GO
--1. 原表改名
EXEC sp_rename 'T1', 'T1_old'
GO
--2. 原表中的部分数据插入到新表; 旧表中删除新表有的数据
SELECT * INTO T1 FROM T1_old WHERE d>DATEADD(mm, -30, GETDATE())
DELETE FROM T1_old FROM T1 WHERE T1_old.id=t1.id
GO
--3. 新表加上主键约束
ALTER TABLE T1 ADD CONSTRAINT PK_T1_new PRIMARY KEY (id)
--4. 查看旧表与新表
SELECT * FROM T1
SELECT * FROM T1_old
 

#3


引用 2 楼 yenange 的回复:
要删除几千万的数据, 产生的日志不可小看了。
还不如将要保留的数据弄到新表, 旧表保留备份数据。 

类似我下面操作就好, 也许生产环境一两秒受影响,但一劳永逸。
如果按你的做法可能生产环境半小时也未必能正常运转。

--0. 准备测试表及测试数据
IF OBJECT_ID('dbo.T1','U') IS NOT NULL
DROP TABLE dbo.T1
GO
IF OBJECT_ID('dbo.T1_old','U') IS NOT NULL
DROP TABLE dbo.T1_old
GO
CREATE TABLE dbo.T1(
id INT,
d DATETIME,
CONSTRAINT PK_T1 PRIMARY KEY(
id ASC
)
)
GO
INSERT INTO T1(ID,d) VALUES(1, DATEADD(mm, -30, GETDATE()))
INSERT INTO T1(ID,d) VALUES(2, GETDATE())
GO
--1. 原表改名
EXEC sp_rename 'T1', 'T1_old'
GO
--2. 原表中的部分数据插入到新表; 旧表中删除新表有的数据
SELECT * INTO T1 FROM T1_old WHERE d>DATEADD(mm, -30, GETDATE())
DELETE FROM T1_old FROM T1 WHERE T1_old.id=t1.id
GO
--3. 新表加上主键约束
ALTER TABLE T1 ADD CONSTRAINT PK_T1_new PRIMARY KEY (id)
--4. 查看旧表与新表
SELECT * FROM T1
SELECT * FROM T1_old
 
现在不知道咋写出哪个查询语句了,想好好久,还没考虑到删除的事情 千万级数据表删数据

#4


引用 1 楼 wmxcn2000 的回复:
建立一个作业,每3 分钟执行一次,删除 3 分之前的,看看效率怎么样,不行的话,再想别的办法。
啥是作业啊,没写过