广告位联系
返回顶部
分享到

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

数据库其他 来源:互联网 作者:佚名 发布时间:2022-10-05 20:52:46 人浏览
摘要

一直使用Postgresql数据库,有一张表是这样的: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 DROP TABLE IF EXISTS public.devicedata; CREATE TABLE public.devicedata ( Id varchar(200) COLLATE pg_catalog.default NOT NULL, DeviceId varchar(20

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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的数据,查询运行了半个多小时也无法完成。

1

2

3

4

5

6

7

DELETE FROM "DeviceData"

WHERE "Id"

NOT IN (

SELECT max("Id")

FROM "DeviceData_temp"

GROUP BY "DeviceId", "Timestamp"

);

使用DISTINCT

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

1

2

3

4

5

6

7

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)方法。

1

2

3

4

5

6

7

INSERT INTO "DeviceData_temp"

SELECT * FROM "DeviceData"

on conflict("DeviceId", "Timestamp") DO NOTHING;

-- 删除原表

DROP TABLE "DeviceData";

-- 将新表重命名

ALTER TABLE "DeviceData_temp" RENAME TO "DeviceData";

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://www.cnblogs.com/podolski/p/16745080.html
相关文章
  • 六大主流数据同步工具对比:DataX、Airbyte、Cana
    当数据量变大、数据源复杂、实时需求提高,很多团队在选数据同步工具时犯难。本文对 DataX、Airbyte、Canal、Debezium、Fivetran 与 Apache SeaTun
  • 解读SQL生成工具
    SQL 生成工具可用于测试Parser与其他数据库产品的兼容性,通过解析YACC语法文件中的产生式,生成对应的SQL语句,再使用数据库执行该SQL,根
  • SQLite3在嵌入式C环境中存储音频/视频文件的最优

    SQLite3在嵌入式C环境中存储音频/视频文件的最优
    SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案 在嵌入式系统中存储大型媒体文件需要平衡存储效率、访问速度和资源限制。以下是针
  • 嵌入式数据库SQLite 3配置使用

    嵌入式数据库SQLite 3配置使用
    0、惨痛教训 随着管理开发的项目体积越来越庞大,产品系统涉及的数据量也越来越多,并且伴随着项目不久就要交付给甲方了。如果项目的
  • Sqlite3基本语句及安装过程

    Sqlite3基本语句及安装过程
    SQLite3简介 SQLite3是一款轻量级的、基于文件的开源关系型数据库引擎,由 D. Richard Hipp 于 2000 年首次发布。它遵循 SQL 标准,但与传统的数据
  • 在SQLite中进行批量操作的有效实现方法
    SQLite 是一个轻量级的关系型数据库管理系统,因其高效性和易用性而广受欢迎。在许多应用场景中,批量操作的需求是不可避免的,例如在
  • 一文介绍在Hive中NULL的理解
    在 Hive 中,NULL 是一个特殊的值,表示未知或缺失。任何与NULL的比较操作(如=,,,=,=,)都会返回NULL,而不是TRUE或FALSE。 1.NULL 的比较规则 在
  • Navicat Premium 12数据库管理解决方案

    Navicat Premium 12数据库管理解决方案
    Navicat Premium 12是一款全面的数据库管理工具,支持多种数据库系统如MySQL、MariaDB、Oracle、SQL Server、PostgreSQL等。它提供了多数据库连接、数据
  • sqlite3命令行工具使用介绍
    一、启动与退出 启动数据库连接 1 2 3 sqlite3 [database_file] # 打开/创建数据库文件(如 test.db) sqlite3 # 启动临时内存数据库 (:memory:) sqlite3 :m
  • StarRocks简介与搭建使用介绍

    StarRocks简介与搭建使用介绍
    StarRocks简介 StarRocks 是一款高速、实时、全场景的MPP(大规模并行处理)分析型数据库系统,专为现代数据分析场景设计,强调亚秒级查询性
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计