优化大表空间

Posted

技术标签:

【中文标题】优化大表空间【英文标题】:Optimizing large tablespace 【发布时间】:2014-06-04 16:04:57 【问题描述】:

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

数据库:DB2 v9.5.301.436

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

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

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

      优势:

      只需要执行几个命令来增加表空间。

      缺点:

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

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

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

      优势:

      只需要执行几个命令就可以创建一个新的表空间。

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

      缺点:

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

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

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

      注意:最新版本的 DB2 具有无需停机即可将表从旧表移至新表的功能。

    归档或修剪旧数据

    优势:

    可以使用计划作业轻松完成。

    缺点:

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

    所有现有报告都将受到影响,需要进行更改。

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

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

    优势:

    我们可以非常快速地在新表中轻松插入新数据。

    缺点:

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

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

    所有现有报告都将受到影响,需要进行更改。

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

【问题讨论】:

百万记录不是很大。 【参考方案1】:

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

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

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

【讨论】:

嗨,问题陈述是关于表空间而不是性能问题。表空间越来越耗尽,因此我没有考虑分区选项。 @Vinayak - 我相信大小限制(您提到的常规 4K 表空间的 65 GB)是每个表分区的。 @Vinayak,你可以在不同的表空间中放置不同的分区。因此,考虑到您描述的场景,范围分区是一种替代方案。 @Lennart,您能否提供有关如何在单独的表空间中创建分区的更多详细信息。 参见例如:ibmdatamag.com/2010/07/creating-and-using-partitioned-tables 该页面的一个示例:CREATE TABLE sales (sales_date DATE, sales_amt NUMERIC(5,2)) IN tbsp0, tbsp1, tbsp2, tbsp3 PARTITION BY RANGE (sales_date) (STARTING ‘1/1/2010’ ENDING ‘12/31/2010’ EVERY 3 MONTHS)【参考方案2】:
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

【讨论】:

以上是关于优化大表空间的主要内容,如果未能解决你的问题,请参考以下文章

MySQL大表优化方案

MySQL大表优化方案

详解MySQL大表优化方案

MySQL 大表优化方案探讨

oracle大表空间预分配问题

详解MySQL大表优化方案( 转)