临时表空间分为系统临时表空间和用户临时表空间
系统临时表空间用于存储 SQL 操作(比如排序、重组表、创建索引和连接表)期间所需的内部临时数据。每个数据库必须至少有一个系统临时表空间。随数据库创建的系统临时表空间的缺省名为 TEMPSPACE1。
用户临时表空间用来存储已声明的全局临时表。创建数据库时不存在用户临时表空间。至少应当创建一个用户临时表空间以允许定义已声明的临时表。用户临时表空间是可选的,缺省情况下一个都不创建。
系统临时表空间的建立语法(系统管理,自动储存器,db2推荐):
CREATE SYSTEM TEMPORARY TABLESPACE TEMP_1 PAGESIZE 8 K MANAGED BY AUTOMATIC
STORAGE EXTENTSIZE 16 OVERHEAD 12.67 PREFETCHSIZE 16 TRANSFERRATE 0.18 BUFFERPOOL IBMDEFAULTBP ;
--测试过程
----执行这个大sql
select * from crb_test order by decimal(a/10),b,c,d
--执行的过程中,也就是排序的过程中可以查看 系统临时表空间下的目录
cd /afc_suzhou_data/db2inst1/NODE0000/SUZHOU/T0000001/C0000000.TMP
[db2inst1@localhost C0000000.TMP]$ ll
总计 154144
-rw------- 1 db2inst1 db2iadm1 0 11-09 16:17 SQL00002.TBA
-rw------- 1 db2inst1 db2iadm1 21815296 11-10 08:40 SQL00002.TDA --这个文件使用一直在增加,直到21815296
--一直观察
[db2inst1@localhost C0000000.TMP]$ ll
总计 154144
-rw------- 1 db2inst1 db2iadm1 0 11-09 16:17 SQL00002.TBA
-rw------- 1 db2inst1 db2iadm1 21815296 11-10 08:40 SQL00002.TDA
-rw------- 1 db2inst1 db2iadm1 0 11-09 16:17 SQL00002.TLB
-rw------- 1 db2inst1 db2iadm1 135618560 11-10 08:41 SQL00003.TDA --这个文件使用也一直在增加,直到135618560
--一会儿 ,客户端数据已经在输出了,说明排序已经完毕
--再观察系统临时表空间
db2inst1@localhost C0000000.TMP]$ ll
总计 21568
-rw------- 1 db2inst1 db2iadm1 0 11-09 16:17 SQL00002.TBA
-rw------- 1 db2inst1 db2iadm1 21815296 11-10 08:40 SQL00002.TDA
-rw------- 1 db2inst1 db2iadm1 0 11-09 16:17 SQL00002.TLB
-rw------- 1 db2inst1 db2iadm1 0 11-10 08:41 SQL00003.TDA --这个文件的大小变成0了
--再观察
[db2inst1@localhost C0000000.TMP]$ ll
总计 236
-rw------- 1 db2inst1 db2iadm1 0 11-09 16:17 SQL00002.TBA
-rw------- 1 db2inst1 db2iadm1 0 11-10 08:41 SQL00002.TDA --这个也变成0了
-rw------- 1 db2inst1 db2iadm1 0 11-09 16:17 SQL00002.TLB
-rw------- 1 db2inst1 db2iadm1 0 11-10 08:41 SQL00003.TDA
--查看sql的执行情况
select STMT_TEXT, decimal(total_section_sort_time/num_executions,22,3) as "总的排序时间", TOTAL_SORTS/num_executions as "排序的次数",
POST_THRESHOLD_SORTS/num_executions "排序超过阀值的次数", POST_SHRTHRESHOLD_SORTS/num_executions "排序内存受限的次数",
SORT_OVERFLOWS/num_executions "排序溢出的次数" from TABLE (MON_GET_PKG_CACHE_STMT(null, null, null, -1)) AS tf
where num_executions>0 and stmt_text LIKE 'select * from crb_test%' order by QUERY_COST_ESTIMATE/num_executions desc
STMT_TEXT 总的排序时间 排序的次数 排序超过阀值的次数 排序内存受限的次数 排序溢出的次数
select * from crb_test 44388.000 2 0 0 2 --看到排序溢出的次数是2
order by decimal(a/10),b,c,d
--查看sortheap的大小
[db2inst1@localhost C0000000.TMP]$ db2 get db cfg|grep SORT
Sort list heap (4KB) (SORTHEAP) = AUTOMATIC(53)
Index sort flag (INDEXSORT) = YES
[db2inst1@localhost C0000000.TMP]$ db2 select 53*4 from sysibm.dual
1
-----------
212 ---212k
1 record(s) selected.
总结一下:
1.排序的时候用的临时表空间的大小是临时申请的,使用完毕后释放,所以平时如果没有排序,那么平时看上去都是0
2.我执行的这个sql经过了2次排序,而且这两次排序都是溢出的
3.是不是可以认为这次排序 使用了排序内存为212k,使用了临时表空间的大小是150M((21815296+135618560)/1024/1024)