我们有一个非常大的表LARGEHISTORY表,它有数百万条记录。目前,该表使用50GB的表空间,DB2中允许的最大表空间为65GB(DB2 v9.5.301.436)。表格增长非常快,我们需要做很快的事情来克服这个问题。
数据库:DB2 v9.5.301.436
我们已经解决过的解决方案:
增加表空间大小,可以使用以下两个选项来实现:
将LARGEHISTORY的表空间从65GB改为2 TB
优势:
缺点:
我们需要执行reorg,这需要很长的停机时间。
除非我们进行重组
创建一个新的独立(2 TB)表空间并移动LARGEHISTORY表 使用过程或使用insert select语句从旧表空间到新表空间
优势:
只需要执行少量命令即可创建新的表空间。
可以安全地将表移动到新的表空间。
缺点:
LARGEHISTORY应该离线以确保在迁移完成之前没有交易。
复制50 GB的数据可能需要大量的停机时间。程序失败的可能性,因为它可能无法处理如此庞大的数据。
插入select语句可能不适用于如此庞大的数据。
注意:最新版本的DB2具有将表从旧表移动到新表而无需停机的功能。
存档或修剪旧数据
优势:
缺点:
旧数据将脱机,如果需要提取报告,我们需要手动干预。
所有现有报告都会受到影响,需要更改。
我们需要经常执行reorg以优化表和表空间以提高性能。
在新表空间中创建新表并将旧表重命名为LARGEHISTORY_OLD
优势:
缺点:
在检索时,我们需要在旧表和新表上使用join / union all或创建新视图。
我们无法使用视图更新数据(除非使用昂贵的物化视图)
所有现有报告都会受到影响,需要更改。
如果您有更好的选择,请告诉我。截至目前,我们正在考虑选项1.1。 使用选项1.1我不确定是否会对代码产生任何影响。
答案 0 :(得分:1)
使用表分区。它需要停机时间,但它可以防止将来出现问题:http://www.ibm.com/developerworks/data/library/techarticle/dm-0605ahuja2/
您为每个句点(月,学期)创建一个表分区,并且只需附加和分离分区。
您必须检查许可证(db2 edition)
答案 1 :(得分: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