2018-03-21 23:03:53 qingsong3333 阅读数 1392
  • mongodb深度学习

    mongodb介绍/文档型存储/安装 启动 连接/库表入门操作/增/删/改/查/查询表达式/游标/group操作/mapReduce原理/mapReduce统计平均价格/下载并导入地震数据/按经纬度统计数据/热力图/展示地震数据

    10447 人正在学习 去看看 刘道成(燕十八)

有时候,发现DB2系统临时表空间使用率很高,想知道哪些应用占用了临时表空间,以及这些应用执行的SQL语句,怎么办?

Technote How to find application that uses up temporary tablespace 中已经有介绍,我这里的工作只是写成了脚本,以方便快速查找。

注意,下面的shell脚本没有注释,仅在db2 10.5版本上测试,需要你自己把sample改成您的数据库名子:

db2 connect to sample > /dev/null

awk 'BEGIN{printf("Top 10 applications that used temporary tablespaces:\n")}'
awk 'BEGIN{printf("\n=======Summary======\n")}'
awk 'BEGIN{printf("AppHdl\t\tTempUsageMB\n")}'
awk 'BEGIN{printf("------\t\t-----------\n")}'
db2pd -db sample -tcb | sed '1,/TCB Table Stats/d' | awk '$2~/TEMP/ && $(NF-1)!~/-/ {printf("%s,%s\n",$4,$(NF-1))}' | awk -F'<|,|>' '{printf("%s\t%f\n",$2, $NF/1024.0/1024.0)}' | awk '{array[$1] += $2} END { for (agt in array) printf("%s\t\t%f\n",agt, array[agt])}' | sort -nr -k 2 | head -n 10

awk 'BEGIN{printf("\n\n=======Detailed Application Info======\n")}'
agentids=`db2pd -db sample -tcb | sed '1,/TCB Table Stats/d' | awk '$2~/TEMP/ && $(NF-1)!~/-/ {printf("%s,%s\n",$4,$(NF-1))}' | awk -F'<|,|>' '{printf("%s\t%f\n",$2, $NF/1024.0/1024.0)}' | awk '{array[$1] += $2} END { for (agt in array) printf("%s\t\t%f\n",agt, array[agt])}' | sort -nr -k 2 | head -n 10 | awk '{print $1}'`

agentids=`echo $agentids | tr ' ' ','`

db2 "select substr(APPLICATION_HANDLE,1,10) as APPHDL,substr(N.APPL_ID,1,35) as APPID,substr(ACTIVITY_STATE,1,10) as ACT_STATE, substr(ACTIVITY_TYPE,1,10) as ACTIVITY_TYPE,substr(STMT_TEXT,1,200) as STMT_TEXT from SYSIBMADM.MON_CURRENT_SQL as M, TABLE(SNAP_GET_APPL_INFO('$dbname',-2)) AS N where APPLICATION_HANDLE in ($agentids) and M.APPLICATION_HANDLE = N.AGENT_ID" 

示例输出如下:

inst105@db2a:~$ sh getTempSpaceUsage.sh 
Top 10 applications that used temporary tablespaces:

=======Summary======
AppHdl        TempUsageMB
------          -----------
349             160.341296
348             105.761441
347             94.640239

=======Detailed Application Info======

APPHDL     APPID                                           ACT_STATE    ACTIVITY_TYPE  STMT_TEXT                       
---------- ----------------------------------- -   ---------        -------------       --------------------------------
347        *LOCAL.inst105.180321145120         EXECUTING  READ_DML      select * from t1 order by id    
348        *LOCAL.inst105.180321145121         EXECUTING  READ_DML      select * from t2 order by id    
349        *LOCAL.inst105.180321145122         EXECUTING  READ_DML      select id from t3 order by id                                                                                                                                                                           
  3 record(s) selected.

2014-05-26 14:28:15 pianzif 阅读数 6783
  • mongodb深度学习

    mongodb介绍/文档型存储/安装 启动 连接/库表入门操作/增/删/改/查/查询表达式/游标/group操作/mapReduce原理/mapReduce统计平均价格/下载并导入地震数据/按经纬度统计数据/热力图/展示地震数据

    10447 人正在学习 去看看 刘道成(燕十八)

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

更大记录标识符(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; 
2006-12-11 16:55:44 zlnyjj 阅读数 231
  • mongodb深度学习

    mongodb介绍/文档型存储/安装 启动 连接/库表入门操作/增/删/改/查/查询表达式/游标/group操作/mapReduce原理/mapReduce统计平均价格/下载并导入地震数据/按经纬度统计数据/热力图/展示地震数据

    10447 人正在学习 去看看 刘道成(燕十八)

DB2 临时表的注意事项 
 
  在使用DB2的临时表时, 以下几点需要注意:

  1. DB2的临时表需要用命令Declare Temporary Table来创建, 并且需要创建在用户临时表空间上;

  2. DB2在数据库创建时, 缺省并不创建用户临时表空间, 如果需要使用临时表, 则需要用户在创建临时表之前创建用户临时表空间;

  3. 临时表的模式为SESSION;

  4. 缺省情况下, 在Commit命令执行时, 临时表中的所有记录将被删除; 这可以通过创建临时表时指定不同的参数来控制;

  5. 运行ROLLBACK命令时, 用户临时表将被删除;

  6. 在DB2版本8中, 可以对临时表纪录日志;
 

2015-09-09 16:06:55 lovedieya 阅读数 1713
  • mongodb深度学习

    mongodb介绍/文档型存储/安装 启动 连接/库表入门操作/增/删/改/查/查询表达式/游标/group操作/mapReduce原理/mapReduce统计平均价格/下载并导入地震数据/按经纬度统计数据/热力图/展示地震数据

    10447 人正在学习 去看看 刘道成(燕十八)

重建临时表空间的方式处理了一下,记录如下:

1.创建中转临时表空间
create temporary tablespace temp1 tempfile '/oracle/oradata/secooler/temp02.dbf' size 512m reuse autoextend on next 1m maxsize unlimited;

2.改变缺省临时表空间为刚刚创建的新临时表空间temp1
alter database default temporary tablespace temp1;

3.删除原临时表空间
drop tablespace temp including contents and datafiles;

4.重建临时表空间
create temporary tablespace temp tempfile '/oracle/oradata/secooler/temp01.dbf' size 512m reuse autoextend on next 1m maxsize unlimited;

5.重置缺省临时表空间为新建的temp表空间
alter database default temporary tablespace temp;

6.删除中转用临时表空间
drop tablespace temp1 including contents and datafiles;

2010-01-07 21:49:13 lgrain 阅读数 120
  • mongodb深度学习

    mongodb介绍/文档型存储/安装 启动 连接/库表入门操作/增/删/改/查/查询表达式/游标/group操作/mapReduce原理/mapReduce统计平均价格/下载并导入地震数据/按经纬度统计数据/热力图/展示地震数据

    10447 人正在学习 去看看 刘道成(燕十八)
创建数据库:
create database uvm using codeset UTF-8 territory CN pagesize 8k
创建缓冲区 new
create bufferpool new size 4000 pagesize 8K
创建表空间 liuspacenew1
create tablespace liuspacenew1 pagesize 8K managed by system using('C:\DB2\liuspace1') bufferpool new

在表空间创建表
create table newtable(new varchar(6)) in liuspacenew1
没有更多推荐了,返回首页