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

打印 上一主题 下一主题

主题 1030|帖子 1030|积分 3090

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一直使用Postgresql数据库,有一张表是这样的:
  1. DROP TABLE IF EXISTS "public"."devicedata";
  2. CREATE TABLE "public"."devicedata" (
  3.   "Id" varchar(200) COLLATE "pg_catalog"."default" NOT NULL,
  4.   "DeviceId" varchar(200) COLLATE "pg_catalog"."default",
  5.   "Timestamp" int8,
  6.   "DataArray" float4[]
  7. )
  8. CREATE INDEX "timeIndex" ON "public"."devicedata" USING btree (
  9.   "Timestamp" "pg_catalog"."int8_ops" DESC NULLS LAST,
  10.   "DeviceId" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
  11. );
  12. ALTER TABLE "public"."devicedata" ADD CONSTRAINT "devicedata_pkey" PRIMARY KEY ("Id");
复制代码
主键为Id,是通过程序生成的GUID,随着数据表的越来越大(70w),即便我建立了索引,查询效率依然不乐观。
使用GUID作为数据库的主键对分布式应用比较友好,但是不利于数据的插入,可以使用类似ABP的方法生成连续的GUID解决这个问题。
为了进行优化,计划使用DeviceId与Timestamp作为主键,由于主键会自动建立索引,使用这两个字段查询的时候,查询效率可以有很大的提升。不过,由于数据库的插入了很多的重复数据,直接切换主键不可行,需要先剔除重复数据。
使用group by

数据量小的时候适用。对于我这个70w的数据,查询运行了半个多小时也无法完成。
  1. DELETE FROM "DeviceData"
  2. WHERE "Id"
  3. NOT IN (
  4. SELECT max("Id")
  5. FROM "DeviceData_temp"
  6. GROUP BY "DeviceId", "Timestamp"
  7. );
复制代码
使用DISTINCT

建立一张新表然后插入数据,或者使用select into语句。
  1. SELECT DISTINCT "Timestamp", "DeviceId"
  2. INTO "DeviceData_temp"
  3. FROM "DeviceData";
  4. -- 删除原表
  5. DROP TABLE "DeviceData";
  6. -- 将新表重命名
  7. ALTER TABLE "DeviceData_temp" RENAME TO "DeviceData";
复制代码
不过这个问题也非常大,很明显,未来的表,是不需要Id列的,但是DataArray也没有了,没有意义。
如果SELECT DISTINCT "Timestamp", "DeviceId", "DataArray",那么可能出现"Timestamp", "DeviceId"重复的现象。
使用ON CONFLICT

如果我们直接建立新表格,设置好新的主键,然后插入数据,如果重复了就跳过不就行了?但是使用select into是不行了,重复的数据会导致语句执行中断。需要借助upsert(on conflict)方法。
  1. INSERT INTO "DeviceData_temp"
  2. SELECT * FROM "DeviceData"
  3. on conflict("DeviceId", "Timestamp") DO NOTHING;
  4. -- 删除原表
  5. DROP TABLE "DeviceData";
  6. -- 将新表重命名
  7. ALTER TABLE "DeviceData_temp" RENAME TO "DeviceData";
复制代码
执行不到100s就完成了,删除了许多重复数据。
参考文献

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表