0

我们有一个非常大的表 LARGEHISTORY 表,它有数百万条记录。目前该表使用 50GB 的表空间,在 DB2 (DB2 v9.5.301.436) 中允许的最大表空间为 65GB。表增长得非常快,我们需要做一些非常快的事情来克服这个问题。

数据库:DB2 v9.5.301.436

我们已经想到的解决方案:

  1. 增加表空间大小,可以使用以下两个选项来实现:

    1. 将 LARGEHISTORY 的表空间从 65GB 更改为 2 TB

      优势:

      • 只需执行少量命令即可增加表空间。

      坏处:

      • 我们需要执行重组,这将需要大量停机时间。

      • 除非我们重新组织,否则表空间的增加不会显示效果

    2. 创建一个新的单独 (2 TB) 表空间并使用过程或使用插入选择语句将 LARGEHISTORY 表从旧表空间移动到新表空间

      优势:

      • 只需执行少量命令即可创建新表空间。

      • 该表可以安全地移动到新的表空间。

      坏处:

      • 应该使 LARGEHISTORY 脱机以确保在迁移完成之前没有事务。

      • 复制 50 GB 的数据可能需要大量停机时间。程序可能会失败,因为它可能无法处理如此庞大的数据。

      • 插入选择语句可能不适用于如此庞大的数据。

      注意:最新版本的 DB2 具有在不停机的情况下将表从旧表移到新表的特性。

  2. 归档或修剪旧数据

    优势:

    • 可以使用预定的作业轻松完成。

    坏处:

    • 旧数据会下线,如果需要获取报告需要人工干预。

    • 所有现有报告都将受到影响并需要更改。

    • 我们将需要经常执行 reorg 以优化表和表空间以提高性能。

  3. 在新表空间中新建表,并将旧表重命名为LARGEHISTORY_OLD

    优势:

    • 我们可以很容易地在新表中快速插入新数据。

    坏处:

    • 在检索时,我们需要在新旧表上使用 join/union 或创建一个新视图。

    • 我们无法使用视图更新数据(除非使用物化视图,这很昂贵)

    • 所有现有报告都将受到影响并需要更改。

如果您有更好的选择,请告诉我。到目前为止,我们正在考虑选项 1.1。对于选项 1.1,我不确定是否会对代码产生任何影响。

4

2 回答 2

1

使用表分区。它需要停机,但它可以防止将来出现问题:http ://www.ibm.com/developerworks/data/library/techarticle/dm-0605ahuja2/

您为每个时期(月、学期)创建一个表分区,并且您只需附加和分离分区。

您必须检查许可证(db2 版本)

于 2014-06-04T17:01:39.357 回答
0
create table t1
(    ...
,    sales_date date not null 
         check ( sales_date between '2012-01-01' and '2012-12-31' )
) in tblspc1 index in inxspc1 long in longspc1;

create table t2
(    ...
,    sales_date date not null 
         check ( sales_date between '2013-01-01' and '2013-12-31' )
) in tblspc2 index in inxspc2 long in longspc2;

create table t3
(    ...
,    sales_date date not null 
         check ( sales_date between '2014-01-01' and '2014-12-31' )
) in tblspc3 index in inxspc3 long in longspc3;


create view LARGEHISTORY as (
    select ..., sales_date from t1
    union all 
    select ..., sales_date from t2
    union all 
    select ..., sales_date from t3
)

attach/detach partitions by recreate the view
于 2014-06-06T20:42:28.510 回答