首页 > 数据库 >删除数据库表中重复数据的方法

删除数据库表中重复数据的方法

时间:2022-09-30 15:47:11浏览次数:79  
标签:DeviceData 删除 Timestamp 数据库 Id DeviceId 表中 TABLE 主键

一直使用Postgresql数据库,有一张表是这样的:

DROP TABLE IF EXISTS "public"."devicedata";
CREATE TABLE "public"."devicedata" (
  "Id" varchar(200) COLLATE "pg_catalog"."default" NOT NULL,
  "DeviceId" varchar(200) COLLATE "pg_catalog"."default",
  "Timestamp" int8,
  "DataArray" float4[]
)

CREATE INDEX "timeIndex" ON "public"."devicedata" USING btree (
  "Timestamp" "pg_catalog"."int8_ops" DESC NULLS LAST,
  "DeviceId" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);

ALTER TABLE "public"."devicedata" ADD CONSTRAINT "devicedata_pkey" PRIMARY KEY ("Id");

主键为Id,是通过程序生成的GUID,随着数据表的越来越大(70w),即便我建立了索引,查询效率依然不乐观。

使用GUID作为数据库的主键对分布式应用比较友好,但是不利于数据的插入,可以使用类似ABP的方法生成连续的GUID解决这个问题。

为了进行优化,计划使用DeviceId与Timestamp作为主键,由于主键会自动建立索引,使用这两个字段查询的时候,查询效率可以有很大的提升。不过,由于数据库的插入了很多的重复数据,直接切换主键不可行,需要先剔除重复数据。

使用group by

数据量小的时候适用。对于我这个70w的数据,查询运行了半个多小时也无法完成。

DELETE FROM "DeviceData"
WHERE "Id"
NOT IN (
SELECT max("Id")
FROM "DeviceData_temp"
GROUP BY "DeviceId", "Timestamp"
);

使用DISTINCT

建立一张新表然后插入数据,或者使用select into语句。

SELECT DISTINCT "Timestamp", "DeviceId"
INTO "DeviceData_temp"
FROM "DeviceData";
-- 删除原表
DROP TABLE "DeviceData";
-- 将新表重命名
ALTER TABLE "DeviceData_temp" RENAME TO "DeviceData";

不过这个问题也非常大,很明显,未来的表,是不需要Id列的,但是DataArray也没有了,没有意义。

如果SELECT DISTINCT "Timestamp", "DeviceId", "DataArray",那么可能出现"Timestamp", "DeviceId"重复的现象。

使用ON CONFLICT

如果我们直接建立新表格,设置好新的主键,然后插入数据,如果重复了就跳过不就行了?但是使用select into是不行了,重复的数据会导致语句执行中断。需要借助upsert(on conflict)方法。

INSERT INTO "DeviceData_temp"
SELECT * FROM "DeviceData"
on conflict("DeviceId", "Timestamp") DO NOTHING;
-- 删除原表
DROP TABLE "DeviceData";
-- 将新表重命名
ALTER TABLE "DeviceData_temp" RENAME TO "DeviceData";

执行不到100s就完成了,删除了许多重复数据。

参考文献

https://blog.csdn.net/wendred/article/details/84704042

标签:DeviceData,删除,Timestamp,数据库,Id,DeviceId,表中,TABLE,主键
From: https://www.cnblogs.com/podolski/p/16745080.html

相关文章

  • 数据库黑客入侵事件(1)--精心准备的入侵
         总结这些年数据库运维,除了数据库优化,审核,高可用,故障处理等这些日常事情外,给我留下感触最深的就是有二起数据库入侵事件,自己亲身经历的黑客攻击拖库事件,一起......
  • oracle数据库安装centos 7
    0、查看Swap分区空间不能小于2GgrepSwapTotal/proc/meminfofree-g备注:单位:kmg1、关闭防火墙systemctlstopfirewalld.servicesystemctldisablefirewalld......
  • 【MySQL】MariaDB使用connect引擎直接访问SQLServer数据库
    场景:mariadb通过connect引擎,访问sqlserver2008中的数据。1.安装connect存储引擎如果mariadb是使用二进制包安装的话,默认已经安装了connect存储引擎否则就需要执行手......
  • java 遍历目录 删除目录 判断是否为目录
    删除目录privatestaticbooleandeleteDir(Filefile){if(file==null||!file.exists()){System.out.println("deletefilesfail,fi......
  • 学习笔记——Django项目的删除数据、查询数据(filter、get、exclude)
    2022-09-30删除数据:方式一:打开pycharm,进入虚拟环境,进入shell环境(pythonmanage.pyshell)。删除数据,接上面的笔记——“学习笔记——Django项目的新增数据、修改数据”......
  • 剪映删除视频片段
    剪映剪辑教学:如何给视频删除多余的片段,讲解仔细,简单易懂,新手必看。_哔哩哔哩_bilibili1.选中要编辑的视频。2.点击分割。 ......
  • 苹果Mac数据库管理开发工具:DataGrip 2022
    DataGrip2022是一款苹果Mac数据库管理开发工具,支持、Azure、AmazonRedshift、SQLite、DB2、H2、Sybase、Exasol、ApacheDerby、MariaDB、、Snowflake、Cassandra、Clic......
  • 关系数据库标准语言SQL(2)数据定义
    数据定义分为四个定义:模式(SCHEMA)定义、表(TABLE)定义、视图定义、索引定义操作的方式:创建(CREATE)、删除(DROP)、修改(ALTER),在每种定义前前加上相应操作的关键字,而后加上定义关......
  • linux初始化MySQL数据库
    1.停止MySQL  2.删除数据库中所有的文件及日志[root@localhost~]#rm-rf/var/lib/mysql/*#删除mysql目录下所以文件[root@localhost~]#rm-rf/var/log/mysqld.......
  • 关系数据库标准语言SQL(1)
    SQL(StructuredQueryLanguage)结构化的查询语言,是关系数据库的标准语言。SQL是一个通用的、功能极强的关系数据数据库语言特点:1.综合统一(功能、数据操作)2.高度非过程化......