服务器 频道

Informix Dynamic Server数据库应用

测试中使用的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进行分段存储,也采用相同的测试方法,结果基本一致,但是效果没有基于表达式的方法好。

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

0
相关文章