新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - Web开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
您的位置:首页 > 软件开发 > 数据库 > informix教程 > 正文:Informix Dynamic Server数据库分段存储

Informix Dynamic Server数据库分段存储

新客网 XKER.COM 2007-09-17 来源: limeinan 收藏本文

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

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

共3页: 上一页 [1] [2] [3] 下一页
收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭
发表评论
要记得去论坛讨论,点击注册新会员匿名评论
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
阅读排行
随机推荐
实用信息推荐