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