達夢資料庫壓縮

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...