Postgresql刪除數(shù)據(jù)庫表中重復數(shù)據(jù)的幾種方法詳解
一直使用Postgresql數(shù)據(jù)庫,有一張表是這樣的:
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,隨著數(shù)據(jù)表的越來越大(70w),即便我建立了索引,查詢效率依然不樂觀。
使用GUID作為數(shù)據(jù)庫的主鍵對分布式應用比較友好,但是不利于數(shù)據(jù)的插入,可以使用類似ABP的方法生成連續(xù)的GUID解決這個問題。
為了進行優(yōu)化,計劃使用DeviceId與Timestamp作為主鍵,由于主鍵會自動建立索引,使用這兩個字段查詢的時候,查詢效率可以有很大的提升。不過,由于數(shù)據(jù)庫的插入了很多的重復數(shù)據(jù),直接切換主鍵不可行,需要先剔除重復數(shù)據(jù)。
使用group by
數(shù)據(jù)量小的時候適用。對于我這個70w的數(shù)據(jù),查詢運行了半個多小時也無法完成。
DELETE FROM "DeviceData"
WHERE "Id"
NOT IN (
SELECT max("Id")
FROM "DeviceData_temp"
GROUP BY "DeviceId", "Timestamp"
);使用DISTINCT
建立一張新表然后插入數(shù)據(jù),或者使用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",那么可能出現(xiàn)"Timestamp", "DeviceId"重復的現(xiàn)象。
使用ON CONFLICT
如果我們直接建立新表格,設置好新的主鍵,然后插入數(shù)據(jù),如果重復了就跳過不就行了?但是使用select into是不行了,重復的數(shù)據(jù)會導致語句執(zhí)行中斷。需要借助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";執(zhí)行不到100s就完成了,刪除了許多重復數(shù)據(jù)。
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接
相關文章
快速解決PostgreSQL中的Permission denied問題
這篇文章主要介紹了快速解決PostgreSQL中的Permission denied問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Postgresql數(shù)據(jù)庫SQL字段拼接方法
Postgresql里面內(nèi)置了很多的實用函數(shù),下面這篇文章主要給大家介紹了關于Postgresql數(shù)據(jù)庫SQL字段拼接方法的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11
Docker安裝PostgreSQL數(shù)據(jù)庫的詳細步驟
這篇文章主要介紹了Docker安裝PostgreSQL數(shù)據(jù)庫的詳細步驟,包括啟動PostgreSQL容器、獲取容器的IP地址、啟動一個新的CentOS容器、在CentOS容器中安裝PostgreSQL客戶端、通過psql客戶端連接到PostgreSQL容器和在PostgreSQL中執(zhí)行SQL操作等內(nèi)容,需要的朋友可以參考下2024-10-10
postgresql數(shù)據(jù)庫根據(jù)年月查詢出本月的所有數(shù)據(jù)操作
這篇文章主要介紹了postgresql數(shù)據(jù)庫根據(jù)年月查詢出本月的所有數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Postgresql數(shù)據(jù)庫密碼忘記的詳細解決方法
在使用PostgreSQL數(shù)據(jù)庫時,忘記數(shù)據(jù)庫密碼可能會影響到正常的開發(fā)和維護工作,這篇文章主要介紹了Postgresql數(shù)據(jù)庫密碼忘記的詳細解決方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-06-06

