網站首頁 編程語言 正文
一直使用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://www.cnblogs.com/podolski/p/16745080.html
相關推薦
- 2021-12-08 Vmware虛擬機設置固定IP地址的方法(?圖文教程)_VMware
- 2022-04-23 uniapp用Promise封裝get和post請求
- 2022-05-21 redis數據一致性的實現示例_Redis
- 2022-09-09 C++中vector<vector<int>?>的基本使用方法_C 語言
- 2022-06-23 SQL?Server忘記sa賬號密碼重新添加新管理賬號_MsSql
- 2022-09-27 golang?防緩存擊穿singleflight的實現_Golang
- 2022-11-04 asp.net?core?認證和授權實例詳解_實用技巧
- 2022-07-27 Docker-Compose搭建Spark集群的實現方法_docker
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支