目錄
前言
一、分區(qū)表基本原理
二、分區(qū)表主要優(yōu)勢(shì)
三、分區(qū)表常見場(chǎng)景
四、GaussDB分區(qū)表管理(示例)
示例一:創(chuàng)建范圍分區(qū)表(RANGE)
示例二:創(chuàng)建哈希分區(qū)表(HASH)
示例三:創(chuàng)建列表分區(qū)(LIST)
五、總結(jié)
前言
本文將介紹GaussDB云數(shù)據(jù)庫(kù)的分區(qū)表技術(shù),包括原理、優(yōu)勢(shì)以及如何使用。通過本文,您將了解到如何利用GaussDB云數(shù)據(jù)庫(kù)的分區(qū)表功能提高數(shù)據(jù)存儲(chǔ)和查詢性能。
一、分區(qū)表基本原理
- 分區(qū)表是一種數(shù)據(jù)組織方式,將一張大表按照某個(gè)字段的值進(jìn)行劃分,形成多個(gè)小表。每個(gè)小表獨(dú)立管理,具有獨(dú)立的索引和存儲(chǔ)空間。這種方式可以提高查詢性能和降低存儲(chǔ)成本。
- 在GaussDB云數(shù)據(jù)庫(kù)中,分區(qū)表可以根據(jù)用戶需求自動(dòng)或手動(dòng)創(chuàng)建。目前行存表支持范圍分區(qū)、哈希分區(qū)、列表分區(qū),列存表僅支持范圍分區(qū)。
二、分區(qū)表主要優(yōu)勢(shì)
- 查詢性能提升?:分區(qū)表將數(shù)據(jù)分散到多個(gè)小表中,使得查詢時(shí)只需掃描對(duì)應(yīng)小表的數(shù)據(jù),減少了掃描的范圍,從而提高了查詢速度。
- 數(shù)據(jù)維護(hù)便捷?:對(duì)于大型表,數(shù)據(jù)維護(hù)變得非常困難。而分區(qū)表可以將數(shù)據(jù)分散到多個(gè)小表中,使得數(shù)據(jù)維護(hù)更加便捷。例如,對(duì)某個(gè)分區(qū)進(jìn)行刪除操作時(shí),只需要?jiǎng)h除該分區(qū)對(duì)應(yīng)的小表即可。
- 擴(kuò)展性好?:隨著業(yè)務(wù)的發(fā)展,數(shù)據(jù)量會(huì)不斷增加。分區(qū)表可以根據(jù)業(yè)務(wù)需求動(dòng)態(tài)調(diào)整分區(qū)數(shù)量,以滿足更高的查詢性能和存儲(chǔ)需求。
三、分區(qū)表常見場(chǎng)景
- 大數(shù)據(jù)處理:在處理大量數(shù)據(jù)時(shí),分區(qū)表可以顯著提高查詢性能和存儲(chǔ)效率。通過將數(shù)據(jù)按照某個(gè)字段進(jìn)行分區(qū),可以減少掃描的數(shù)據(jù)量,從而提高查詢速度。
- 高并發(fā)訪問:分區(qū)表可以有效地降低單個(gè)表的鎖競(jìng)爭(zhēng),提高并發(fā)訪問能力。當(dāng)多個(gè)用戶同時(shí)訪問一個(gè)分區(qū)表時(shí),每個(gè)用戶只能訪問到自己需要的部分?jǐn)?shù)據(jù),降低了鎖沖突的可能性。
關(guān)于GaussDB,若要把普通表轉(zhuǎn)成分區(qū)表,需要新建分區(qū)表,然后把普通表中的數(shù)據(jù)導(dǎo)入到新建的分區(qū)表中。因此在初始設(shè)計(jì)表時(shí),請(qǐng)根據(jù)業(yè)務(wù)提前規(guī)劃是否使用分區(qū)表。
四、GaussDB分區(qū)表管理(示例)
示例一:創(chuàng)建范圍分區(qū)表(RANGE)
范圍分區(qū)表:將數(shù)據(jù)基于范圍映射到每一個(gè)分區(qū),這個(gè)范圍是由創(chuàng)建分區(qū)表時(shí)指定的分區(qū)鍵決定的。這種分區(qū)方式是最為常用的,并且分區(qū)鍵經(jīng)常采用日期,例如將銷售數(shù)據(jù)按照月份進(jìn)行分區(qū)。
1、創(chuàng)建一個(gè)按年份分區(qū)的訂單表:
--創(chuàng)建范圍分區(qū)表(RANGE) DROP TABLE orders_1; CREATE TABLE orders_1 ( id INT PRIMARY KEY, order_date CHAR(4) , customer_id INT, product_name VARCHAR(255) ) PARTITION BY RANGE (order_date) ( PARTITION p1 VALUES LESS THAN (2021), PARTITION p2 VALUES LESS THAN (2022), PARTITION p3 VALUES LESS THAN (2023), PARTITION P4 VALUES LESS THAN(MAXVALUE)); --查看創(chuàng)建的分區(qū)表信息 select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_1'); |
2、寫入測(cè)試數(shù)據(jù)并訪問
--插入測(cè)試數(shù)據(jù) INSERT INTO orders_1(id,order_date,customer_id,product_name)VALUES(1001,'2021',100,'商品A'); INSERT INTO orders_1(id,order_date,customer_id,product_name)VALUES(1002,'2022',200,'商品B'); INSERT INTO orders_1(id,order_date,customer_id,product_name)VALUES(1003,'2023',300,'商品C'); --訪問分區(qū)表: -- 只查詢2020年的數(shù)據(jù) SELECT * FROM orders_1 WHERE order_date = 2021; -- 查詢2020年至2022年的數(shù)據(jù) SELECT * FROM orders_1 WHERE order_date BETWEEN 2021 AND 2022; -- 只查詢2020年之后的數(shù)據(jù)(超出范圍的數(shù)據(jù)將被過濾掉) SELECT * FROM orders_1 WHERE order_date >= 2021; |
3、刪除/增加/修改
--DROP ALTER TABLE orders_1 DROP PARTITION P5; --ADD ALTER TABLE orders_1 ADD PARTITION P4 VALUES LESS THAN (2024); ALTER TABLE orders_1 ADD PARTITION P6 VALUES LESS THAN (2025); ALTER TABLE orders_1 ADD PARTITION P10 VALUES LESS THAN (MAXVALUE); --RENAME ALTER TABLE orders_1 RENAME PARTITION P10 TO P5; --查看創(chuàng)建的分區(qū)表信息 select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_1') ; |
示例二:創(chuàng)建哈希分區(qū)表(HASH)
哈希分區(qū)表:將數(shù)據(jù)根據(jù)內(nèi)部哈希算法依次映射到每一個(gè)分區(qū)中,包含的分區(qū)個(gè)數(shù)由創(chuàng)建分區(qū)表時(shí)指定。
1、假設(shè)我們有一個(gè)名為orders_2的大表,包含id(訂單ID)、customer_id(客戶ID)、order_date(訂單日期)等字段?,F(xiàn)在我們需要根據(jù)customer_id進(jìn)行分區(qū),以便更好地管理和查詢這些數(shù)據(jù)。
--創(chuàng)建哈希分區(qū)表(HASH) drop TABLE orders_2; CREATE TABLE orders_2 ( id INT PRIMARY KEY, customer_id INT, order_date DATE ) PARTITION BY HASH (customer_id) ( partition p1, partition p2 ); --查看創(chuàng)建的分區(qū)表信息 select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_2'); |
2、寫入測(cè)試數(shù)據(jù)并訪問
--插入測(cè)試數(shù)據(jù) INSERT INTO orders_2(id,customer_id,order_date)VALUES(1001,100,date '20230613'); INSERT INTO orders_2(id,customer_id,order_date)VALUES(1002,200,date '20230614'); INSERT INTO orders_2(id,customer_id,order_date)VALUES(1003,300,date '20230615'); INSERT INTO orders_2(id,customer_id,order_date)VALUES(1004,400,date '20230612'); ----訪問分區(qū)表: --查詢customer_id 為100的訂單表信息 SELECT * FROM orders_2 WHERE customer_id =100; --查詢customer_id 為100、200的訂單表信息 SELECT * FROM orders_2 WHERE customer_id IN (100,200); --查詢customer_id 不是100、200的訂單表信息 SELECT * FROM orders_2 WHERE customer_id NOT IN (100,200); |
3、刪除
--刪除分區(qū)表 drop table DROP TABLE orders_2 ; --刪除分區(qū)數(shù)據(jù) truncate分區(qū) alter table orders_2 truncate partition p2; |
示例三:創(chuàng)建列表分區(qū)(LIST)
列表分區(qū)表:將數(shù)據(jù)中包含的鍵值分別存儲(chǔ)在不同的分區(qū)中,依次將數(shù)據(jù)映射到每一個(gè)分區(qū),分區(qū)中包含的鍵值由創(chuàng)建分區(qū)表時(shí)指定。
1、以訂單表為例,創(chuàng)建一個(gè)list分區(qū)表
--創(chuàng)建列表分區(qū)(LIST) DROP TABLE orders_3; CREATE TABLE orders_3 ( id INT PRIMARY KEY, customer_id INT, order_date DATE, product_id INT, quantity INT ) PARTITION BY LIST (customer_id) ( PARTITION p1 VALUES (100), PARTITION p2 VALUES (200), PARTITION p3 VALUES (300), PARTITION p4 VALUES (400), PARTITION p5 VALUES (500) ); --查看創(chuàng)建的分區(qū)表信息 select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_3'); |
2、寫入測(cè)試數(shù)據(jù)并訪問
--插入測(cè)試數(shù)據(jù) INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1001,100,date '20230613',1,10); INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1002,100,date '20230613',2,20); INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1003,100,date '20230613',3,30); INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1004,100,date '20230613',4,40); --訪問分區(qū)表 --根據(jù)分區(qū)字段查詢 select * from orders_3 where customer_id = 100 --根據(jù)分區(qū)P1查詢 select * from orders_3 partition (p1); |
3、ADD/TRUNCATE/DROP
--ADD,增加分區(qū) ALTER TABLE orders_3 add partition p6 values (600); --TRUNCATE,刪除分區(qū)數(shù)據(jù) ALTER TABLE orders_3 truncate partition p6; --DROP,刪除分區(qū)表 ALTER TABLE orders_3 drop partition p6; |
五、總結(jié)
GaussDB云數(shù)據(jù)庫(kù)是一款高性能、高可用的云原生關(guān)系型數(shù)據(jù)庫(kù),支持多種數(shù)據(jù)存儲(chǔ)和計(jì)算引擎。其中,分區(qū)表是GaussDB云數(shù)據(jù)庫(kù)的一項(xiàng)重要特性,在GaussDB云數(shù)據(jù)庫(kù)中使用分區(qū)表,可以幫助用戶提高查詢性能、降低存儲(chǔ)成本、方便數(shù)據(jù)維護(hù)等方面的問題。文章來源:http://www.zghlxwxcb.cn/news/detail-490434.html
——結(jié)束。文章來源地址http://www.zghlxwxcb.cn/news/detail-490434.html
到了這里,關(guān)于GaussDB云數(shù)據(jù)庫(kù)SQL應(yīng)用系列—分區(qū)表管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!