1. 首页 > DB2教程 > 正文

DB2教程FG067-DB2临时表空间优化实战

风哥教程参考DB2官方文档Temporary Tablespace、Performance Tuning等内容,详细介绍临时表空间优化、排序溢出、临时表使用等。更多视频教程www.fgedu.net.cn

目录大纲

Part01-临时表空间概述

1.1 临时表空间用途

临时表空间用于:

  • 排序操作(ORDER BY、GROUP BY)
  • 临时表存储
  • 哈希连接
  • 索引创建
  • 重组操作
  • LOAD操作

1.2 临时表空间类型

  • 系统临时表空间:用于排序、连接等操作
  • 用户临时表空间:用于用户创建的临时表

Part02-临时表空间配置

2.1 创建临时表空间

# 查看现有临时表空间
SELECT
TBSP_NAME,
TBSP_TYPE,
TBSP_CONTENT_TYPE,
TBSP_PAGE_SIZE,
TBSP_TOTAL_PAGES,
TBSP_USED_PAGES
FROM SYSIBMADM.TBSP_UTILIZATION
WHERE TBSP_CONTENT_TYPE IN (‘USR_TEMP’, ‘SYS_TMP’);

# 创建系统临时表空间
CREATE SYSTEM TEMPORARY TABLESPACE TEMP_SYS_8K
PAGESIZE 8K
MANAGED BY DATABASE
USING (FILE ‘/db2data/temp/temp_sys_8k.dms’ 5G)
EXTENTSIZE 32
PREFETCHSIZE 128
BUFFERPOOL BP8K;

CREATE SYSTEM TEMPORARY TABLESPACE TEMP_SYS_16K
PAGESIZE 16K
MANAGED BY DATABASE
USING (FILE ‘/db2data/temp/temp_sys_16k.dms’ 5G)
EXTENTSIZE 32
PREFETCHSIZE 128
BUFFERPOOL BP16K;

CREATE SYSTEM TEMPORARY TABLESPACE TEMP_SYS_32K
PAGESIZE 32K
MANAGED BY DATABASE
USING (FILE ‘/db2data/temp/temp_sys_32k.dms’ 5G)
EXTENTSIZE 32
PREFETCHSIZE 128
BUFFERPOOL BP32K;

# 创建用户临时表空间
CREATE USER TEMPORARY TABLESPACE TEMP_USR_8K
PAGESIZE 8K
MANAGED BY DATABASE
USING (FILE ‘/db2data/temp/temp_usr_8k.dms’ 2G)
EXTENTSIZE 32
PREFETCHSIZE 128
BUFFERPOOL BP8K;

# 创建缓冲池
CREATE BUFFERPOOL BP8K SIZE 50000 PAGESIZE 8K;
CREATE BUFFERPOOL BP16K SIZE 25000 PAGESIZE 16K;
CREATE BUFFERPOOL BP32K SIZE 12500 PAGESIZE 32K;

2.2 配置排序参数

# 配置排序堆大小
UPDATE DATABASE CONFIGURATION USING SORTHEAP 8192;

# 配置排序堆阈值
UPDATE DATABASE CONFIGURATION USING SHEAPTHRES 65536;
UPDATE DATABASE CONFIGURATION USING SHEAPTHRES_SHR 65536;

# 查看排序配置
GET DATABASE CONFIGURATION;

# 查看排序使用情况
SELECT
TOTAL_SORTS,
TOTAL_SORT_OVERFLOWS,
CASE
WHEN TOTAL_SORTS > 0
THEN ROUND(TOTAL_SORT_OVERFLOWS * 100.0 / TOTAL_SORTS, 2)
ELSE 0
END AS SORT_OVERFLOW_PERCENT
FROM SYSIBMADM.SNAPDB;

# 监控排序性能
SELECT
SUBSTR(APPL_NAME, 1, 30) AS APPL_NAME,
TOTAL_SORTS,
TOTAL_SORT_TIME,
SORT_OVERFLOWS
FROM SYSIBMADM.APPLICATIONS
WHERE TOTAL_SORTS > 0
ORDER BY TOTAL_SORT_TIME DESC;

Part03-临时表使用

3.1 声明全局临时表

# 创建声明全局临时表
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_ORDER (
ORDER_ID VARCHAR(32),
CUSTOMER_ID VARCHAR(32),
TOTAL_AMOUNT DECIMAL(18, 2),
ORDER_STATUS VARCHAR(20)
) ON COMMIT PRESERVE ROWS
NOT LOGGED
IN TEMP_USR_8K;

# 插入数据
INSERT INTO SESSION.TEMP_ORDER
SELECT
ORDER_ID,
CUSTOMER_ID,
TOTAL_AMOUNT,
ORDER_STATUS
FROM ORDERS
WHERE CREATE_TIME BETWEEN ‘2026-04-01’ AND ‘2026-04-30’;

# 查询临时表
SELECT * FROM SESSION.TEMP_ORDER;

# 创建带索引的临时表
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_CUSTOMER (
CUSTOMER_ID VARCHAR(32),
CUSTOMER_NAME VARCHAR(200),
TOTAL_ORDERS INTEGER,
TOTAL_AMOUNT DECIMAL(18, 2)
) ON COMMIT PRESERVE ROWS
NOT LOGGED
IN TEMP_USR_8K;

CREATE INDEX SESSION.IDX_TEMP_CUSTOMER ON SESSION.TEMP_CUSTOMER(CUSTOMER_ID);

# 删除临时表
DROP TABLE SESSION.TEMP_ORDER;

# 清空临时表
DELETE FROM SESSION.TEMP_ORDER;

3.2 临时表最佳实践

# 使用ON COMMIT PRESERVE ROWS保持数据
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_DATA (
ID INTEGER,
NAME VARCHAR(100)
) ON COMMIT PRESERVE ROWS
NOT LOGGED;

# 使用ON COMMIT DELETE ROWS自动清空
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_DATA2 (
ID INTEGER,
NAME VARCHAR(100)
) ON COMMIT DELETE ROWS
NOT LOGGED;

# 使用NOT LOGGED提高性能
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_LARGE (
ID INTEGER,
DATA VARCHAR(1000)
) ON COMMIT PRESERVE ROWS
NOT LOGGED;

# 批量处理使用临时表
# 1. 创建临时表
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_PROCESS (
ORDER_ID VARCHAR(32),
PROCESS_STATUS VARCHAR(20)
) ON COMMIT PRESERVE ROWS
NOT LOGGED;

# 2. 插入待处理数据
INSERT INTO SESSION.TEMP_PROCESS
SELECT ORDER_ID, ‘PENDING’
FROM ORDERS
WHERE ORDER_STATUS = ‘NEW’;

# 3. 处理数据
UPDATE ORDERS o
SET ORDER_STATUS = ‘PROCESSING’
WHERE EXISTS (
SELECT 1 FROM SESSION.TEMP_PROCESS t
WHERE t.ORDER_ID = o.ORDER_ID
);

# 4. 更新临时表状态
UPDATE SESSION.TEMP_PROCESS
SET PROCESS_STATUS = ‘DONE’;

# 5. 清理
DROP TABLE SESSION.TEMP_PROCESS;

Part04-性能监控与优化

4.1 监控临时表空间使用

# 查看临时表空间使用情况
SELECT
TBSP_NAME,
TBSP_TYPE,
TBSP_CONTENT_TYPE,
TBSP_PAGE_SIZE,
TBSP_USED_PAGES,
TBSP_FREE_PAGES,
ROUND(TBSP_USED_PAGES * 100.0 / TBSP_TOTAL_PAGES, 2) AS USAGE_PERCENT
FROM SYSIBMADM.TBSP_UTILIZATION
WHERE TBSP_CONTENT_TYPE IN (‘USR_TEMP’, ‘SYS_TMP’)
ORDER BY TBSP_NAME;

# 查看临时表空间活动
SELECT
TBSP_NAME,
TBSP_READS,
TBSP_WRITES,
TBSP_READ_TIME,
TBSP_WRITE_TIME
FROM SYSIBMADM.TBSP_UTILIZATION
WHERE TBSP_CONTENT_TYPE IN (‘USR_TEMP’, ‘SYS_TMP’);

# 查看使用临时表空间的SQL
SELECT
SUBSTR(STMT_TEXT, 1, 100) AS STMT_TEXT,
TOTAL_SORTS,
TOTAL_SORT_OVERFLOWS,
TOTAL_SORT_TIME
FROM SYSIBMADM.TOP_DYNAMIC_SQL
WHERE TOTAL_SORT_OVERFLOWS > 0
ORDER BY TOTAL_SORT_OVERFLOWS DESC;

# 监控排序溢出
SELECT
TOTAL_SORTS,
TOTAL_SORT_OVERFLOWS,
POST_THRESHOLD_SORTS,
POST_SHRTHRESHOLD_SORTS
FROM SYSIBMADM.SNAPDB;

4.2 优化建议

# 1. 增大SORTHEAP
UPDATE DATABASE CONFIGURATION USING SORTHEAP 16384;

# 2. 增大临时表空间
ALTER TABLESPACE TEMP_SYS_8K
RESIZE (FILE ‘/db2data/temp/temp_sys_8k.dms’ 10G);

# 3. 优化SQL减少排序
# 添加索引避免排序
CREATE INDEX IDX_ORDER_DATE ON ORDERS(CREATE_TIME DESC);

# 使用索引扫描代替排序
SELECT * FROM ORDERS
WHERE CREATE_TIME > ‘2026-04-01’
ORDER BY CREATE_TIME;

# 4. 分区减少排序数据量
SELECT * FROM ORDERS
WHERE CREATE_TIME BETWEEN ‘2026-04-01’ AND ‘2026-04-30’
ORDER BY CREATE_TIME;

# 5. 使用MQT预计算
CREATE TABLE MQT_ORDER_SUMMARY AS (
SELECT
DATE(CREATE_TIME) AS ORDER_DATE,
COUNT(*) AS ORDER_COUNT,
SUM(TOTAL_AMOUNT) AS TOTAL_AMOUNT
FROM ORDERS
GROUP BY DATE(CREATE_TIME)
) DATA INITIALLY DEFERRED REFRESH DEFERRED;

# 6. 监控并优化
# 定期检查排序溢出率
# 如果超过5%,需要增大SORTHEAP或优化SQL

Part05-风哥经验总结与分享

5.1 临时表空间配置要点

  • 创建多种页面大小的临时表空间
  • 为每种页面大小创建对应的缓冲池
  • 配置合理的SORTHEAP和SHEAPTHRES
  • 临时表空间使用独立磁盘
  • 监控排序溢出率
  • 定期检查临时表空间使用情况

5.2 性能优化建议

问题 优化方案
排序溢出多 增大SORTHEAP,优化SQL
临时表空间满 增大临时表空间,优化SQL
临时表性能差 使用NOT LOGGED,创建索引
排序时间长 创建索引,使用MQT

5.3 运维要点

  • 监控临时表空间使用率
  • 监控排序溢出率
  • 定期检查使用临时表空间的SQL
  • 优化高排序溢出的SQL
  • 确保临时表空间有足够空间
  • 临时表空间使用独立磁盘
更多视频教程www.fgedu.net.cn
学习交流加群风哥微信: itpux-com
风哥Oracle/MySQL/PostgreSQL/Greenplum/DB2/Redis等数据库培训课程,10年一线实战经验,企业级培训,真正掌握数据库核心技术!

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息