科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Informix Dynamic Server数据库分段存储 (3)

Informix Dynamic Server数据库分段存储 (3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

测试中使用的dbspace是datatest1和datatest2,其分别对应了data_chunk7和data_chunk8的两个chunk。

作者:limeinan 来源:赛迪网 2007年9月20日

关键字: 数据库 Server Informix production

  • 评论
  • 分享微博
  • 分享邮件

测试中使用的dbspace是datatest1和datatest2,其分别对应了data_chunk7和data_chunk8的两个chunk。测试用的数据库建立在datatest1中,在数据库中有两个表,表的名称是dcc_saacnamt和dcc_saacnamt1,两个表的结构一样,存储的数据一样,记录数都是148万条,都没有建立索引。

表dcc_saacnamt存储在datatest2中,没有采用分段存储;表dcc_saacnamt1采用分段存储,分别存储在datatest1和datatest2中。首先采用基于表达式的范围规则对dcc_saacnamt1进行分段存储,建表的表达式为:

create table dcc_saacnamt1 ( 
sa_acct_no char(28) not null , 
…… 
etl_load_date date ) 
FRAGMENT BY EXPRESSION 
etl_load_date <= "20050630" and etl_load_date >= "20050101" 
in datatest2, 
etl_load_date <="20051231" and etl_load_date>="20050701" 
in datatest1;

为了方便测试,将etl_load_date的取值定在2005年1月1日到2005年12月31日之间。

测试用shell如下:

date >aa {输出开始时间} 
dbaccess -s testfrag<<!{打开测试用数据库} 
set explain on;{打开informix跟踪器} 
SET OPTIMIZATION FIRST_ROWS;{打开informix选择最优的查询路径} 
set pdqpriority high;{打开informix PDQ并行查询开关} 
drop table test_poll1; 
create table test_poll1{建立测试用表} 
( 
sa_no char(28), 
etl_date date 
) in datatest1; 
insert into test_poll1 (sa_no,etl_date) 
select sa_acct_no,etl_load_date from dcc_saacnamt1 
从分段存储表中读取数据} 
where (etl_load_date <= "20050630" 
and etl_load_date>= "20050101"); 
! 
date >>aa{输出分段存储读取数据结束时间} 
dbaccess -s testfrag<<!{打开测试用数据库} 
set explain on;{打开informix跟踪器} 
SET OPTIMIZATION FIRST_ROWS; {
打开informix选择最优的查询路径} 
set pdqpriority high;{打开informix PDQ并行查询开关} 
drop table test_poll; 
create table test_poll{建立测试用表} 
( 
sa_no char(28), 
etl_date date 
) in datatest1; 
insert into test_poll (sa_no,etl_date) 
select sa_acct_no,etl_load_date from dcc_saacnamt 
{从非分段存储表中读取数据} 
where (etl_load_date <= "20050630" 
and etl_load_date>= "20050101"); 
! 
date >>aa{输出结束时间}

文件aa记录的结果:

Fri Feb 24 09:47:23 CST 2006

Fri Feb 24 09:47:29 CST 2006

Fri Feb 24 09:48:13 CST 2006

可以看出采用分段存储,读取数据及写表使用了6秒的时间,不分段存储使用了44秒的时间。

在对Informix跟踪器输出的sqexplain.out文件进行分析,发现在从dcc_saacnamt1表中读取数据时,由于表dcc_saacnamt1采用了分段存储,所以在读取和写入数据时,采用了并行操作。对没有分段存储的表dcc_saacnamt的查询只是一般的扫描操作。sqexplain.out文件结果如下:

QUERY: 
{表分段存储后查询数据时Informix跟踪结果} 
insert into test_poll1 (sa_no,etl_date) 
select sa_acct_no,
etl_load_date from dcc_saacnamt1 
where (etl_load_date <= "20050630" 
and etl_load_date>= "20050101") 
Estimated Cost: 2 
Estimated # of Rows Returned: 11 
Maximum Threads: 1 
1) brow.dcc_saacnamt1: 
SEQUENTIAL SCAN (Parallel, fragments: 0) 
Filters: (brow.dcc_saacnamt1.etl_load_date 
<= 2005/06/30 AND brow.dcc_saacna 
mt1.etl_load_date >= 2005/01/01 ) 
QUERY: 
{表非分段存储后查询数据时Informix跟踪结果} 
...... 
insert into test_poll (sa_no,etl_date) 
select sa_acct_no,etl_load_date from dcc_saacnamt 
where (etl_load_date <= "20050630" 
and etl_load_date>= "20050101") 
Estimated Cost: 2 
Estimated # of Rows Returned: 111204 
Maximum Threads: 1 
1) brow.dcc_saacnamt: SEQUENTIAL SCAN 
Filters: (brow.dcc_saacnamt.etl_load_date 
<= 2005/06/30 AND brow.dcc_saacnam 
t.etl_load_date >= 2005/01/01 )

在使用轮转法对dcc_saacnamt1进行分段存储,也采用相同的测试方法,结果基本一致,但是效果没有基于表达式的方法好。

综上所述,分段存储能提高数据库的效率,是数据库查询优化方法之一,但是它也有一定的缺陷。在对数据库进行查询优化时,可以使用分段存储。但不能对数据库中所有的表都实行分段存储,而是要有选择的进行。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章