在达梦数据库(DM Database)中,临时表空间(Temp Tablespace)用于存储排序、哈希连接、临时表等操作产生的中间数据。当内存(如排序区 SORT_AREA_SIZE)不足以容纳全部中间结果时,数据库会自动将数据溢出到临时表空间。本文将通过创建测试表、生成大规模数据并执行排序查询,演示如何触发并观察临时表空间的使用情况。
环境
x86 Kylin v10
DM8 Database 64 V8 03134284552-20260414-322369-20221
首先,创建表 TEST_TEMP_SRC,用于存放大量待排序的数据。
-- 创建源数据表
CREATE TABLE TEST_TEMP_SRC (
ID INT PRIMARY KEY,
NAME VARCHAR(100),
SCORE INT,
CREATE_TIME DATETIME
);
为了模拟真实场景并触发临时表空间,需要插入足够多的数据。以下脚本将生成约 500 万条数据(具体数量可根据您的内存配置调整,数据量越大越容易触发临时表空间)。
-- 清空表(可选,确保从空表开始)
TRUNCATE TABLE TEST_TEMP_SRC;
-- 使用 PL/SQL 循环插入大量数据
DECLARE
v_cnt INT := 0;
BEGIN
FOR i IN 1..5000000 LOOP
INSERT INTO TEST_TEMP_SRC (ID, NAME, SCORE, CREATE_TIME)
VALUES (i, 'TEST_USER_' || TO_CHAR(i), MOD(i, 100), SYSDATE);
v_cnt := v_cnt + 1;
IF MOD(v_cnt, 10000) = 0 THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
END;
/
说明:
SCORE 为 i % 100(即 0‑99 的循环值)。TEMP 会自动扩展)。执行以下查询。由于数据量较大且包含 ORDER BY 操作,当内存不足以容纳排序结果时,达梦数据库会自动将排序数据溢出到临时表空间。
-- 此查询会触发排序操作,若内存不足将使用临时表空间
SELECT
T1.NAME,
T1.SCORE
FROM TEST_TEMP_SRC T1
ORDER BY T1.SCORE DESC, T1.NAME ASC;
原理:
ORDER BY T1.SCORE DESC, T1.NAME ASC 需要对全表约 500 万行数据进行排序。SORT_AREA_SIZE(或相关内存参数)设置较小,或者数据量超过内存可用空间,排序中间结果会被写入临时表空间。执行以下查询,查看当前会话(或其他会话)的临时表空间使用量。
SELECT
"TMP_USED_TYPE",
"TMP_USED_EXTENT_NUM" * (SF_GET_EXTENT_SIZE()) * (PAGE() / 1024) / 1024 AS TEMP_MB,
*
FROM "SYS"."V$SESSIONS"
ORDER BY TEMP_MB DESC;
字段解释:
TMP_USED_TYPE:临时空间使用类型(如 BTR、BLOB、MTAB、BACKUP 等),存在多个类型时,不同类型用"/"隔开(如 BTR/BLOB)。TMP_USED_EXTENT_NUM:已使用的临时簇数量。SF_GET_EXTENT_SIZE():获取当前表空间的簇大小。PAGE():获取数据库页大小(字节)。TEMP_MB:计算出的临时表空间使用量(MB)。运行上述查询后,您会看到按临时空间使用量降序排列的会话信息。正在执行排序操作的会话通常会排在前面,其 TEMP_MB 值会明显大于 0。
SELECT * FROM V$TABLESPACE; 查看临时表空间状态。SORT_AREA_SIZE(需重启生效)或 SORT_BUFFER_SIZE(会话级动态调整)。DROP TABLE TEST_TEMP_SRC; 删除测试表。本文演示了在达梦数据库中通过创建测试表、插入大规模数据并执行排序查询来触发临时表空间使用的完整流程。通过监控 V$SESSIONS 视图,可以直观地看到临时表空间的实际消耗。掌握这一方法有助于进行性能调优、容量规划以及临时表空间相关问题的诊断。
文章
阅读量
获赞
