db2 系统临时表空间

确保系统临时表空间的页大小符合要求

更大记录标识符(RID)的使用增加了来自查询或定位更新的结果集的行大小。如果结果集中的行大小接近于现有系统临时表空间的最大行长度限制,那么可能需要创建具有更大页大小的系统临时表空间。

开始之前

确保具有 SYSCTRL 或 SYSADM 权限来在必要时创建系统临时表空间。

过程

要确保系统临时表空间的最大页大小对于查询或定位更新足够大。

  1. 确定来自查询或定位更新的结果集的最大行大小。使用曾用来创建表的 DDL 语句来监控查询或者计算最大行大小。
  2. 通过发出以下查询,确定每个系统临时表空间的页大小,同时对于创建了查询或更新中引用的表,确定表空间的页大小:
    db2 "SELECT CHAR(TBSP_NAME,20) TBSP_NAME, TBSP_CONTENT_TYPE, TBSP_PAGE_SIZE 
         FROM SYSIBMADM.SNAPTBSP"
    
    TBSP_NAME            TBSP_CONTENT_TYPE TBSP_PAGE_SIZE
    -------------------- ----------------- --------------------
    SYSCATSPACE          ANY                               8192
    TEMPSPACE1           SYSTEMP                           8192
    USERSPACE1           LARGE                             8192
    IBMDB2SAMPLEREL      LARGE                             8192
    SYSTOOLSPACE         LARGE                             8192
    SYSTOOLSTMPSPACE     USRTEMP                           8192
    
      6 record(s) selected.
    可以通过在输出中查找其 TBSP_CONTENT_TYPE 列的值为 SYSTEMP 的表空间来标识系统临时表空间。
    如果要从版本 8.1 进行升级,请使用以下命令:
       db2 LIST TABLESPACES SHOW DETAIL
  3. 检查结果集中的最大行大小是否适合系统临时表空间的页大小:
       maximum_row_size > maximum_row_length - 8 字节(单一分区中
                                                        的结构开销)
       maximum_row_size > maximum_row_length - 16 字节(DPF 中的结构开销)
    其中 maximum_row_size 是结果集的最大行大小,maximum_row_length 是基于所有系统临时表空间的最大页大小所允许的最大长度。查看数据库管理器特定于页大小的限制,以根据表空间页大小确定最大行长度。

    如果最大行大小小于计算的值,那么查询将以它们在 DB2® UDB V8 中的运行方式运行,且您不必继续执行此任务。

  4. 创建一个系统临时表空间,其大小应至少比创建了表的表空间页大小大一个页大小(如果还没有这样的大小的系统临时表)。例如,在 Windows 操作系统上,如果在一个具有 8 KB 页大小的表空间中创建了表,那么使用 16 KB 页大小创建其他系统临时表空间:
       db2 CREATE SYSTEM TEMPORARY TABLESPACE tmp_tbsp
             PAGESIZE 16K
             MANAGED BY SYSTEM
             USING ('d:\tmp_tbsp','e:\tmp_tbsp')
    如果表空间页大小是 32 KB,那么可以减少在查询中选择的信息或者分开这些查询以适合系统临时表空间页。例如,如果选择了表的所有列,那么可以改为仅选择真正需要的列或者选择某些列的一个子串来避免超出页大小限制。
以上摘自:http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.qb.upgrade.doc%2Fdoc%2Ft0022383.html&lang%3Dzh_CN

--

系统数据、用户数据和临时数据的表空间

每个数据库都必须要有最小的一组表空间,这些表空间用于存储系统数据、用户数据和临时数据。

一个数据库至少必须包含三个表空间:
  • 目录表空间
  • 一个或多个用户表空间
  • 一个或多个临时表空间

目录表空间

目录表空间包含数据库的所有系统目录表。此表空间称为 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 语句创建的表的临时数据。缺省情况下,创建数据库时不会创建这些表空间。它们还存放已创建临时表的实例化版本。为了能够定义已声明临时表或已创建临时表,至少一个用户临时表空间应该是使用相应 USE 特权创建的。USE 特权是使用 GRANT 语句授予的。

如果数据库使用多个临时表空间,并且需要新的临时对象,那么优化器将为此对象选择相应的页大小。然后将把该对象分配到具有相应页大小的临时表空间中。如果存在多个具有该页大小的临时表空间,那么将以循环方式来选择表空间,即,先选择具有该页大小的表空间,然后为将要分配的下一个对象选择下一个表空间并依此类推,直到用尽所有合适的表空间后回到第一个表空间。但是,在大多数情况下,建议您不要创建多个具有相同页大小的临时表空间。

SQL1585N不存在具有足够页大小的系统临时表空间。 

解释: 

可能发生了下列其中一种情况: 

1.    系统临时表的行长度超过了数据库中最大系统临时表空间中可接受的限 
    制。 

2.    系统临时表中所需的列数超过了数据库中最大系统临时表空间中可接受 
    的限制。 

系统临时表空间限制取决于其页大小。这些值是: 


  最大         最大   临时 
  记录         列数   表空间的 
  长度                页大小 
  -----------  ----  ------------ 
  1957  字节   244   2K 
  4005  字节   500   4K 
  8101  字节   1012  8K 
  16293 字节   1012  16K 
  32677 字节   1012  32K 


The view being compiled is based on other view which contain a function that has the return parameter VARCHAR(32672). 

SQLLIB\BIN> db2 list tablespaces show detail表空间标识                        = 1名称                              = TEMPSPACE1类型                              = 系统管理空间内容                              = 系统临时数据......页大小(以字节计)                = 4096......I tried to reduce the return parameter length down to 4005 in the function, but the error continues to happen as compiling the view. Finally it works for VARCHAR(3600) as maximum. 

Please see following test case. 


The function.CREATE FUNCTION zytst.fun1RETURNS VARCHAR(32672)LANGUAGE SQLDETERMINISTICNO EXTERNAL ACTIONREADS SQL DATARETURN 'abc'@ 
The inner view. 
CREATE VIEW zytst.v1 ASVALUES zytst.fun1() AS c1@ 
The view occurring error. 
CREATE VIEW zytst.v2 ASSELECT c1 AS c1 FROM zytst.v1@ 
The function fun1 and the view v1 could be compiled successfully in the DB whose system temporary tablespace only has 4KB pagesize in bufferpool. But the v2 could Not be compiled in the same DB. 
解决方法参考: 
http://blog.sinzy.net/richard/entry/6679 

DB2默认的页大小是4K,这样的表的字段太长,接近8K.一条记录不能跨页存储. 
所以我们需要创建一个页长为8K的表空间. 
首先,创建8K的缓冲池: 

create bufferpool ibmdefault8k IMMEDIATE  SIZE 5000 PAGESIZE 8 K ; 

再创建一个系统临时表空间才能让DB2 shut up. 

CREATE TEMPORARY TABLESPACE mysystmp1 
  IN DATABASE PARTITION GROUP IBMTEMPGROUP 
  PAGESIZE 8K 
  MANAGED BY SYSTEM 
  USING 
  ('D:\DB2\mysapce' 
  ) 
  EXTENTSIZE 32 
  PREFETCHSIZE 16 
  BUFFERPOOL IBMDEFAULT8K 
  OVERHEAD 24.10 
  TRANSFERRATE 0.90 
  DROPPED TABLE RECOVERY OFF; 

然后,使用该缓冲池创建一个表空间 

CREATE TABLESPACE mytbs 
  IN DATABASE PARTITION GROUP IBMDEFAULTGROUP 
  PAGESIZE 8K 
  MANAGED BY SYSTEM 
  USING 
  ('D:\DB2\mytables' 
  ) 
  EXTENTSIZE 32 
  PREFETCHSIZE 16 
  BUFFERPOOL IBMDEFAULT8K  
  OVERHEAD 24.10 
  TRANSFERRATE 0.90 
  DROPPED TABLE RECOVERY OFF; 
GRANT USE OF TABLESPACE mytbs TO PUBLIC; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值