`

(转)DB2中ALTER TABLE为什么需要REORG操作?

    博客分类:
  • DB2
阅读更多

http://www.flatws.cn/article/program/db2/2011-05-04/24074.html

DB2中ALTER TABLE为什么需要REORG操作?

ALTER TABLE操作在日常开发中很常见,下面是摘自DB2官网关于ALTER TABLE操作的一段话。

Perhaps the most important thing to realize when running an ALTER TABLE statement containing a REORG-recommended operation is that once the ALTER TABLE statement has executed, the table will be placed in the Reorg Pending state. This means that the table is inaccessible for almost all operations until you perform a REORG. See the ALTER TABLE statement in the SQL Referencefor the complete list of ALTER TABLE operations, some of which are also called REORG-recommended operations.

简单地说就是运行ALTER TABLE时要注意当前运行的语句是否需要执行REORG操作,对于这样的ALTER TABLE语句,如果不执行REORG操作的话,基本上目标表就不再可用。至于什么样的语句需要REORG,什么样的不需要,看SQL Reference去!下面是一个具体的例子演示:

CREATE TABLE my_test AS (    SELECT id,       ...       sla_priority1_time,       sla_priority2_time,       sla_priority3_time,       sla_priority4_time,        CAST(NULL AS DECIMAL(11, 2)) AS approvedDouAmount,       CAST(NULL AS DECIMAL(4)) AS year      FROM fin_attributes)WITH NO DATA;ALTER TABLE my_test ALTER COLUMN id SET GENERATED ALWAYS AS IDENTITY;ALTER TABLE my_test ADD COLUMN datetime TIMESTAMP NOT NULL GENERATED BY DEFAULT FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP;ALTER TABLE my_test ALTER COLUMN sla_priority1_time DROP NOT NULL;ALTER TABLE my_test ALTER COLUMN sla_priority2_time DROP NOT NULL;ALTER TABLE my_test ALTER COLUMN sla_priority3_time DROP NOT NULL;REORG TABLE my_test;ALTER TABLE my_test ALTER COLUMN sla_priority4_time DROP NOT NULL;REORG TABLE my_test;INSERT INTO my_test (       ...       sla_priority1_time,       sla_priority2_time,       sla_priority3_time,       sla_priority4_time,        approvedDouAmount,       year)SELECT ...       sla_priority1_time,       sla_priority2_time,       sla_priority3_time,       sla_priority4_time,        NVL(pg.approvedDouAmount, 0),       YEAR(NOW())  FROM fin_attributes f, projgrp pg WHERE f.projgrp_id = pg.id   AND f.project_id IS NULL   AND f.fin_projgrp_id IS NULL UNIONSELECT ...       sla_priority1_time,       sla_priority2_time,       sla_priority3_time,       sla_priority4_time,        NVL(p.approvedDouAmount, 0),       YEAR(NOW())  FROM fin_attributes f, project p WHERE f.project_id = p.id   AND f.projgrp_id IS NULL;

代码有四种颜色,绿色代表不需要执行REORG的语句,红色代表需要执行REORG的语句,黄色是REORG语句,白色你懂的。从代码上可以看出,红色高亮语句虽然要求使用REORG,但不及时运行REORG还可以让后续的几个语句继续执行。原因是DB2允许最多三条语句处于Reorg Pending状态,假如去除第一个REORG,语句“ALTER TABLE my_test ALTER COLUMN sla_priority4_time DROP NOT NULL;”就会执行失败。

结论:如果不确定那个是需要REORG哪个是不需要REORG,索性都用上REORG;虽然在允许有三条语句处于Reorg Pending状态,但最好每条ALTER TABLE对应一个REORG,因为处于Reorg Pending状态的表有可能会阻碍后续操作,具体详情请参考文档:http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/c0023297.htm

PS:REORG TABLE本身是DB2的command,不是正常的SQL语句(Statement)。如果在非命令行环境中想使用REORG的话,可以像下面那样调用存储过程间接执行REORG操作,执行前确保你所使用的帐号有调用这个存储过程的权限:

CALL SYSPROC.ADMIN_CMD('reorg table my_test')
[]

分享到:
评论

相关推荐

    DB2与ORACLE常用语句对照

    - 更新数据:`UPDATE`语句在两个系统中基本一致,但Oracle允许在单个`UPDATE`语句中更新多个表,DB2通常限制为单表更新。 - 删除数据:`DELETE FROM`在两者中也是相同的,但Oracle的`TRUNCATE TABLE`用于快速删除...

    DB2性能安全文件

    #### 十四、为什么要做表的数据重组(压缩)reorg? 数据重组(reorg)有助于回收不再使用的空间,改善数据分布,从而提升查询性能。在ODS中,当表的数据量较大或经常更新时,应及时执行reorg操作。 **何时需要执行...

    db2 修改表数据类型

    在DB2数据库系统中,有时我们需要更改现有表中列的数据类型以适应新的业务需求或提高数据处理效率。本文将详细介绍如何在DB2中修改表的数据类型,并通过一个具体的例子来说明整个过程。 #### 标题与描述中的知识点...

    Java开发人员常用DB2命令总结

    - **命令**:`db2 reorg table tb1` - **说明**:对tb1表进行重组,提高性能。 - **重组检查** - **命令**:`db2 reorgchk` - **说明**:检查表是否需要重组。 #### 五、缓冲池管理 - **查看缓冲池** - **...

    DB2数据库用户手册

    - **UPDATE不能用一个表中的记录为条件修改另一个表中的记录**:DB2不支持跨表更新操作。 - **如果显示调用存储过程时传NULL值要注意**:在调用存储过程时传递NULL值可能会导致意外行为。 #### 四、DB2编程性能注意...

    DB2手册pdf

    尽管文档中提到CURSOR不能定义为WITH UR,但在实际操作中,DB2允许使用`WITH UR`关键字与CURSOR结合。 #### CURSOR ORDER BY 以后不能FOR UPDATE DB2中确实存在这样的限制:带有`ORDER BY`子句的CURSOR不能使用`FOR...

    db2培训总结

    ### DB2培训总结知识点 #### 一、DB2概述 **DB2**是IBM公司研发的一款关系型数据库管理系统,...以上总结了DB2的关键特性和历史发展,以及日常管理和维护中常见的操作指令,为DB2的学习者和使用者提供了全面的视角。

    DB2学习手册

    5. **UPDATE不能用一个表中的记录为条件修改另一个表中的记录:** 更新操作通常只能在一个表上进行,跨表更新需要使用更复杂的逻辑。 #### 四、DB2编程性能注意事项 1. **大数据的导表的使用:** 使用`EXPORT`、`LOAD...

    DB2数据库使用经验积累

    在DB2中执行存储在文件中的脚本通常需要使用`db2 -tf`命令,其中`-t`表示脚本是文本格式,`-f`后跟脚本文件名。 ##### 3.2 建存储过程时CREATE后一定不要用TAB键 在编写存储过程时,使用`CREATE OR REPLACE ...

    牛新庄:DB2使用经验

    - **UPDATE不能用一个表中的记录为条件修改另一个表中的记录**:在DB2中,这样的操作是不允许的。 - **如果显示调用存储过程时传NULL值要注意**:处理NULL值时需要特别注意,确保不会导致错误。 #### 四、DB2编程...

    db2错误代码查看.

    +39501628 - 设置了无效的优化提示,原因代码指定了为什么,忽略优化提示** - **描述**:使用的优化提示无效,查询优化器将忽略这些提示。 - **处理方法**:检查优化提示的有效性和适用性。 **25. +40201521 - ...

    Itrenzheng IBM DB2 000-701认证题库

    虽然视图通常是只读的,但 DB2 提供了一个名为 IMPORT 的工具,它允许在某些情况下将数据导入到视图中。需要注意的是,并非所有视图都支持导入操作。 ##### 9. 成功恢复表空间后的状态(State After Successful ...

    db2开发经验

    5. **UPDATE不能用一个表中的记录为条件修改另一个表中的记录:** 在DB2中,不能直接使用一个表中的记录来更新另一个表中的数据。 6. **如果显示调用存储过程时传NULL值要注意:** 在调用存储过程时传递NULL值可能会...

    DB2性能安全

    - 建表后调整:`ALTERTABLE tablename COMPRESSYES;` - **查询压缩属性**:可以通过查询系统表`systables`的`COMPRESSION`字段来查看表是否可被压缩(`R`表示可压缩)。 #### 二、更新表统计信息(RUNSTATS) - **...

    DB2常见错误代码解释信息

    - **说明**:设置了无效的优化提示,原因代码指定了为什么,忽略优化提示。 - **处理方法**:根据原因代码调整优化提示,或考虑禁用提示。 24. **SQLCODE +402 (SQLSTATE 01521)** - **说明**:未知的位置。 - ...

Global site tag (gtag.js) - Google Analytics