狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

炸鍋了,PostgreSQL表1億行,居然有人不做分區?

admin
2024年2月1日 16:28 本文熱度 812
  • 🚀 1.分區表

    • 🌈 1.1 什么是表分區

    • 🌈 1.2 為什么需要表分區

    • 🌈 1.3 分區表的優缺點

  • 🚀 2.分區表的類型

    • 🌈 2.1 RANGE分區

    • 🌈 2.2 LIST分區

    • 🌈 2.3 HASH 分區

  • 🚀 3.分區表常用命令

  • 🚀 4.總結

PG表分區,是指根據一定規則,將數據庫中的一張表分解成多個更小的,容易管理的部分,本文做了詳細的說明。

下面由邦德老師,給大家詳細的介紹下PostgreSQL的分區吧~

🚀 1.分區表

🌈 1.1 什么是表分區

分區表就是根據分區策略,將數據數據分散到不同的子表中,
并通過父表建立關聯關系,從而實現數據物理上的分區
PostgreSQL 10.x 之前的版本提供了一種“手動”方式使用分區表的方式,
需要使用繼承 + 觸發器的來實現分區表,
步驟較為繁瑣,需要定義附表、子表、
子表的約束、創建子表索引,創建分區刪除、修改,觸發器等。

PostgreSQL 10.x 開始提供了內置分區表(內置是相對于 10.x 之前的手動方式)。
內置分區簡化了操作,將部分操作內置,
最終簡單三步就能夠創建分區表。
但是只支持范圍分區(RANGE)和列表分區(LIST),
11.x 版本添加了對 HASH 分區。

🌈 1.2 為什么需要表分區

1.可以讓單表存儲更多的數據。
2.分區表的數據更容易維護,可以通過清除整個分區批量刪除大量數據,
也可以增加新的分區來支持新插入的數據。
另外,還可以對一個獨立分區進行優化、檢查、修復等操作。
3.部分查詢能夠從查詢條件確定只落在少數分區上,查詢速度會很快。
4.分區表的數據還可以分布在不同的物理設備上,從而高效利用多個硬件設備。
5.可以使用分區表來避免某些特殊瓶頸,
可以備份和恢復單個分區。

🌈 1.3 分區表的優缺點

優點:
(1)**數據維護成本降低。某一部分數據需要失效,
不需要執行命令來更新數據,可以直接接觸綁定關系,
接觸綁定的數據和分區表都依然保留,需要時可以隨時恢復。
(2)一個表只能放在一個物理空間上,使用分區表之后可以將不同的表放置在不同的物理空間上,
從而達到冷數據放在廉價的物理機器上,熱點數據放置在性能強勁的機器上。
(3)直接從分區表查詢數據比從一個大而全的全量數據表中讀取數據效率更高。


缺點:
(1)性能上的兩面性。性能上通過分區表的父表查數據相對于普通的數據全量表查詢效率要低。
直接分區表中查詢數據比在全量表中查詢數據效率要高。
(2)10.x 版本不支持跨分區更新,11.x 版本中才支持快分區的更新。
(3)主鍵有可能重復。由于分區表的的主鍵約束都是分別建立的,
因此可能存在主鍵重復。只能通過一些策略來規避主鍵相同的問題。

🚀 2.分區表的類型

🌈 2.1 RANGE分區

對于范圍分區,數據根據所選范圍劃分為段。當您需要訪問時間序列數據時,提供日期(例如年份和月份)很有用

創建父表
CREATE TABLE orders (
 id serial,
 user_id int4,
 create_time timestamp(0) 
) PARTITION BY RANGE(create_time);
創建分區表
CREATE TABLE orders_hisotry PARTITION OF orders FOR VALUES FROM ('2000-01-01') TO ('2020-03-01');
CREATE TABLE orders_202003 PARTITION OF orders FOR VALUES FROM ('2020-03-01') TO ('2020-04-01');
CREATE TABLE orders_202004 PARTITION OF orders FOR VALUES FROM ('2020-04-01') TO ('2020-05-01');
CREATE TABLE orders_202005 PARTITION OF orders FOR VALUES FROM ('2020-05-01') TO ('2020-06-01');
CREATE TABLE orders_202006 PARTITION OF orders FOR VALUES FROM ('2020-06-01') TO ('2020-07-01');
在分區上創建索引
CREATE INDEX order_idx_history_create_time ON orders_history USING btree(create_time);
CREATE INDEX order_idx_202003_create_time ON orders_202003 USING btree(create_time);
CREATE INDEX order_idx_202004_create_time ON orders_202004 USING btree(create_time);
CREATE INDEX order_idx_202005_create_time ON orders_202005 USING btree(create_time);
CREATE INDEX order_idx_202006_create_time ON orders_202006 USING btree(create_time);

🌈 2.2 LIST分區

在列表分區中,數據根據已指定的離散值進行分區。當需要對地區、部門等離散數據進行任意值分組時,這種方法效果很好

postgres=# CREATE TABLE cities (
    city_id      bigint not null,
    name         text   not null,
    population   bigint
) PARTITION BY LIST (name);

CREATE TABLE cities_1 PARTITION OF cities FOR VALUES IN ('A');
CREATE TABLE cities_2 PARTITION OF cities FOR VALUES IN ('B');
CREATE TABLE cities_3 PARTITION OF cities FOR VALUES IN ('C');
CREATE TABLE cities_4 PARTITION OF cities FOR VALUES IN ('D');

postgres=# \d+
                                        List of relations
 Schema |             Name              |       Type        |  Owner   |    Size    | Description
--------+-------------------------------+-------------------+----------+------------+-------------
 public | cities                        | partitioned table | postgres | 0 bytes    | 
 public | cities_1                      | table             | postgres | 8192 bytes | 
 public | cities_2                      | table             | postgres | 8192 bytes | 
 public | cities_3                      | table             | postgres | 8192 bytes | 
 public | cities_4                      | table             | postgres | 8192 bytes |  
(5 rows)

postgres=# select * from pg_inherits;
 inhrelid | inhparent | inhseqno 
----------+-----------+----------
    16727 |     16724 |        1
    16733 |     16724 |        1
    16739 |     16724 |        1
    16745 |     16724 |        1
(4 rows)
————————————————

🌈 2.3 HASH 分區

每個分區的數據通過提供模數和余數來分區。
每個分區將包含模數除以分區鍵的哈希值得到給定余數的行。
當您希望通過幾乎均勻地分布數據來避免對單個表的訪問集中時,這種方法很有效。

CREATE TABLE emp (emp_id int, emp_name text, dep_code int)
PARTITION BY HASH (emp_id);


CREATE TABLE emp_0 PARTITION OF emp FOR VALUES WITH (MODULUS 3,REMAINDER 0);
CREATE TABLE emp_1 PARTITION OF emp FOR VALUES WITH (MODULUS 3,REMAINDER 1);
CREATE TABLE emp_2 PARTITION OF emp FOR VALUES WITH (MODULUS 3,REMAINDER 2);

🚀 3.分區表常用命令

查看分區表和每個分區的行數
SELECT relname,reltuples as rows FROM pg_class
WHERE relname IN ('emp','emp_0','emp_1','emp_2')
ORDER BY relname;

從分區表中分離分區
ALTER TABLE emp DETACH PARTITION emp_0;

重命名分區
ALTER TABLE emp_0 RENAME TO emp_0_bkp;

添加新的分區
ALTER TABLE table_name ADD PARTITION partition_name VALUES LESS THAN ('value');

刪除現有的分區
ALTER TABLE table_name DROP PARTITION partition_name;

查看所有分區信息
SELECT * FROM pg_partitions WHERE tablename = 'table_name';

🚀 4.總結

簡而言之,分區是關系數據庫中用于將大表分解為較小分區的一種方法。這有助于更快地對大表執行查詢。在本文中,您學習了以上3種類型的 PostgreSQL 分區以及如何使用它們。


該文章在 2024/2/1 23:08:25 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved