達夢資料庫壓縮

来源:https://www.cnblogs.com/kakarotto-chen/archive/2023/11/18/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、查詢

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

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
更多相關文章
  • 一、概述 生成PDF文檔通常涉及使用模板引擎、PDF庫以及數據填充。常見以下幾種方法: iText:iText是一個強大的PDF庫,支持創建和操作PDF文檔。使用場景: 您可以使用iText來直接構建PDF文檔,也可以將其與模板引擎結合使用,通過數據填充來生成PDF。 Apache PDFBox: ...
  • Go語言中的上下文(Context)是一種用於在 Goroutines 之間傳遞取消信號、截止時間和其他請求範圍值的標準方式。context 包提供了 Context 類型和一些相關的函數,用於在併發程式中有效地傳遞上下文信息。 在Go語言中,上下文通常用於以下場景: 請求的傳遞:當一個請求從客戶端 ...
  • wmproxy wmproxy已用Rust實現http/https代理, socks5代理, 反向代理, 靜態文件伺服器,四層TCP/UDP轉發,內網穿透,後續將實現websocket代理等,會將實現過程分享出來,感興趣的可以一起造個輪子 項目地址 國內: https://gitee.com/tic ...
  • 引言 上一篇中 WPF 重寫DataGrid樣式,因新產品UI需要,重寫了一下微軟 WPF 原生的 DataGrid 的樣式,包含如下內容: 基礎設置,一些基本背景色,字體顏色等。 滾動條樣式。 實現圓角表格,重寫表格的一些基礎樣式,例如 CellStyle ,RowStyle,RowHeaderS ...
  • 什麼是主構造函數 把參數添加到class與record的類聲明中就是主構造函數。例如 class Person(string name) { private string _name = name; } 這種寫法與以下代碼寫法一樣 class Person { private string _nam ...
  • 背景 工作需要對接內部的日誌中台,對日誌列印有固定的格式要求,為了使Nginx的access日誌也能被採集,需要對日誌格式進行自定義,要求日誌格式為: yyyy-MM-dd HH:mm:ss.SSS LOG_LEVEL LOG_MSG > 時間格式+列印級別+業務日誌 如: 23-11-18 17: ...
  • 作為小白的我這幾天買了個香橙派3b 經過這幾天的折騰,終於進入了ssh終端(大喜 我買的是官店的8G,創客價299,連著一起買了一個閃迪的64gTF卡 簡單總結一下搭建過程: 物理準備:一臺電腦,香橙派與一張16G以上的tf卡,tf讀卡器(一般會送)一根網線,type-c線 第一步:燒錄ubuntu ...
  • CycloneIII內部資源概述 目錄CycloneIII內部資源概述Logic Elements and Logic Array Blocks(邏輯元件和邏輯陣列塊)LELABLAB InterconnectsMemory Blocks(記憶體塊)Memory modeClocking modeEm ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...