可以参考DB2 information center的官方文档:https://www.ibm.com/docs/zh/db2/10.5?topic=spaces-table-system-user-temporary-data
每个数据库都必须要有最小的一组表空间,这些表空间用于存储系统数据、用户数据和临时数据。
一个数据库至少必须包含三个表空间:
目录表空间
一个或多个用户表空间
一个或多个临时表空间
目录表空间
目录表空间包含数据库的所有系统目录表。此表空间称为 SYSCATSPACE,它不能被删除。
用户表空间
用户表空间包含用户定义的表。缺省情况下,将创建一个用户表空间 USERSPACE1。
如果创建表时未对其指定表空间,那么数据库管理器将自动进行选择。有关更多信息,请参阅 CREATE TABLE 语句的 IN tablespace-name 子句的文档。
表空间的页大小确定了表中的最大行长度或列数。CREATE TABLE 语句的文档说明了页大小与最大行大小和列数之间的关系。在 V9.1 之前,缺省页大小为 4 KB。在 V9.1 及其后续版本中,缺省页大小可以是其他受支持的值中的一个。缺省页大小是在创建新的数据库时声明的。声明了缺省页大小之后,仍然可以使用具有一种页大小的表空间作为表,而使用具有另一种页大小的另一个表空间来存储长型数据或 LOB 数据。如果列数或行大小超过表空间页大小的限制,那么返回一个错误(SQLSTATE 42997)。
临时表空间
临时表空间包含临时表。临时表空间可以是系统临时表空间或用户临时 表空间。
系统临时表空间存放数据库管理器在执行诸如排序或连接之类的操作时所需的临时数据。这些类型的操作需要额外的空间来处理结果集。数据库必须有至少一个系统临时表空间;在缺省情况下,创建数据库时会创建一个名为 TEMPSPACE1 的系统临时表空间。
处理查询时,数据库管理器可能需要访问页大小足以处理与查询相关的数据的系统临时表空间。例如,如果查询返回的数据包含长度为 8KB 的行,并且没有页大小至少为 8KB 的系统临时表空间,那么该查询将失败。您可能需要创建具有更大页大小的系统临时表空间。通过定义页大小等于用户表空间的最大页大小的临时表空间,可以帮助您避免这些类型的问题。
用户临时表空间存放使用 DECLARE GLOBAL TEMPORARY TABLE 或 CREATE GLOBAL TEMPORARY TABLE (DGTT(DECLARE GLOBAL TEMPORARY TABLE)/CGTT(CREATE GLOBAL TEMPORARY TABLE)) 语句创建的表的临时数据。缺省情况下,创建数据库时不会创建这些表空间。它们还存放已创建临时表的实例化版本。为了能够定义已声明临时表或已创建临时表,至少一个用户临时表空间应该是使用相应 USE 特权创建的。USE 特权是使用 GRANT 语句授予的。
如果数据库使用多个临时表空间,并且需要新的临时对象,那么优化器将为此对象选择相应的页大小。然后将把该对象分配到具有相应页大小的临时表空间中。如果存在多个具有该页大小的临时表空间,那么将以循环方式来选择表空间,即,先选择具有该页大小的表空间,然后为将要分配的下一个对象选择下一个表空间并依此类推,直到用尽所有合适的表空间后回到第一个表空间。但是,在大多数情况下,建议您不要创建多个具有相同页大小的临时表空间。
临时表的创建和维护?
在做复杂业务分析时,一个存储过程也会用到很多临时表(存储业务分析某一步的中间结果),这些表的数据经常变化(每个周期都会被清空再装入),还需要和别的表做关联,那么这种表在建表的时候有什么要注意的吗?为了提升程序性能,优化时考虑这些表吗?要建立索引吗?runstats应该保持在什么状态?需要reorg吗?
分享一:
这些临时表不是会话表(DGTT 或 CGTT)吧?如果每次调用存储过程生成的临时表数据变化都比较大,建议在存储过程中搜集统计信息(调用sysproc.admin_cmd('runstats on table <临时表>'),因为临时表每次调用一般都清空,没有必要reorg;建不建索引,具体看表关联的需要,存储过程一般是加工数据的,临时表一般不需要建索引。另外,建议将存储过程对应的package绑定成 REOPT ALWAYS的,这样每次调用该存储过程都会根据最新的统计信息生成新的执行计划,通常也会提高性能。
分享二:
1)如果是DGTT(DECLARE GLOBAL TEMPORARY TABLE)/CGTT(CREATE GLOBAL TEMPORARY TABLE),则一般不必对其建立index,也不需对其进行runstats、reorg,因为DB2查询优化器在每次分析和执行SQL时,都会对包含DGTT/CGTT的SQL进行重新优化并且生成新的最优access plan。
分享三:
在排序、表关联等处理时会用到系统临时表空间,顺序是Sortheap不足时溢出到临时表空间对应的bufferpool,buffpool再不足时溢出到磁盘。如果想看数据是否使用了系统临时表空间、使用了多少,直接db2 list tablespaces show detail 看看系统临时表空间的Used pages即可, 或者db2top 进去看表空间(按 t ),再看系统临时表空间上是否有Writes。
创建用户临时表空间测试:
[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2 "DECLARE GLOBAL TEMPORARY TABLE temp.employee1 (id int)"
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0079N The Schema name for the declared global temporary table or index
"EMPLOYEE1" must be SESSION, not "TEMP". SQLSTATE=428EK
[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2 "DECLARE GLOBAL TEMPORARY TABLE employee1 (id int)"
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0286N A table space could not be found with a page size of at least "4096"
that authorization ID "DB2INST1" is authorized to use. SQLSTATE=42727
[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2pd -d test1 -tablespaces
Database Member 0 -- Database TEST1 -- Active -- Up 0 days 02:05:34 -- Date 2023-08-25-16.40.27.261485
Tablespace Configuration:
Address Id Type Content PageSz ExtentSz Auto Prefetch BufID BufIDDisk FSC NumCntrs MaxStripe LastConsecPg RSE Name
0x00007FBF8F81CD40 0 DMS Regular 4096 4 Yes 4 1 1 Def 1 0 3 Yes SYSCATSPACE
0x00007FBF8F829EE0 1 SMS SysTmp 4096 32 Yes 32 1 1 On 1 0 31 No TEMPSPACE1
0x00007FBF9535F040 2 DMS Large 8192 32 Yes 32 2 2 Def 1 0 31 Yes TSP8K
0x00007FBF8F844220 3 DMS Large 4096 4 Yes 4 1 1 Def 1 0 3 Yes SYSTOOLSPACE
0x00007FBF9536D260 4 DMS Large 16384 32 Yes 32 3 3 Def 1 0 31 Yes TSP16K
0x00007FBF9537B260 5 DMS Large 32768 32 Yes 32 4 4 Def 1 0 31 Yes TSP32K
0x00007FBF9539E0A0 6 DMS Large 32768 32 Yes 32 4 4 Def 1 0 31 Yes TSP32K02
0x00007FBF953AB240 7 DMS Large 32768 32 Yes 32 4 4 Def 1 0 31 Yes TSP32K03
0x00007FBF953B83E0 8 DMS Large 32768 32 Yes 32 4 4 Def 1 0 31 Yes TSP32K04
[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2 "create user TEMPORARY tablespace TEMPSPACE2 pagesize 32 K"
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL1582N The PAGESIZE of the table space "TEMPSPACE2" does not match the
PAGESIZE of the bufferpool "IBMDEFAULTBP" associated with the table space.
SQLSTATE=428CB
[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2 "create user TEMPORARY tablespace TEMPSPACE2 pagesize 32 K bufferpool BP32K"
DB20000I The SQL command completed successfully.
[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2 "DECLARE GLOBAL TEMPORARY TABLE employee1 (id int)"
DB20000I The SQL command completed successfully.
[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2 "DECLARE GLOBAL TEMPORARY TABLE employee2 (id int) in TEMPSPACE2"
DB20000I The SQL command completed successfully.