DM8壓縮表 0、結論 行表(普通表)不支持壓縮。但是語法支持。建表之後,查詢到的占用空間會比普通表小一半。 經過測試,裝10萬數據(兩個欄位),壓縮的、未壓縮,占用空間一樣大。 列表(huge表)支持壓縮。可以壓縮表(就是壓縮所有列),也可以選擇壓縮列。但是建表的時候就要設置,否則建好表之後修改不 ...
DM8壓縮表
0、結論
-
行表(普通表)不支持壓縮。但是語法支持。建表之後,查詢到的占用空間會比普通表小一半。
- 經過測試,裝10萬數據(兩個欄位),壓縮的、未壓縮,占用空間一樣大。
-
列表(huge表)支持壓縮。可以壓縮表(就是壓縮所有列),也可以選擇壓縮列。但是建表的時候就要設置,否則建好表之後修改不成壓縮表或壓縮列。
- 經過測試,裝10萬數據(兩個欄位),壓縮級別9(最高),壓縮所有欄位。壓縮的、未壓縮的相差600MB左右。
!
-- 查詢dm資料庫信息(包含版本)
select * from v$instance;
-- 查詢dm資料庫版本
select * from v$version;
-- 查詢版本時間
select id_code;
1、需求:
-
數據壓縮
- 只有列式存儲的表(huge表)可以壓縮
- huge表新建好後(開始未設置壓縮的)是不能修改為壓縮表
-
其他對象壓縮(索引、視圖、函數……)
- 不支持其他對象壓縮
-
可參考問答:https://eco.dameng.com/community/question/5d6b19e9d7a929644ab49de0fd64ba39
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、普通表(行式存儲表)
- 語法支持,功能已經取消。
- 但是設置了壓縮的表,占用空間會變小。
- 建表語句
-- 壓縮表
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");
- 測試建表,查看大小
2.2、HUGE表——列式存儲表(大表)
- 壓縮級別、壓縮類型
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表
- 不能:新增欄位、修改欄位(類型、長度、精度)
- 可以:修改欄位名字、給欄位加註釋、給表加註釋
- 建表語句
-- 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';
- ☆☆查詢所有類型的表的空間占用☆☆
-- 查詢表的實際占用大小、占用表空間大小(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;
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'
;
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
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)"
;
- 結果
4.4、結論
-
普通表,也不壓縮占用空間都一樣
-
huge表,占用空間從小到大為:
壓縮huge表(壓縮所有欄位) < 壓縮欄位huge表 < 未壓縮的huge表
ps:壓縮欄位表、壓縮表差別不大是因為未設置壓縮的欄位值很小,但是結果已經能說明,壓縮了的表占用空間小。
5、總結
①、普通表:不支持壓縮,就算建表時增加壓縮關鍵字也沒有意義。
②、huge表(列式存儲表):修改huge列式存儲表為壓縮表的方案:
- 先修改原來表的名字(原表名A,改為B),新建壓縮表A(很慢,3-8秒)
- 將B表中的數據重新插入到壓縮表A中
- 最後刪除B表