達夢資料庫壓縮

来源: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. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...