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

postgresql 刪除重復(fù)數(shù)據(jù)的幾種方法小結(jié)

 更新時(shí)間:2021年02月05日 10:03:30   作者:arcticJian  
這篇文章主要介紹了postgresql 刪除重復(fù)數(shù)據(jù)的幾種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

在使用PG數(shù)據(jù)庫(kù)的這段時(shí)間,總結(jié)了三種刪除重復(fù)數(shù)據(jù)的方法,其中最容易想到的就是最常規(guī)的刪除方法,但此方法性能較差,刪數(shù)據(jù)耗時(shí)較久,雖容易實(shí)現(xiàn),但性能太差,影響寫(xiě)數(shù)據(jù)的速率。

另外就是被使用的group by刪除方法,效率較高。

還有一種是剛發(fā)現(xiàn)的,還沒(méi)有驗(yàn)證,現(xiàn)在就總結(jié)下這三種刪除方法,并驗(yàn)證各自的執(zhí)行效率。

首先創(chuàng)建一張基礎(chǔ)表,并插入一定量的重復(fù)數(shù)據(jù)。

  test=# create table deltest(id int, name varchar(255));
  CREATE TABLE
  test=# create table deltest_bk (like deltest);
  CREATE TABLE
  test=# insert into deltest select generate_series(1, 10000), 'ZhangSan';
  INSERT 0 10000
  test=# insert into deltest select generate_series(1, 10000), 'ZhangSan';
  INSERT 0 10000
  test=# insert into deltest_bk select * from deltest;

常規(guī)刪除方法

最容易想到的方法就是判斷數(shù)據(jù)是否重復(fù),對(duì)于重復(fù)的數(shù)據(jù)只保留ctid最?。ɑ蜃畲螅┑哪菞l數(shù)據(jù),刪除其他的數(shù)據(jù)。

test=# explain analyse delete from deltest a where a.ctid <> (select min(t.ctid) from deltest t where a.id=t.id);
                               QUERY PLAN
  -----------------------------------------------------------------------------------------------------------------------------
  Delete on deltest a (cost=0.00..195616.30 rows=1518 width=6) (actual time=67758.866..67758.866 rows=0 loops=1)
    -> Seq Scan on deltest a (cost=0.00..195616.30 rows=1518 width=6) (actual time=32896.517..67663.228 rows=10000 loops=1)
     Filter: (ctid <> (SubPlan 1))
     Rows Removed by Filter: 10000
     SubPlan 1
      -> Aggregate (cost=128.10..128.10 rows=1 width=6) (actual time=3.374..3.374 rows=1 loops=20000)
         -> Seq Scan on deltest t (cost=0.00..128.07 rows=8 width=6) (actual time=0.831..3.344 rows=2 loops=20000)
            Filter: (a.id = id)
            Rows Removed by Filter: 19998
  Total runtime: 67758.931 ms
  test=# select count(*) from deltest;
  count
  -------
  10000
  (1 行記錄)

可以看到,id相同的數(shù)據(jù),保留ctid最小的那條,其他的刪除。相當(dāng)于把deltest表中的數(shù)據(jù)刪掉一半,耗時(shí)達(dá)到67s多。相當(dāng)慢。

group by刪除方法

第二種方法為group by方法,通過(guò)分組找到ctid最小的數(shù)據(jù),然后刪除其他數(shù)據(jù)。

  test=# truncate table deltest;
  TRUNCATE TABLE
  test=# insert into deltest select * from deltest_bk;
  INSERT 0 20000
  test=# explain analyse delete from deltest a where a.ctid not in (select min(ctid) from deltest group by id);
                               QUERY PLAN
  ----------------------------------------------------------------------------------------------------------------------------------
  Delete on deltest a (cost=131.89..2930.46 rows=763 width=6) (actual time=30942.496..30942.496 rows=0 loops=1)
    -> Seq Scan on deltest a (cost=131.89..2930.46 rows=763 width=6) (actual time=10186.296..30814.366 rows=10000 loops=1)
     Filter: (NOT (SubPlan 1))
     Rows Removed by Filter: 10000
     SubPlan 1
      -> Materialize (cost=131.89..134.89 rows=200 width=10) (actual time=0.001..0.471 rows=7500 loops=20000)
         -> HashAggregate (cost=131.89..133.89 rows=200 width=10) (actual time=10.568..13.584 rows=10000 loops=1)
            -> Seq Scan on deltest (cost=0.00..124.26 rows=1526 width=10) (actual time=0.006..3.829 rows=20000 loops=1)
   Total runtime: 30942.819 ms
  (9 行記錄)
  test=# select count(*) from deltest;
   count
  -------
  10000
  (1 行記錄)

可以看到同樣是刪除一半的數(shù)據(jù),使用group by的方式,時(shí)間節(jié)省了一半。但仍含需要30s,下面試一下第三種刪除操作。

新的刪除方法

在postgres修煉之道這本書(shū)中,作者提到一種效率較高的刪除方法, 在這里驗(yàn)證一下,具體如下:

  test=# truncate table deltest;
  TRUNCATE TABLE
  test=# insert into deltest select * from deltest_bk;
  INSERT 0 20000                             
  test=# explain analyze delete from deltest a where a.ctid = any(array (select ctid from (select row_number() over (partition by id), ctid from deltest) t where t.row_number > 1));
                               QUERY PLAN
  ----------------------------------------------------------------------------------------------------------------------------------
  Delete on deltest a (cost=250.74..270.84 rows=10 width=6) (actual time=98.363..98.363 rows=0 loops=1)
  InitPlan 1 (returns $0)
   -> Subquery Scan on t (cost=204.95..250.73 rows=509 width=6) (actual time=29.446..47.867 rows=10000 loops=1)
      Filter: (t.row_number > 1)
      Rows Removed by Filter: 10000
      -> WindowAgg (cost=204.95..231.66 rows=1526 width=10) (actual time=29.436..44.790 rows=20000 loops=1)
         -> Sort (cost=204.95..208.77 rows=1526 width=10) (actual time=12.466..13.754 rows=20000 loops=1)
            Sort Key: deltest.id
            Sort Method: quicksort Memory: 1294kB
            -> Seq Scan on deltest (cost=0.00..124.26 rows=1526 width=10) (actual time=0.021..5.110 rows=20000 loops=1)
  -> Tid Scan on deltest a (cost=0.01..20.11 rows=10 width=6) (actual time=82.983..88.751 rows=10000 loops=1)
     TID Cond: (ctid = ANY ($0))
  Total runtime: 98.912 ms
  (13 行記錄)
  test=# select count(*) from deltest;
  count
  -------
  10000
  (1 行記錄)

看到上述結(jié)果,真讓我吃驚了一把,這么快的刪除方法還是首次看到,自己真實(shí)孤陋寡聞,在這里要膜拜一下修煉之道這本書(shū)的大神作者了。

補(bǔ)充:pgsql 刪除表中重復(fù)數(shù)據(jù)保留其中的一條

1.在表中(表名:table 主鍵:id)增加一個(gè)字段rownum,類(lèi)型為serial

2.執(zhí)行語(yǔ)句:

delete from table where rownum not in( 
select max(rownum) from table group by id 
)

3.最后刪除rownum

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 如何查看PostgreSQL數(shù)據(jù)庫(kù)的版本(3種方法)

    如何查看PostgreSQL數(shù)據(jù)庫(kù)的版本(3種方法)

    這篇文章主要給大家介紹了關(guān)于如何查看PostgreSQL數(shù)據(jù)庫(kù)的版本,查看PostgreSQL 數(shù)據(jù)庫(kù)的版本號(hào),可用方法很多,文中介紹了三種方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-06-06
  • postgreSQL數(shù)據(jù)庫(kù)基本概念教程

    postgreSQL數(shù)據(jù)庫(kù)基本概念教程

    這篇文章主要為大家介紹了postgreSQL數(shù)據(jù)庫(kù)的基本概念教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • PostgreSQL 自動(dòng)Vacuum配置方式

    PostgreSQL 自動(dòng)Vacuum配置方式

    這篇文章主要介紹了PostgreSQL 自動(dòng)Vacuum配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • PostgreSQL 啟動(dòng)失敗的解決方案

    PostgreSQL 啟動(dòng)失敗的解決方案

    這篇文章主要介紹了PostgreSQL 啟動(dòng)失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • postgresql 索引之 hash的使用詳解

    postgresql 索引之 hash的使用詳解

    這篇文章主要介紹了postgresql 索引之 hash的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • postgresql 刪除重復(fù)數(shù)據(jù)案例詳解

    postgresql 刪除重復(fù)數(shù)據(jù)案例詳解

    這篇文章主要介紹了postgresql 刪除重復(fù)數(shù)據(jù)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • PostgreSQL:string_agg?多列值聚合成一列的操作示例

    PostgreSQL:string_agg?多列值聚合成一列的操作示例

    PostgreSQL中的STRING_AGG()函數(shù)是一個(gè)聚合函數(shù),用于連接字符串列表并在字符串之間放置分隔符,這篇文章主要介紹了PostgreSQL:string_agg多列值聚合成一列,需要的朋友可以參考下
    2023-08-08
  • PostgreSQL有效地處理數(shù)據(jù)的加密和解密的常見(jiàn)方法

    PostgreSQL有效地處理數(shù)據(jù)的加密和解密的常見(jiàn)方法

    在信息化建設(shè)和等保建設(shè)中,都要求實(shí)現(xiàn)對(duì)用戶(hù)數(shù)據(jù)的隱私保護(hù),也就是我們常說(shuō)的脫敏,那么在?PostgreSQL?數(shù)據(jù)庫(kù)中有沒(méi)有這樣的方法或者策略可以實(shí)現(xiàn)呢,本文小編將給大家介紹一下PostgreSQL有效地處理數(shù)據(jù)的加密和解密的常見(jiàn)方法,需要的朋友可以參考下
    2025-03-03
  • postgresql運(yùn)維之遠(yuǎn)程遷移操作

    postgresql運(yùn)維之遠(yuǎn)程遷移操作

    這篇文章主要介紹了postgresql運(yùn)維之遠(yuǎn)程遷移操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • postgresql流復(fù)制原理以及流復(fù)制和邏輯復(fù)制的區(qū)別說(shuō)明

    postgresql流復(fù)制原理以及流復(fù)制和邏輯復(fù)制的區(qū)別說(shuō)明

    這篇文章主要介紹了postgresql流復(fù)制原理以及流復(fù)制和邏輯復(fù)制的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12

最新評(píng)論

美姑县| 崇阳县| 龙井市| 榆社县| 万年县| 南岸区| 青冈县| 绍兴县| 抚远县| 三都| 嘉定区| 犍为县| 乡城县| 晴隆县| 教育| 宜宾市| 沐川县| 九江县| 阳信县| 玉龙| 疏附县| 休宁县| 南木林县| 称多县| 安达市| 东宁县| 富平县| 招远市| 厦门市| SHOW| 邻水| 准格尔旗| 章丘市| 永德县| 芮城县| 徐水县| 青铜峡市| 甘洛县| 威远县| 金堂县| 宁南县|