测试中使用的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进行分段存储,也采用相同的测试方法,结果基本一致,但是效果没有基于表达式的方法好。
综上所述,分段存储能提高数据库的效率,是数据库查询优化方法之一,但是它也有一定的缺陷。在对数据库进行查询优化时,可以使用分段存储。但不能对数据库中所有的表都实行分段存储,而是要有选择的进行。