最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GP如何查詢并刪除重復(fù)數(shù)據(jù)

 更新時(shí)間:2023年11月28日 10:43:14   作者:芊欣欲  
這篇文章主要介紹了GP如何查詢并刪除重復(fù)數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在數(shù)據(jù)庫中做增刪查改時(shí),難免會(huì)因?yàn)檎`操作導(dǎo)致數(shù)據(jù)庫中存在一些重復(fù)數(shù)據(jù),那么如何定位這些重復(fù)數(shù)據(jù)并且刪除呢?本文將介紹在Greenplum數(shù)據(jù)庫中如何實(shí)現(xiàn)查詢并刪除重復(fù)數(shù)據(jù)的方法。

PostgreSQL與Greenplum的關(guān)系

眾所周知,Greenplum是通過postgresql的底層實(shí)現(xiàn)的,所以postgresql中90%的語法都可以在greenplum中實(shí)現(xiàn),但是GP數(shù)據(jù)庫的特點(diǎn)也是其最津津樂道的優(yōu)點(diǎn)是其為分布式并行數(shù)據(jù)庫。

大家應(yīng)該都聽過很多關(guān)于分布式的優(yōu)點(diǎn)、好處等,不過作為初學(xué)者,這個(gè)概念還是過于抽象,乍一聽感覺沒什么,使用起來也只是在建表的時(shí)候更注重distributed by key而已,但實(shí)際上分布式的表結(jié)構(gòu)就注定了GP要實(shí)現(xiàn)某些功能就注定要與Postgre背道而馳,尤其是在表結(jié)構(gòu)本身的問題上,這個(gè)現(xiàn)象會(huì)在下文中得到具體的展示。

GP查詢重復(fù)數(shù)據(jù)

GP查詢重復(fù)數(shù)據(jù)方面和Postgre的底層邏輯是一致的,且有許多種方法,主要思想即為利用每行數(shù)據(jù)的唯一標(biāo)識(shí)(可以是一列也可以是多列)進(jìn)行查詢并計(jì)數(shù),數(shù)量大于1的數(shù)據(jù)即為重復(fù)數(shù)據(jù)。

具體實(shí)現(xiàn)方法這里僅作簡單地介紹。

1. row_number()函數(shù)

利用row_number() over(partition by col1, col2) as rn語句可以輕松對數(shù)據(jù)進(jìn)行分類聚合后計(jì)數(shù),再篩選rn > 1的數(shù)據(jù)即為重復(fù)數(shù)據(jù)(關(guān)于此函數(shù)的介紹詳情請看本人PL/pgSQL自學(xué)之路系列文章)。

2. having函數(shù)

此方法有點(diǎn)即為與postgre查詢重復(fù)數(shù)據(jù)方法高度一致,也為后續(xù)刪除重復(fù)數(shù)據(jù)奠定一定基礎(chǔ),缺點(diǎn)是對于多列作為數(shù)據(jù)唯一標(biāo)識(shí)的情況下語句稍顯復(fù)雜,下面將分別展示單列、多列作為unique id時(shí),利用having函數(shù)查重的具體語句:

1)單列作為unique id時(shí)

select "POSITION_NAME","CMEMO","SUPERINTENDENT_MAN_NAME","SUPERINTENDENT_MAN_NAME" 
from  "DCS_RISK"
where "ID" in (select  "ID" from   "DCS_RISK"  group by "ID"    having count ("ID") > 1)

2)多列作為unique id時(shí)

select "POSITION_NAME","CMEMO","SUPERINTENDENT_MAN_NAME","SUPERINTENDENT_MAN_NAME" 
from  "DCS_RISK"
where "ID" in (select  "ID" from   "DCS_RISK"  group by "ID"    having count ("ID") > 1)

PostgreSQL刪除重復(fù)數(shù)據(jù)

在介紹GP如何刪除重復(fù)數(shù)據(jù)之前,首先我們來看PostgreSQL作為GP的大哥,是如何實(shí)現(xiàn)這一功能的。

原理:利用ctid區(qū)分重復(fù)數(shù)據(jù)。

ctid是什么?

在展示具體代碼之前,我先簡單介紹下ctid是什么,以便初學(xué)者理解為何可以通過ctid實(shí)現(xiàn)這一功能。

這里引用一下postgresql的ctid中對于ctid的定義:

  • ctid表示數(shù)據(jù)行在它所處的表內(nèi)的物理位置,ctid字段的類型是tid。盡管ctid可以快速定位數(shù)據(jù)行,每次vacuum
  • full之后,數(shù)據(jù)行在塊內(nèi)的物理位置就會(huì)移動(dòng),即ctid會(huì)發(fā)生變化,所以ctid不能作為長期的行標(biāo)識(shí)符,應(yīng)該使用主鍵來標(biāo)識(shí)一個(gè)邏輯行。

根據(jù)此定義不難發(fā)現(xiàn),ctid有能夠起到一定的數(shù)據(jù)標(biāo)識(shí)符的作用,但在某些特定的場景下,它也不是那么可靠,這為后續(xù)GP實(shí)現(xiàn)刪除功能埋下了重要伏筆。

流程

1)查詢要?jiǎng)h除的數(shù)據(jù)——上文已介紹

2)重復(fù)的數(shù)據(jù)保留其中的一行——利用min(ctid)或者max(ctid)

3)刪除其余的數(shù)據(jù)

示例代碼

delete from emp where ctid not in (select min(ctid) from emp group by id);

GP刪除重復(fù)數(shù)據(jù)

本文的重頭戲來了,按照慣有思路,我們可以一脈相承postgre的思路和代碼,這里先賣個(gè)關(guān)子,我們不妨試試看如果這么做會(huì)發(fā)生什么。

發(fā)生了報(bào)錯(cuò):

這條報(bào)錯(cuò)信息里也給了錯(cuò)誤提示和修改建議,大概意思是只用ctid無法得到唯一的數(shù)據(jù)行(實(shí)際上我已經(jīng)加了一些其他的字段以保證是唯一的數(shù)據(jù)行,但gp會(huì)把這個(gè)語句識(shí)別為語法錯(cuò)誤而非邏輯錯(cuò)誤)。

在解決之前,不妨先思考一下為什么會(huì)出現(xiàn)這種情況:因?yàn)镚P是分布式并行數(shù)據(jù)庫!分布式意味著同一張表上的數(shù)據(jù)會(huì)由于你設(shè)置的分布鍵的不同而存儲(chǔ)在不同的segment上,那么根據(jù)ctid的定義很可能某些在不同segment上的數(shù)據(jù)由于在其segment上面的相對位置相同,所以會(huì)擁有相同的ctid,這時(shí)就會(huì)出現(xiàn)報(bào)錯(cuò)中提到的問題——僅用ctid無法確保得到的是unique row。

對此我們可以進(jìn)行驗(yàn)證:

同一個(gè)ctid在一張表里查出了多行完全不同的數(shù)據(jù),驗(yàn)證了我們之前的猜想。

解決方案:

加入gp_segment_id字段與ctid結(jié)合共同定位數(shù)據(jù)行.

代碼:

可能有更簡潔的寫法,此處僅提供一種可以實(shí)現(xiàn)的代碼供參考。

delete from table_name
where (gp_segment_id, ctid)in(
select gp_segment_id, ctid from(
select gp_segment_id,
       ctid,
       *,
       row_number() over (partition by col1, col2, col3, col4) as rn
from  table_name
where (col1, col2, col3, col4) in
      (select  col1, col2, col3, col4
       from phm.phmot_crm_order
       group by col1, col2, col3, col4
       having count (*) > 1)
order by gp_segment_id, ctid
) as df1
where rn > 1
order by gp_segment_id
);

GP判斷重復(fù)數(shù)據(jù)

當(dāng)然解決問題最好從問題的源頭進(jìn)行解決,避免在同一張表中插入重復(fù)數(shù)據(jù)可以減少我們需要?jiǎng)h除重復(fù)數(shù)據(jù)的需求,在gp乃至postgresql中用如下方式可避免重復(fù)插入數(shù)據(jù):

--先給表創(chuàng)建一個(gè)唯一性約束
alter table 表名 add constraint 約束名 unique(goods_id, user_id, enterprise_id);

INSERT INTO 表名 ( sku, goods_id, user_id, enterprise_id, create_date, create_user_id )
VALUES( ‘222', 14851, 1154, 1263,‘2020-04-16 20:26:32', 1153 )
ON CONFLICT ON CONSTRAINT 約束名 DO NOTHING;

總結(jié)

本文介紹了GP數(shù)據(jù)庫實(shí)現(xiàn)查詢和刪除重復(fù)數(shù)據(jù)的幾種方案以及原理,相信讀者們通過此案例可以對分布式數(shù)據(jù)庫以及底層數(shù)據(jù)庫和衍生的數(shù)據(jù)庫的異同點(diǎn)有了初步的感知。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • postgresql刪除主鍵的操作

    postgresql刪除主鍵的操作

    這篇文章主要介紹了postgresql刪除主鍵的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • CentOS 7下安裝PostgreSQL 9.6的教程分享

    CentOS 7下安裝PostgreSQL 9.6的教程分享

    PostgreSQL在我心目中的地位要遠(yuǎn)遠(yuǎn)高于MySQL,雖然流行對比MySQL低很對,但是功能性一致走在MySQL的前面。下面這篇文章主要介紹了CentOS 7下安裝PostgreSQL數(shù)據(jù)庫的方法,需要的朋友可以參考借鑒,一起來看看吧。
    2017-02-02
  • PostgreSQL數(shù)據(jù)庫實(shí)現(xiàn)公網(wǎng)遠(yuǎn)程連接的操作步驟

    PostgreSQL數(shù)據(jù)庫實(shí)現(xiàn)公網(wǎng)遠(yuǎn)程連接的操作步驟

    PostgreSQL是一個(gè)功能非常強(qiáng)大的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),本文呢將簡單幾步通過cpolar 內(nèi)網(wǎng)穿透工具即可現(xiàn)實(shí)本地postgreSQL 遠(yuǎn)程訪問,需要的朋友可以參考下
    2023-09-09
  • PostgreSQL .history 文件詳解

    PostgreSQL .history 文件詳解

    本文解釋了PostgreSQL的.history文件(時(shí)間線歷史文件)的重要性、格式、作用及備份恢復(fù)方案,該文件記錄時(shí)間線切換事件,對PITR、備庫構(gòu)建和pg_rewind等操作至關(guān)重要,誤刪會(huì)導(dǎo)致備份失敗、備庫重建等問題,感興趣的朋友一起看看吧
    2026-04-04
  • Postgresql的pl/pgql使用操作--將多條執(zhí)行語句作為一個(gè)事務(wù)

    Postgresql的pl/pgql使用操作--將多條執(zhí)行語句作為一個(gè)事務(wù)

    這篇文章主要介紹了Postgresql的pl/pgql使用操作--將多條執(zhí)行語句作為一個(gè)事務(wù),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL中的OID和XID 說明

    PostgreSQL中的OID和XID 說明

    在PostgreSQL中經(jīng)常碰到OID和XID,剛才不明白這些東西是干什么的。
    2009-09-09
  • PostgreSQL表膨脹監(jiān)控案例(精確計(jì)算)

    PostgreSQL表膨脹監(jiān)控案例(精確計(jì)算)

    這篇文章主要介紹了PostgreSQL表膨脹監(jiān)控案例(精確計(jì)算),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL實(shí)現(xiàn)數(shù)據(jù)表跨庫同步的四種方案

    PostgreSQL實(shí)現(xiàn)數(shù)據(jù)表跨庫同步的四種方案

    文章詳細(xì)介紹了四種用于實(shí)現(xiàn)PostgreSQL數(shù)據(jù)庫表數(shù)據(jù)變化實(shí)時(shí)或定時(shí)同步到另一個(gè)獨(dú)立PG庫的方法,包括觸發(fā)器+外部表、邏輯復(fù)制、Debezium+Kafka和pg_dump定時(shí)任務(wù),針對不同場景和需求,推薦了最適合的方案,并詳細(xì)闡述了各自的優(yōu)點(diǎn)、適用場景、配置方法和使用注意事項(xiàng)
    2026-05-05
  • PostgreSQL字符切割:substring函數(shù)的用法說明

    PostgreSQL字符切割:substring函數(shù)的用法說明

    這篇文章主要介紹了PostgreSQL字符切割:substring函數(shù)的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • docker安裝Postgresql數(shù)據(jù)庫及基本操作

    docker安裝Postgresql數(shù)據(jù)庫及基本操作

    PostgreSQL是一個(gè)強(qiáng)大的開源對象-關(guān)系型數(shù)據(jù)庫管理系統(tǒng),以其高可擴(kuò)展性和標(biāo)準(zhǔn)化而著稱,這篇文章主要介紹了docker安裝Postgresql數(shù)據(jù)庫及基本操作的相關(guān)資料,需要的朋友可以參考下
    2025-03-03

最新評(píng)論

西宁市| 竹北市| 舞钢市| 海丰县| 古蔺县| 武川县| 台安县| 白城市| 潼关县| 思茅市| 宜兰县| 莎车县| 米泉市| 宜昌市| 绥宁县| 达州市| 濮阳市| 横峰县| 峨眉山市| 轮台县| 丹江口市| 南靖县| 鹿泉市| 德保县| 沙洋县| 房山区| 浠水县| 承德县| 神木县| 石城县| 东源县| 合江县| 中西区| 荥阳市| 梁河县| 巴彦县| 桂平市| 台南县| 泗阳县| 高安市| 洞口县|