達夢資料庫——壓縮

来源:https://www.cnblogs.com/kakarotto-chen/archive/2023/11/20/17840464.html
-Advertisement-
Play Games

DM8壓縮表 0、結論 行表(普通表)不支持壓縮。但是語法支持。建表之後,查詢到的占用空間會比普通表小一半。 經過測試,裝10萬數據(兩個欄位),壓縮的、未壓縮,占用空間一樣大。 列表(huge表)支持壓縮。可以壓縮表(就是壓縮所有列),也可以選擇壓縮列。但是建表的時候就要設置,否則建好表之後修改不 ...


DM8壓縮表

0、結論

  • 行表(普通表)不支持壓縮但是語法支持。建表之後,查詢到的占用空間會比普通表小一半。

    • 經過測試,裝10萬數據(兩個欄位),壓縮的、未壓縮,占用空間一樣大。
  • 列表(huge表)支持壓縮。可以壓縮表(就是壓縮所有列),也可以選擇壓縮列。但是建表的時候就要設置,否則建好表之後修改不成壓縮表或壓縮列。

    • 經過測試,裝10萬數據(兩個欄位),壓縮級別9(最高),壓縮所有欄位。壓縮的、未壓縮的相差600MB左右。

image!

-- 查詢dm資料庫信息(包含版本)
select * from v$instance;
-- 查詢dm資料庫版本
select * from v$version;
-- 查詢版本時間
select id_code;

1、需求:

2、壓縮表、壓縮列

COMPRESS關鍵字

  • 建表:普通表

(見官方文檔:https://eco.dameng.com/document/dm/zh-cn/pm/definition-statement.html#3.5 管理表)

  • 建表:huge表

(見官方文檔:https://eco.dameng.com/document/dm/zh-cn/pm/definition-statement.html#3.5.1.3 定義 HUGE 表)

2.1、普通表(行式存儲表)

  • 語法支持,功能已經取消
  • 但是設置了壓縮的表,初始占用空間會變小。但是放同樣的數據,大小沒有區別。

image"

  • 建表語句
-- 壓縮表
create table "CS_YT1"."TABLE_3"
(
	"COLUMN_1" CHAR(10) not null ,
	"COLUMN_2" CHAR(10),
	"COLUMN_3" CHAR(10),
	primary key("COLUMN_1")
)
storage(initial 1, next 1, minextents 1, fillfactor 0)
compress;

-- 壓縮列
create table "CS_YT1"."TABLE_3"
(
	"COLUMN_1" CHAR(10) not null ,
	"COLUMN_2" CHAR(10),
	"COLUMN_3" CHAR(10),
	primary key("COLUMN_1")
)
storage(initial 1, next 1, minextents 1, fillfactor 0)
compress ("COLUMN_1","COLUMN_2","COLUMN_3");
  • 測試建表,查看大小

image

2.2、HUGE表——列式存儲表(大表)

image

image

  • 壓縮級別、壓縮類型
1. <壓縮級別> 指定列的壓縮級別,有效值範圍為:0~10,分別代表不同的壓縮演算法和壓縮級別。有兩種壓縮演算法:SNAPPY 和 ZIP。10 採用 SNAPPY 演算法輕量級方式壓縮。2~9 採用 ZIP 演算法壓縮,2~9 代表壓縮級別,值越小表示壓縮比越低、壓縮速率越快;值越大表示壓縮比越高、壓縮速度越慢。0 和 1 為快捷使用,預設值為 0。0 等價於 LEVEL 2;1 等價於 LEVEL 9;

2. < 壓縮類型 > 指定列壓縮類型。FOR 'QUERY [LOW]'表示進行規則壓縮;FOR 'QUERY HIGH'表示結合進行規則壓縮與通用壓縮結合,前者的壓縮比一般在 1:1 至 1:3 之間,後者一般為 1:3 至 1:5 之間。規則壓縮方式一般適用於具有一定的數據規則的數據的壓縮,例如重覆值較多等。若某列的類型為字元串類型且定義長度超過 48,則即使指定規則壓縮也無效,實際只進行通用壓縮;
  • huge表
    • 不能:新增欄位、修改欄位(類型、長度、精度)
    • 可以:修改欄位名字、給欄位加註釋、給表加註釋

image

  • 建表語句
-- 1壓縮列
CREATE HUGE TABLE "CS_YT1"."T_HUGE_COMPRESS_FIELD"
(
  "ID" VARCHAR2(50) not null ,
	"NAME" VARCHAR2(50),
	primary key("ID")
) 
STORAGE(STAT ASYNCHRONOUS EXCEPT(ID), WITH DELTA, SECTION(65536), FILESIZE(64), ON "HMAIN") 
  COMPRESS ("ID" LEVEL 3 FOR 'QUERY',"NAME" LEVEL 4 FOR 'QUERY LOW') LOG LAST ;

comment on table "CS_YT1"."T_HUGE_COMPRESS_FIELD" is '壓縮列';

-- 2壓縮表
CREATE HUGE TABLE "CS_YT1"."T_HUGE_COMPRESS"
(
  "ID" VARCHAR2(50) not null ,
	"NAME" VARCHAR2(50),
	primary key("ID")
) 
STORAGE(STAT ASYNCHRONOUS EXCEPT(ID), WITH DELTA, SECTION(65536), FILESIZE(64), ON "HMAIN") 
COMPRESS LEVEL 3 FOR 'QUERY' LOG LAST ;

comment on table "CS_YT1"."T_HUGE_COMPRESS" is '壓縮表';

-- 3不壓縮的huge表
CREATE HUGE TABLE "CS_YT1"."T_HUGE_NOCOMPRESS"
(
  "ID" VARCHAR2(50) not null ,
	"NAME" VARCHAR2(50),
	primary key("ID")
) 
STORAGE(STAT ASYNCHRONOUS EXCEPT(ID), WITH DELTA, SECTION(65536), FILESIZE(64), ON "HMAIN") ;

comment on table "CS_YT1"."T_HUGE_NOCOMPRESS" is '未壓縮的表';
  • 修改列為壓縮列

    • DM不支持
  • 新增列為壓縮列

    • 原來未壓縮的表已壓縮的表,都可以新增壓縮列
    • 達夢版本低了不支持:DM Database Server 64 V8(1-1-172-21.03.05-135967-ENT Pack1)(我們現在用的,就不行)
    • 可以去下個最新的dm試一下。
ALTER TABLE T1 ADD COLUMN COL_TEST VARCHAR(10) COMPRESS LEVEL 9;
  • 修改表壓縮表(oracle支持,dm不支持
ALTER TABLE SALES_HISTORY_COMP COMPRESS;

3、查詢

  • 查詢表信息-用USER_TABLES
-- 查詢表信息:(COMPRESSION 欄位,是否被壓縮):ENABLED被壓縮;DISABLED未被壓縮。
SELECT *
FROM DBA_TABLES
WHERE OWNER = 'CS_YT1'
--AND TABLE_NAME = 'TABLE_333333' OR TABLE_NAME = 'TABLE_1';

-- 查詢表信息2 (快,推薦)
SELECT TABLE_NAME,TABLESPACE_NAME,COMPRESSION
FROM USER_TABLES

image

  • ☆☆查詢所有類型的表的空間占用☆☆
-- 查詢表的實際占用大小、占用表空間大小(huge表都為0)
SELECT 
TABLE_USED_PAGES('CS_YT1','T_PT') * PAGE / 1024  AS "實際大小(KB)" ,
TABLE_USED_SPACE('CS_YT1','T_PT') * PAGE / 1024  AS "占用表空間大小(KB)"

3.1、普通表

3.1.1、查詢表占用大小
  • 可以使用通用查詢
-- 查看表的占用大小(單表)1(模式,表名)
SELECT TABLE_USED_SPACE('CS_YT1', 'T_HUGE_COMPRESS') * PAGE() / 1024  "占用大小(KB)";
-- 查詢表的占用大小(單表)2(模式,表名)
SELECT TABLE_USED_SPACE('CS_YT1', 'T_HUGE_COMPRESS') * PARA_VALUE / 1024 / 1024 "表占用(MB)"
  FROM V$DM_INI
 WHERE PARA_NAME LIKE 'GLOBAL_PAGE_SIZE';
 
 -- 查詢所有表所占的大小及所在空間(所有表)
SELECT 
A.OWNER AS "模式",
A.SEGMENT_NAME AS "表名",
A.BLOCKS*2 AS "對象大小(KB)",
A.BYTES/1024 AS "占用空間(KB)",
A.TABLESPACE_NAME AS "所屬表空間",
B.COMMENTS AS "表註釋" 
FROM DBA_SEGMENTS A,DBA_TAB_COMMENTS B 
WHERE 
A.OWNER=B.OWNER 
AND A.SEGMENT_NAME = B.TABLE_NAME 
AND A.OWNER='CS_YT1' 
ORDER BY SEGMENT_NAME ASC;
3.1.2、查詢表空間占用大小
  • 新建表後,已使用空間會變大、剩餘空間會變小

https://blog.csdn.net/u011595939/article/details/131168337

-- 查看資料庫文件總大小
select (select TOTAL_SIZE from V$DATABASE) *(select page())/1024/1024 as 占用大小單位MB;

-- 查看表空間使用情況
SELECT
    t.tablespace_name AS "表空間名稱",
    t.total_space AS "總空間(MB)",
    t.total_space - f.free_space AS "已使用空間(MB)",
    f.free_space AS "剩餘空間(MB)",
    ((t.total_space - f.free_space) / t.total_space) * 100 AS "已使用百分比"
FROM
    (SELECT
        tablespace_name,
        SUM(bytes) / 1024 / 1024 AS total_space
    FROM
        dba_data_files
    GROUP BY
        tablespace_name) t
JOIN
    (SELECT
        tablespace_name,
        SUM(bytes) / 1024 / 1024 AS free_space
    FROM
        dba_free_space
    GROUP BY
        tablespace_name) f ON t.tablespace_name = f.tablespace_name;

-- 查詢所有表空間的占用大小2
SELECT 

F.TABLESPACE_NAME AS 表空間名稱,
(T.TOTAL_SPACE - F.FREE_SPACE) "使用 (MB)",
F.FREE_SPACE "剩餘 (MB)",
T.TOTAL_SPACE "總大小 (MB)",
(ROUND((F.FREE_SPACE / T.TOTAL_SPACE) * 100)) || '%' "使用率(使用/總)"

FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BLOCKS *
(SELECT PARA_VALUE / 1024
FROM V$DM_INI
WHERE PARA_NAME =
'GLOBAL_PAGE_SIZE') / 1024)) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT TABLESPACE_NAME, ROUND(SUM(BYTES /
1048576)) TOTAL_SPACE
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) T
WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME;

3.2、HUGE表

3.2.1、查詢表空間
-- huge表(列存儲表)
-- HUGE表存儲在HTS(HUGE TABLESPACE)表空間上,最多可以創建32767個HUGE表空間。預設的HUGE表空間是HMAIN。查看HUGE表空間的SQL語句如下 
select * from v$HUGE_TABLESPACE;

image

3.2.2、查詢表空間大小

可以參考問答:https://eco.dameng.com/community/question/224bbb1e97def662c0b9a7701162cef6

-- 查詢HUGE列存儲空間
SELECT ID,NAME,PATHNAME
      ,ROUND(GET_DISK_SIZE(PATHNAME) / 1024/1024/1024, 2) AS "總空間(GB)"
      ,ROUND(GET_DISK_SIZE(PATHNAME) * GET_DISK_RATIO(PATHNAME) / 1024/1024/1024, 2) AS "使用(GB)"
      ,ROUND(GET_DISK_SIZE(PATHNAME) * (1 - GET_DISK_RATIO(PATHNAME)) / 1024/1024/1024, 2) AS "剩餘(GB)"
FROM V$HUGE_TABLESPACE

4、測試

4.1、準備表

  • 所有設置了壓縮的表,壓縮率都設置為9(最大壓縮率)

①T_PT: 普通表/行式表,未設置壓縮

②T_PT_COMPRESS : 普通表/行式表,設置了壓縮

③T_HUGE_NOCOMPRESS: huge表/列式表,未壓縮

④T_HUGE_COMPRESS_FIELD:huge表/列式表,壓縮一個欄位

⑤T_HUGE_COMPRESS: huge表/列式表,壓縮整個表(所有欄位)

  • 以上表,都是兩個欄位:
	"ID"   VARCHAR2(50),
	"NAME" VARCHAR2(8188)
  • 查看表是否是壓縮表
-- 查詢表信息:(COMPRESSION 欄位,是否被壓縮):ENABLED被壓縮;DISABLED未被壓縮。
SELECT TABLE_NAME,TABLESPACE_NAME,COMPRESSION
FROM DBA_TABLES
WHERE OWNER = 'CS_YT1'
AND TABLE_NAME = 'T_PT' 
OR TABLE_NAME = 'T_PT_COMPRESS'
OR TABLE_NAME = 'T_HUGE_NOCOMPRESS'
OR TABLE_NAME = 'T_HUGE_COMPRESS_FIELD'
OR TABLE_NAME = 'T_HUGE_COMPRESS'
;

image

4.2、測試條件

  • 每張表迴圈插入10萬條數據
-- 迴圈執行一條sql
DECLARE
    i NUMBER := 1;
BEGIN
    WHILE i <= 100000 LOOP
        -- 在這裡編寫你要執行的SQL語句
        -- 例如:EXECUTE IMMEDIATE 'INSERT INTO table_name VALUES (' || i || ')';

insert into "CS_YT1"."T_PT"("ID", "NAME") 
VALUES(i, 'dddd……');
insert into "CS_YT1"."T_PT_COMPRESS"("ID", "NAME") 
VALUES(i, 'dddd……');
insert into "CS_YT1"."T_HUGE_NOCOMPRESS"("ID", "NAME") 
VALUES(i, 'dddd……');
insert into "CS_YT1"."T_HUGE_COMPRESS_FIELD"("ID", "NAME") 
VALUES(i, 'dddd……');
insert into "CS_YT1"."T_HUGE_COMPRESS"("ID", "NAME") 
VALUES(i, 'dddd……');

        i := i + 1;
    END LOOP;
END;

  • 查看每張表數據量
select '普通表' as table_name,count(1) as 數量 from T_PT
union all
select '普通壓縮表' as table_name,count(1) as 數量 from T_PT_COMPRESS
union all
select 'huge未壓縮表' as table_name,count(1) as 數量 from T_HUGE_NOCOMPRESS
union all
select 'huge壓縮欄位表' as table_name,count(1) as 數量 from T_HUGE_COMPRESS_FIELD
union all
select 'huge壓縮表' as table_name,count(1) as 數量 from T_HUGE_COMPRESS

image

4.3、測試結果

  • 查詢每張表的占用空間大小
-- 查詢表的實際占用大小、占用表空間大小
SELECT 
ROUND(TABLE_USED_PAGES('CS_YT1','T_PT') * PAGE / 1024 / 1024, 2)  AS "普通表-實際大小(MB)" ,
ROUND(TABLE_USED_SPACE('CS_YT1','T_PT') * PAGE / 1024 / 1024, 2)  AS "普通表-占用表空間大小(MB)",

ROUND(TABLE_USED_PAGES('CS_YT1','T_PT_COMPRESS') * PAGE / 1024 / 1024, 2) AS "普通壓縮表-實際大小(MB)" ,
ROUND(TABLE_USED_SPACE('CS_YT1','T_PT_COMPRESS') * PAGE / 1024 / 1024, 2) AS "普通壓縮表-占用表空間大小(MB)",

ROUND(TABLE_USED_PAGES('CS_YT1','T_HUGE_NOCOMPRESS') * PAGE / 1024/ 1024, 2) AS "huge未壓縮表-實際大小(MB)" ,
ROUND(TABLE_USED_SPACE('CS_YT1','T_HUGE_NOCOMPRESS') * PAGE / 1024/ 1024, 2) AS "huge未壓縮表-占用表空間大小(MB)",

ROUND(TABLE_USED_PAGES('CS_YT1','T_HUGE_COMPRESS_FIELD') * PAGE / 1024/ 1024, 2) AS "huge壓縮欄位表-實際大小(MB)" ,
ROUND(TABLE_USED_SPACE('CS_YT1','T_HUGE_COMPRESS_FIELD') * PAGE / 1024/ 1024, 2) AS "huge壓縮欄位表-占用表空間大小(MB)",

ROUND(TABLE_USED_PAGES('CS_YT1','T_HUGE_COMPRESS') * PAGE / 1024/ 1024, 2) AS "huge壓縮表-實際大小(MB)" ,
ROUND(TABLE_USED_SPACE('CS_YT1','T_HUGE_COMPRESS') * PAGE / 1024/ 1024, 2) AS "huge壓縮表-占用表空間大小(MB)"
;
  • 結果

image

4.4、結論

  • 普通表,也不壓縮占用空間都一樣

  • huge表,占用空間從小到大為:

    壓縮huge表(壓縮所有欄位) < 壓縮欄位huge表 < 未壓縮的huge表

ps:壓縮欄位表、壓縮表差別不大是因為未設置壓縮的欄位值很小,但是結果已經能說明,壓縮了的表占用空間小。

5、總結

①、普通表:不支持壓縮,就算建表時增加壓縮關鍵字也沒有意義。

②、huge表(列式存儲表):修改huge列式存儲表為壓縮表的方案

  • 先修改原來表的名字(原表名A,改為B),新建壓縮表A(很慢,3-8秒)
  • 將B表中的數據重新插入到壓縮表A中
  • 最後刪除B表

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Data Manipulation Language 數據操縱語言,用於數據的增加、刪除、更新等操作。包括 INSERT(向表中插入新數據)、UPDATE(修改表中的數據)和 DELETE(從表中刪除數據)。 插入數據 INSERT 插入一行數據 插入數據的時候,不指定列名直接使用 VALUES指定 ...
  • Linux常用命令記錄 文件與目錄管理命令 Linux的文件目錄是樹狀結構,最頂級的目錄為根目錄/,其他目錄是通過掛載將其添加到文件樹上,通過解除掛載將其移除。 首先先瞭解什麼是絕對路徑和相對路徑 絕對路徑:從根目錄開始的完整路徑描述,通常以 / 開頭,從根目錄root一直到目標目錄 相對路徑:相對 ...
  • 關於Anolis8/Centos8系統重啟後ip地址丟失的原因 #、今天把之前在VMware安裝的Anolis8系統重啟了,啟動之後發現Xshell連接不上。在VMware上登錄後執行ip a命令發現ip地址不見了 #、我的網卡配置信息如下: [[email protected] ~]# cat /etc ...
  • SQL NULL 值 什麼是 NULL 值? NULL 值是指欄位沒有值的情況。如果表中的欄位是可選的,那麼可以插入新記錄或更新記錄而不向該欄位添加值。此時,該欄位將保存為 NULL 值。需要註意的是,NULL 值與零值或包含空格的欄位不同。具有 NULL 值的欄位是在記錄創建期間留空的欄位。 如何 ...
  • 一條 SQL 查詢語句結構如下: SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY < ...
  • MPP MPP:Massively Parallel Processing, 即大規模並行處理. 一般用來指多個SQL資料庫節點搭建的數據倉庫系統. 執行查詢的時候, 查詢可以分散到多個SQL資料庫節點上執行, 然後彙總返回給用戶. Doris Doris 作為一款開源的 MPP 架構 OLAP 高 ...
  • 本文分享自華為雲社區《Navicat 基於 GaussDB 主備版的快速入門》,作者:Navicat_China。 Navicat Premium(16.2.8 Windows版或以上) 已支持對GaussDB 主備版的管理和開發功能。它不僅具備輕鬆、便捷的可視化數據查看和編輯功能,還提供強大的高階 ...
  • 一、來自MySQL官方的感謝 在 2023-10-25 MySQL 官方發佈的 8.2 版本 Release Notes 中,GreatSQL 社區核心開發者 Richard Dang 和 Hao Lu ,分別收到了來自 MySQL 官方的貢獻感謝,與Amazon、Facebook(Meta)、Te ...
一周排行
    -Advertisement-
    Play Games
  • 下麵是一個標準的IDistributedCache用例: public class SomeService(IDistributedCache cache) { public async Task<SomeInformation> GetSomeInformationAsync (string na ...
  • 這個庫提供了在啟動期間實例化已註冊的單例,而不是在首次使用它時實例化。 單例通常在首次使用時創建,這可能會導致響應傳入請求的延遲高於平時。在註冊時創建實例有助於防止第一次Request請求的SLA 以往我們要在註冊的時候實例單例可能會這樣寫: //註冊: services.AddSingleton< ...
  • 最近公司的很多項目都要改單點登錄了,不過大部分都還沒敲定,目前立刻要做的就只有一個比較老的項目 先改一個試試手,主要目標就是最短最快實現功能 首先因為要保留原登錄方式,所以頁面上的改動就是在原來登錄頁面下加一個SSO登錄入口 用超鏈接寫的入口,頁面改造後如下圖: 其中超鏈接的 href="Staff ...
  • Like運算符很好用,特別是它所提供的其中*、?這兩種通配符,在Windows文件系統和各類項目中運用非常廣泛。 但Like運算符僅在VB中支持,在C#中,如何實現呢? 以下是關於LikeString的四種實現方式,其中第四種為Regex正則表達式實現,且在.NET Standard 2.0及以上平... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他們的程式記憶體會偶發性暴漲,自己分析了下是非托管記憶體問題,讓我幫忙看下怎麼回事?哈哈,看到這個dump我還是非常有興趣的,居然還有這種游戲幣自助機類型的程式,下次去大玩家看看他們出幣的機器後端是不是C#寫的?由於dump是linux上的程式,剛好win ...
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • 上一次的介紹,主要圍繞如何統一去捕獲異常,以及為每一種異常添加自己的Mapper實現,並且我們知道,當在ExceptionMapper中返回非200的Response,不支持application/json的響應類型,而是寫死的text/plain類型。 Filter為二方包異常手動捕獲 參考:ht ...
  • 大家好,我是R哥。 今天分享一個爽飛了的面試輔導 case: 這個杭州兄弟空窗期 1 個月+,面試了 6 家公司 0 Offer,不知道問題出在哪,難道是杭州的 IT 崩盤了麽? 報名面試輔導後,經過一個多月的輔導打磨,現在成功入職某上市公司,漲薪 30%+,955 工作制,不咋加班,還不捲。 其他 ...
  • 引入依賴 <!--Freemarker wls--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency> ...
  • 你應如何運行程式 互動式命令模式 開始一個互動式會話 一般是在操作系統命令行下輸入python,且不帶任何參數 系統路徑 如果沒有設置系統的PATH環境變數來包括Python的安裝路徑,可能需要機器上Python可執行文件的完整路徑來代替python 運行的位置:代碼位置 不要輸入的內容:提示符和註 ...