| 免费下载:IBM® Informix® 11.7 试用版(包括 Ultimate Edition、Developer Edition 和 Innovator-C Edition) |
|---|
| 下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。 |
在“Informix 数据仓库加速器原理与实践”系列文章的第二部分中,我们为大家介绍了 Informix 数据仓库加速器 IWA(Informix Warehouse Aaccelerator) 使用的具体场景、安装及部署的基本方法与要求、IWA 配置的基本方法。在本文中,我们会为大家介绍 Informix 数据仓库加速器 IWA(Informix Warehouse Aaccelerator) 创建数据集市、部署及装载数据集市的基本方法,并为大家介绍使用 Informix 数据仓库加速器 IWA(Informix Warehouse Aaccelerator) 加速查询的使用方法,希望能够帮助大家快速掌握利用 Informix 数据仓库加速器 IWA 优化分析应用的基本方法。
首先,我们需要设计一个高效的数据集市。数据集市是数据仓库的子集,主要针对某一主题或某一部门分析应用来设计,数据集市通常是基于星型模型或雪花型模型进行设计。我们可以通过分析用户特定查询需求、用户查询语句来设计合理的数据集市,来满足用户的查询分析需求。有时,我们对用户的查询语句不太了解,我们也可以通过使用 SQLTRAC 语句来分析用户查询负载来帮助我们设计合理的数据集市。 为了提高查询性能,在数据集市定义时,我们会设计合理数量的维表以及维表中的字段。
在我们设计数据集市时,并不要求事实表一定和 Informix 数据仓库中的事实表相同。默认情况下,在使用 Informix 数据仓库加速器管理工具 IBM Smart Analytics Optimizer Studio 定义数据集市时,会将数据集市中最大的表设置为事实表,我们也可以自己指定数据集市中的事实表。
在本次示例中,我们设计了 WebSales_Mart 数据集市,如下图所示,它包括了 web_sales 事实表及 time_dim、web_page、date_dim、iyem、customer、promotion、warehouse、website、ship_mode 等维表。
图 1. WebSales_Mart 数据集市星型模型
设计好数据集市之后,我们需要在 Informix 数据仓库加速器管理工具 IBM Smart Analytics Optimizer Studio 中创建数据集市的定义。数据集市定义信息保存在 XML 文件中,它描述了数据集市中定义的表、字段以及表和表之间的关系。XML 文件只保存数据集市的定义信息,但不包含用户实际数据。 当部署数据集市时,数据集市定义信息被传送给 IWA,数据集市成功部署后,IWA 会将数据集市定义信息以 SQL 语句形式返回给 Informix 数据库并在 Informix 数据库系统表中创建 accelerated query table or AQT,当用户发出查询请求后,Informix 优化器会将用户查询语句同 AQT 进行匹配,满足条件的查询语句会被重路由到 IWA 中来加快查询速度。
在 IWA 中,我们可以采用两种方法来创建数据集市的定义:使用 IBM Smart Analytics Optimizer Studio 图形管理工具或通过工作负载分析来创建数据集市。
使用 IBM Smart Analytics Optimizer Studio 创建数据集市
首先,我们要在 IBM Smart Analytics Optimizer Studio 中创建一个 accelerator 工程。如下图所示,在本次示例中,我们创建了 IWADEMO 工程。
图 2. 创建 IWADEMO 工程
接下来,我们在 IWADEMO 工程中使用 New Data Mart wizard 创建 WebSales_Mart 数据集市,如下图所示。
图 3. 创建 WebSales_Mart 数据集市
并添加 dwa_ds.web_site 事实表及相关维表到 WebSales_Mart 数据集市,如下图所示,我们选择 dwa_ds.web_site 作为事实表,并通过参照完整性约束来添加相关的维表。我们也可以自己定义数据集市中事实表以及维表之间的连接。
图 4. 添加事实表及相关维表到 WebSales_Mart 数据集市
如下图所示,我们选择了 dwa_ds.web_site 事实表及相关维表添加到 WebSales_Mart 数据集市中。
图 5. 添加 dwa_ds.web_site 事实表及相关维表添加到 WebSales_Mart
同时,我们要为数据集市中的每一张表选择需要装载数据的字段。如下图所示,在本次示例中,数据集市中的每一张表都选择了所有字段。当选择好表中的数据装载字段后,IBM Smart Analytics Optimizer Studio 会为数据集市定义中的事实表及维表估算空间大小,我们可以以此来估算整个数据集市的空间大小。
图 6. 选择字段信息
我们可以在 IBM Smart Analytics Optimizer Studio 工具的 Project Explorer 窗口中查看我们定义的数据集市定义信息。如下图所示,在 IWADEMO 工程中,我们定义了 WebSales_Mart 数据集市。当我们在 IBM Smart Analytics Optimizer Studio 工具中定义好数据集市后,数据集市定义信息会以 XML 文件形式保存在项目工作空间中。
图 7. 数据集市定义信息
在定义好数据集市后,我们需要对创建的数据集市定义进行完整性验证,如下图所示,我们在 WebSales_Mart 数据集市上点击右键选择 Validate 对 WebSales_Mart 数据集市进行完整性验证。
图 8. 验证 WebSales_Mart 数据集市
从 Informix 11.7xC3 开始,我们支持通过工作负载分析来创建数据集市。当我们对数据库表结构及应用查询语句不太了解,或者数据库包含太多表时,我们可以采用通过工作负载分析来创建数据集市。当我们采用通过工作负载分析来创建数据集市时,我们访问的数据库必须是本地数据库,并且设置了默认的智能大对象表空间 (smart blob space)。
通过工作负载分析来创建数据集市主要包括 2 个步骤:查询探寻 (query probing) 及数据分析 (data analysis)。
查询探寻用于收集有关查询工作负载的信息,数据分析用来将收集到的查询工作负载信息及数据库表结构信息进行分析,并最终生成数据集市定义信息。
首先,我们需要执行 update statistics low 命令来收集数据库最基本的统计信息。如下边所示。
接下来,我们通过执行 set environment use_dwa 'probe start'命令来启动数据探寻功能。我们可以在应用程序中或者通过使用 sysdbopen() 过程来运行该命令。当启动数据探寻功能后,我们就可以开始收集用户执行的所有查询语句信息。我们还可以通过使用 SQL tracing 功能来为收集到的每一条查询语句指定一个 statement ID,并根据我们所关心的部分查询语句来生成数据集市定义,比如说,我们可以基于查询时间大于 5 秒的查询语句来生成数据集市定义。有关 SQL tracing 功能的具体使用方法,大家可以参考 Informix 相关手册。收集到的探寻数据将保存在内存中。
我们还可以在执行用户查询语句之前执行 set explain on avoid_execute 语句来加快数据探索的过程,如下边所示,当我们执行 set explain on avoid_execute 语句后,用户的所有查询语句将会被编译,探寻的数据将会被收集,但用户的查询语句不会被执行,数据探索的过程会大大加快。
在本次示例中,为了提高数据探索的过程的速度,我们执行了 set explain on avoid_execute 语句。
接下来的 SQL 语句用来模拟用户的查询工作负载,并通过分析用户的这些查询语句来生成数据集市的定义。数据探寻过程需要确定查询的事实表。我们可以通过 +FACT 提示来指定事实表,如果没有指定,数据量最大的表将被确定为事实表。
清单 1. 通过分析查询工作负载生成数据集市定义
informix@informixva[demo_on]:~/scripts$vi workload_analysis.sql
update statistics low;
set environment use_dwa 'probe start';
set explain on avoid_execute;
select {+FACT(web_sales)} first 100 sum(ws_net_paid) as total_sum, i_category, i_class
from web_sales, date_dim d1, item
where d1.d_year = 2002 and d1.d_date_sk = ws_sold_date_sk and i_item_sk = ws_item_sk
group by 2,3 order by 2,3;
select {+FACT(web_sales)} first 1000 a.ca_state state, count(*) cnt
from customer_address a, customer c, web_sales s, date_dim d, item i
where a.ca_address_sk = c.c_current_addr_sk and c.c_customer_sk = s.ws_bill_customer_sk
and s.ws_sold_date_sk = d.d_date_sk and s.ws_item_sk = i.i_item_sk
and d.d_month_seq >= 2 and i.i_current_price > 50.00
group by a.ca_state having count(*) >= 10 order by cnt;
select {+FACT(web_sales)} first 1000 i_item_id, avg(ws_quantity) agg1,
avg(ws_list_price) agg2, avg(ws_coupon_amt) agg3,avg(ws_sales_price) agg4
from web_sales, customer_demographics, date_dim, item, promotion
where ws_sold_date_sk = d_date_sk and ws_item_sk = i_item_sk and
ws_bill_cdemo_sk =cd_demo_sk and ws_promo_sk = p_promo_sk and cd_gender = 'F' and
cd_marital_status = 'M' and cd_education_status = 'College' and
(p_channel_email = 'N' or p_channel_event = 'N') and d_year = 2001
group by i_item_id
order by i_item_id,agg1,agg2,agg3,agg4;
|
当收集到用户查询语句后,我们可以通过执行 onstat -g probe 语句或通过查询 sysprobetables、sysprobecolumns、sysprobejds 及 sysprobejps 系统表来查看收集到的查询语句信息。如下边所示,我们通过执行 onstat -g probe 语句来查看收集到的查询信息。
清单 2. 执行 onstat -g probe 语句来查看收集到的查询信息
informix@informixva[demo_on]:~/scripts$onstat -g probe
IBM Informix Dynamic Server Version 11.70.FC3 -- On-Line -- Up 01:44:36 -- 190288 Kbytes
DWA probing data for database ds2:
statement -1:
columns: tabid[colno,...]
102[1,9]
103[1,2,3,4]
104[1,4,7]
110[1,2,6,11,13]
113[1,5]
118[1,10,15]
123[1,4,5,6,17,19,21,22,28,30] f
joins: tabid[colno,...] = tabid[colno,...] (type) {u:unique}
123[17] = 118[1] (inner) u
123[6] = 103[1] (inner) u
113[5] = 102[1] (inner) u
123[5] = 113[1] (inner) u
123[4] = 110[1] (inner) u
123[1] = 104[1] (inner) u
|
其中,tabid 表示收集到的表信息,colno 表示该表中所包含的字段信息,f 表示它所在的表为事实表,joins 表示表和表之间的连接关系,(inner) 表示表和表采用内连接方式,118[1] (inner) u 表示 tabid 为 118 表的第一个字段上有唯一索引。
接下来,我们需要创建一个新的带日志的数据库来保存数据集市定义信息,它必须是一个单独的数据库,不能使用已有的数据仓库数据库。如下边所示,在本次示例中,我们创建了 marts_stores 数据库。
我们通过执行 execute procedure probe2mart('ds2','WebSales_Mart') 语句将从 ds2 数据库中收集到的查询语句信息转换为 WebSales_Mart 数据集市定义信息并保存到 marts_stores 数据库中的一系列表中。我们也可以使用 SQL tracing 功能基于收集到的部分查询语句来生成数据集市定义,如:执行下边语句来选择执行时间大于 10 秒的语句来生成数据集市定义。
清单 3. 选择执行时间大于 10 秒的语句来生成数据集市定义
SELECT probe2mart( ‘ ds2 ’ , ’ WebSales_Mart ’ ,sql_id) FROM sysmaster:syssqltrace WHERE sql_runtime > 10; |
我们通过执行 execute function lotofile(genmartdef('WebSales_Mart'),'WebSales_Mart.xml!','client') 语句生成 XML 形式的 WebSales_Mart 数据集市定义信息,并将其保存在客户端的 WebSales_Mart.xml 文件中。
最后,我们要将创建的 WebSales_Mart 数据集市定义文件导入到 IBM Smart Analytics Optimizer Studio。我们先要在 IBM Smart Analytics Optimizer Studio 中创建一个 accelerator 工程,在本次示例中,我们创建了 IWADEMO 工程,并在 IWADEMO 工程上点击右键选择 Import-> Data Mart Import,将我们创建的 WebSales_Mart.xml 文件导入 IBM Smart Analytics Optimizer Studio。
清单 4. 将 WebSales_Mart.xml 文件导入 IBM Smart Analytics Optimizer Studio
informix@informixva[demo_on]:~/scripts$ dbaccess ds2 -
Database selected.
> create database marts_stores with log;
Database closed.
Database created.
> connect to 'marts_stores';
Disconnected.
Connected.
> execute procedure probe2mart('ds2','WebSales_Mart');
Routine executed.
> execute function lotofile(genmartdef('WebSales_Mart'),'WebSales_Mart.xml!','client');
(expression) WebSales_Mart.xml
1 row(s) retrieved.
|
另外,如下边所示,我们可以通过在 ds2 数据库中执行 set environment use_dwa 'probe cleanup'语句清除收集到的查询语句信息。
清单 5. 执行'probe cleanup'语句清除收集到的查询语句信息
informix@informixva[demo_on]:~/scripts$ dbaccess ds2 - Database selected. > set environment use_dwa 'probe cleanup'; Environment set. |
当我们生成好 XML 形式的数据集市定义信息后,我们需要将其部署到 IWA 中。当部署数据集市时,数据集市定义信息被传送给 IWA,数据集市成功部署后,IWA 会将数据集市定义信息以 SQL 语句形式返回给 Informix 数据库并在 Informix 数据库系统表中创建 accelerated query table or AQT 来匹配用户的查询语句。我们可以采用 IBM Smart Analytics Optimizer Studio 工具或 java CLI 来部署数据集市。
当数据集市成功部署后,数据集市处于 LOAD PENDING 状态,并且不可用,直到数据装载完成后,该数据集市才可以使用。
在数据装载过程中,Informix 数据库中相关的数据自动装入数据集市中,装载完成后,数据集市可以使用并处于活动状态。我们也可以将数据技术设置为不可用,这样,该数据集市将不会被查询语句所使用。同样,我们可以采用 IBM Smart Analytics Optimizer Studio 工具或 java CLI 来装载数据集市。
使用 IBM Smart Analytics Optimizer Studio 部署并装载数据集市
如下图所示,我们在 IBM Smart Analytics Optimizer Studio 工具中的 Data Source Exploer 选择 IWADEMO 加速器实例,在其属性栏中,选择 Data Marts,并点击 Deploy 按钮来部署数据集市:
图 9. 部署数据集市
在数据集市部署界面,我们可以选择部署 Accelerator 工程中的数据集市,或者部署数据集市 XML 文件,在本次示例中,我们选择部署 IWADEMO 工程中的数据集市 WebSales_Mart。同时,我们可以选择在部署完数据集市后,自动装载该数据集市。如下图所示。
图 10. 部署并装载 WebSales_Mart 数据集市
在装载数据集市时,我们可以选择是否要对数据库中的表上锁,根据我们的业务需求,可以采用如下 3 种数据装载方式:
表 1. 数据装载的选项:
| 选项 | 说明 |
|---|---|
| NONE | 在数据装载过程中不对表加锁,数据读取方式类似于“脏读”。在数据装载过程中,其它用户会话可以修改表中的数据,会造成装载的数据不一致的情况。如果数据集市主要用于统计分析或进行趋势分析而不是查找具体数据值,这种数据不一致的现象是可以接受的。 |
| TABLE | 在数据加载过程中,读取每一张表中的数据时,都会对该表加锁,这样,可以保证该表数据的一致性,但不能保证多表之间的数据一致性。 |
| MART | 在数据加载过程中会对数据集市中的所有表加锁,这样可以保证数据集市中的所有表数据的一致性。但是,在数据加载过程中,其它用户会话的更新操作会被阻止。 |
在本次示例中,我们选择了 NONE 装载方式。
当数据集市部署并装载成功后,数据集市 WebSales_Mart 可用,并且其状态为 Active。如下图所示。这样,该数据集市就可以使用了。
图 11. 数据集市 WebSales_Mart 状态
同时,我们也可以在 ds2 数据库中查看到数据集市 WebSales_Mart 部署成功后所创建的 aqt49c6c50b-f25d-48c1-93fa-ec44adc4ebbe 视图,如下边所示。
清单 6. aqt49c6c50b-f25d-48c1-93fa-ec44adc4ebbe 视图信息
informix@informixva[demo_on]:dbaccess ds2 - Database selected. > select * from systables; tabname aqt49c6c50b-f25d-48c1-93fa-ec44adc4ebbe owner dwa partnum 0 tabid 206 rowsize 5974 ncols 647 nindexes 0 nrows 0.00 created 08/09/2011 version 0 tabtype V locklevel B npused 0.00 fextsize 0 nextsize 0 flags 128 site IWADEMO dbname WebSales_Mart type_xid 0 am_id 0 pagesize 0 ustlowts secpolicyid 0 protgranularity statchange 0 statlevel |
我们也可以通过 java CLI 工具部署并装载数据集市 WebSales_Mart,如下图所示:
使用 java createMart IWADEMO WebSales_Mart.xml 命令部署数据集市 WebSales_Mart。
清单 7. java CLI 工具部署数据集市 WebSales_Mart
informix@informixva[demo_on]: java createMart IWADEMO WebSales_Mart.xml
createMart IWADEMO WebSales_Mart.xml
---------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message></dwa:messageOutput>
|
使用 java loadMart IWADEMO WebSales_Mart NONE 命令装载数据集市 WebSales_Mart。
清单 8. java CLI 工具装载数据集市 WebSales_Mart
informix@informixva[demo_on]:~/scripts$ java loadMart IWADEMO WebSales_Mart NONE
loadMart IWADEMO WebSales_Mart NONE
---------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message></dwa:messageOutput>
|
同样,我们可以使用 java listMarts IWADEMO 命令查看 IWADEMO 实例中的数据集市信息。
清单 9. java CLI 工具查看数据集市 WebSales_Mart
informix@informixva[demo_on]:~/scripts$ java listMarts IWADEMO
listMarts IWADEMO
---------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message></dwa:messageOutput>
---------------------------------------------------------------------------
mart list:
mart name=" WebSales_Mart " status="Active" memoryConsumptionInMB="208"
lastLoadTimestamp="2011-08-13T17:34:46.005445Z"
|
当数据集市装载成功后,我们就可以利用数据集市来加速数据查询。如下边所示,在利用数据集市加速数据查询时,我们首先需要对数据库执行 UPDATE STATISTICS LOW 命令来收集最新的数据库统计信息。Informix 数据库优化器会根据该统计信息来评估用户查询语句的事实表是否和 AQT 中的事实表相同,如果不相同,该查询语句就不会重定向到 IWA 中去运行。接下来,我们需要设置 PDQPRIORITY 变量,这样,Informix 优化器将会考虑 star join plan,并且可以正确选择事实表。我们还需要设置 use_dwa 变量。我们可以通过设置 use_dwa 变量来告诉 Inforix 优化器是否使用 IWA 来加速数据查询。如果我们将 use_dwa 参数设为 0,或者不进行设置,用户的查询语句将不会重定向到 IWA 来加速。如果将 use_dwa 变量设置为 1,用户的查询语句将被重定向到 IWA 来加速。use_dwa 变量具体设置,可详见如下表格:
表 2. USE_DWA 环境变量可选值:
| 值 | 作用 | 描述 |
|---|---|---|
| 0 | 禁用 IWA 查询加速功能。 | 即使查询语句符合查询加速的条件,查询语句也不会发送给数据仓库加速器。这是 USE_DWA 的默认值。 |
| 1 | 启用查询加速功能。这是 USE_DWA 的建议值。 | 如果查询语句符合加速查询表 (AQTs) 的查询条件,该查询会被发送到数据仓库加速器进行处理,极速提高查询的效率。 |
| 3 | 启用查询加速功能,并将调试信息发送到日志文件中。 | 如果查询语句符合加速查询表 (AQTs) 的查询条件,该查询会被发送到数据仓库加速器进行处理,极速提高查询的效率。同时,将调试信息保存到 Informix 的消息文件中。 |
我们可以在 sysdbopen() 存储过程中设置 use_dwa 变量值,这样可以避免修改应用程序,我们也可以在客户端手工设置该变量。如下边所示,在本次示例中,我们通过 set environment use_dwa '1'命令设置该变量,并允许查询语句被重定向到 IWA 来加速查询。
为了能够更好地查看用户查询语句是否被重定向到 IWA,在示例中,我们对执行的 SQL 语句收集其执行计划,但不执行该语句。这样,我们可以通过查看 SQL 语句的执行计划来检查 SQL 语句是否被重定向到 IWA 来加速查询。
清单 10. query1_iwa.sql 查询语句
informix@informixva[demo_on]: cat query1_iwa.sql set explain file to '/tmp/query1_iwa.out'; set explain on avoid_execute; set environment use_dwa '1'; set PDQPRIORITY 100; select first 100 sum(ws_net_paid) as total_sum ,i_category,i_class from web_sales,date_dim d1,item where d1.d_year = 2002 and d1.d_date_sk = ws_sold_date_sk and i_item_sk = ws_item_sk group by 2,3 order by 2,3; set explain off; |
通过执行上边语句,如下边所示,我们收集到该查询语句的执行计划:
清单 11. 运行 query1_iwa.sql 查询语句
informix@informixva[demo_on]: dbaccess ds2 query1_iwa.sql Database selected. Explain set. Explain set. Environment set. PDQ Priority set. No rows found. Explain set. Database closed. |
通过查看该查询语句的执行计划,如下边所示,我们可以看到,Informix 优化器选择了 ds2@IWADEMO:dwa.aqt49c6c50b-f25d-48c1-93fa-ec44adc4ebbe: REMOTE PATH,也就意味着该查询语句被重定向到 IWA 来加速查询。
清单 12. 查询 query1_iwa.sql 语句执行计划
informix@informixva[demo_on]:/tmp$ cat query1_iwa.out
QUERY: (ISAO-Avoid_Execute)(OPTIMIZATION TIMESTAMP: 08-09-2011 10:20:07)
------
select first 100 sum(ws_net_paid) as total_sum,i_category,i_class
from web_sales,date_dim d1,item
where d1.d_year = 2002 and d1.d_date_sk = ws_sold_date_sk and i_item_sk = ws_item_sk
group by 2,3
order by 2,3
Estimated Cost: 115978
Estimated # of Rows Returned: 110
Maximum Threads: 0
1) ds2@IWADEMO:dwa.aqt49c6c50b-f25d-48c1-93fa-ec44adc4ebbe: REMOTE PATH
Remote SQL Request:
{QUERY {FROM dwa.aqt49c6c50b-f25d-48c1-93fa-ec44adc4ebbe} {WHERE
(({= COL570 2002 } {ISNOTNULL COL564 } ){ISNOTNULL COL104 } )}
{SELECT {SUM COL186 } {SYSCAST COL116 AS CHAR 50 819} {SYSCAST
COL114 AS CHAR 50 819} } {GROUP COL116 COL114 } {ORDER COL116 ASC
NULLSFIRST COL114 ASC NULLSFIRST } {NUMROWS 100 } }
QUERY: (IDS-Avoid_Execute)(OPTIMIZATION TIMESTAMP: 08-09-2011 10:20:07)
------
select first 100 sum(ws_net_paid) as total_sum,i_category,i_class
from web_sales,date_dim d1,item
where d1.d_year = 2002 and d1.d_date_sk = ws_sold_date_sk and i_item_sk = ws_item_sk
group by 2,3
order by 2,3
Estimated Cost: 115978
Estimated # of Rows Returned: 110
Maximum Threads: 0
Temporary Files Required For: Group By
1) informix.d1: INDEX PATH
(1) Index Name: dwa_ds.date_dim_idx
Index Keys: d_year (Parallel, fragments: ALL)
Lower Index Filter: informix.d1.d_year = 2002
2) dwa_ds.web_sales: INDEX PATH
(1) Index Name: informix. 123_187
Index Keys: ws_sold_date_sk (Parallel, fragments: ALL)
Lower Index Filter: informix.d1.d_date_sk = dwa_ds.web_sales.ws_sold_date_sk
NESTED LOOP JOIN
3) dwa_ds.item: INDEX PATH
(1) Index Name: informix. 110_55
Index Keys: i_item_sk (Parallel, fragments: ALL)
Lower Index Filter: dwa_ds.item.i_item_sk = dwa_ds.web_sales.ws_item_sk
NESTED LOOP JOIN
|
如果我们执行 set environment use_dwa '0'语句将 use_dwa 变量设置为 0,执行相同的查询语句,如下边所示,通过查看该语句的执行计划,我们可以看到,Informix 优化器选择了 dwa_ds.web_sales 事实表,也就意味着该查询语句在 Informix 数据库中执行,并没有重定向到 IWA 中。
清单 13. 查询 query1_without_iwa.sql 语句执行计划
informix@informixva[demo_on]:cat query1_without_iwa.sql
set explain file to '/tmp/query1_without_iwa.out';
set explain on avoid_execute;
set PDQPRIORITY 100;
select first 100 sum(ws_net_paid) as total_sum ,i_category,i_class
from web_sales,date_dim d1,item
where d1.d_year = 2002 and d1.d_date_sk = ws_sold_date_sk
and i_item_sk = ws_item_sk
group by 2,3 order by 2,3;
set explain off;
informix@informixva[demo_on]:~$ dbaccess ds2 query1_without_iwa.sql
Database selected.
Explain set.
Explain set.
Environment set.
PDQ Priority set.
No rows found.
Explain set.
Database closed.
informix@informixva[demo_on]:/tmp$ cat query1_without_iwa.out
QUERY: (OPTIMIZATION TIMESTAMP: 08-09-2011 10:26:27)
------
select first 100 sum(ws_net_paid) as total_sum ,i_category,i_class
from web_sales,date_dim d1,item
where d1.d_year = 2002 and d1.d_date_sk = ws_sold_date_sk
and i_item_sk = ws_item_sk
group by 2,3 order by 2,3;
set explain off;
Estimated Cost: 115978
Estimated # of Rows Returned: 110
Maximum Threads: 1
Temporary Files Required For: Order By Group By
1) informix.d1: INDEX PATH
(1) Index Name: dwa_ds.date_dim_idx
Index Keys: d_year (Parallel, fragments: ALL)
Lower Index Filter: informix.d1.d_year = 2002
2) dwa_ds.web_sales: INDEX PATH
(1) Index Name: informix. 123_187
Index Keys: ws_sold_date_sk (Parallel, fragments: ALL)
Lower Index Filter: informix.d1.d_date_sk = dwa_ds.web_sales.ws_sold_date_sk
NESTED LOOP JOIN
3) dwa_ds.item: INDEX PATH
(1) Index Name: informix. 110_55
Index Keys: i_item_sk (Parallel, fragments: ALL)
Lower Index Filter: dwa_ds.item.i_item_sk = dwa_ds.web_sales.ws_item_sk
NESTED LOOP JOIN
|
当 IWA 所在机器由于计划停机或非计划停机重启后,保存在内存中的数据集市数据将会丢失,这时,我们需要做的是启动 IWA 服务。当 IWA 服务启动后,它会自动从 IWA 存储目录中重新加载压缩数据到内存中。IWA 不会再从 Informix 数据库服务器刷新数据集市,它仅仅是加载保存在存储目录中的当前数据集市的副本。在本实例中,IWA 的存储目录是:/data/IBM/informix/dwa/demo,该目录位置是在 dwainst.conf 配置文件中 DWADIR 参数指定的。
下表列出了 IWA 数据集市在存储目录中的具体内容:
清单 13. IWA 数据集市在存储目录中的具体内容
cd /data/IBM/informix/dwa/demo/shared/data/mart-0 informix@informixva[demo_on]:/data/IBM/informix/dwa/demo/shared/data/mart-0$ ls table-0 table-10 table-12 table-3 table-5 table-7 table-9 table-1 table-11 table-2 table-4 table-6 table-8 informix@informixva[demo_on]:/data/IBM/informix/dwa/demo/shared/data/mart-0$ |
我们可以通过观察 IWA 日志文件来了解 IWA 恢复数据的过程:
tail – f /opt/IBM/informix/dwa/demo/node0.log tail – f /opt/IBM/informix/dwa/demo/node1.log
图 12. IWA 日志信息
同时,我们还可以在 IBM Smart Analytics Optimizer Studio 中检查数据集市的状态,如果数据集市的状态是“Enabled”,说明数据集市已经恢复完成,可以正常使用了。
图 13. 数据集市 WebSales_Mart 状态
如果 Informix 数据库数据发生变化,比较典型的是数据库增加了新的数据,我们可以采用如下步骤来刷新 IWA 中数据集市:
- 使 IWA 实例中的数据集市不可用
- 装载最新数据到 IWA 数据集市
我们可以采用 IBM Smart Analytics Optimizer Studio 工具或 java CLI 来刷新数据集市。
采用 IBM Smart Analytics Optimizer Studio 工具刷新数据集市
采用 IBM Smart Analytics Optimizer Studio 工具刷新数据集市的方法和上边介绍的数据装载的方法相同,这里就不赘述了。
首先,我们需要为 Java CLI 创建连接属性文件,该文件包含了连接数据库的相关信息。如下边所示,我们创建 conn.prop 文件,并设置了连接 ds2 数据库相关的信息。
清单 14. 创建 conn.prop 文件
informix@informixva[demo_on]:~/test$ cat conn.prop driver=com.informix.jdbc.IfxDriver URL=jdbc:informix-sqli://localhost:9088/ds2:INFORMIXSERVER=demo_on user=informix passwd=informix informix@informixva[demo_on]:~/test$ |
接下来,我们需要为 Java CLI 设置如下环境变量,如下边所示:
清单 15. 为 Java CLI 设置环境变量
export CLASSPATH=${INFORMIXDIR}/dwa/example/cli/dwacli.jar:${CLASSPATH}
export CLASSPATH=${INFORMIXDIR}/jdbc/lib/ifxjdbc.jar:${CLASSPATH}
export PATH=${INFORMIXDIR}/extend/krakatoa/jre/bin:${PATH}
|
我们通过执行 java setMart IWADEMO WebSales_Mart OFF 命令使 WebSales_Mart 数据集市不可用,如下边所示:
清单 16. 设置 WebSales_Mart 数据集市不可用
informix@informixva[demo_on]:~/test$ java setMart IWADEMO WebSales_Mart OFF
setMart IWADEMO WebSales_Mart OFF
-----------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message></dwa:messageOutput>
informix@informixva[demo_on]:~/test$
|
并执行 java loadMart IWADEMO WebSales_Mart MART 命令来刷新数据,如下边所示,当装载完数据后,WebSales_Mart 数据集市会自动变为可用状态。
清单 17. 刷新 WebSales_Mart 数据集市
informix@informixva[demo_on]:~/test$java loadMart IWADEMO WebSales_Mart MART
loadMart IWADEMO WebSales_Mart MART
-----------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message></dwa:messageOutput>
informix@informixva[demo_on]:~/test$
|
我们可以执行 java listMarts IWADEMO 命令来检查 WebSales_Mart 数据集市的状态及最近一次装载数据的时间。如下边所示,“Active”状态表明 WebSales_Mart 数据集市处于活动状态。
清单 18. 查看 WebSales_Mart 数据集市状态
informix@informixva[demo_on]:~/test$java listMarts IWADEMO
listMarts IWADEMO
-------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message></dwa:messageOutput>
---------------------------------------------------------------------
mart list:
mart name="WebSales_Mart" status="Active" memoryConsumptionInMB="653"
lastLoadTimestamp="2011-08-09T15:19:07.216909Z"
informix@informixva[demo_on]:~/test$
|
如果 Informix 数据库中表结构发生变化,我们需要执行如下步骤:
- 从 IWA 实例中删除数据集市
- 重新创建数据集市定义
- 验证数据集市
- 重新部署数据集市
- 重新装载数据到数据集市
通过“Informix 数据仓库加速器原理与实践”系列文章的介绍,我们对 Informix 数据仓库,特别是 IWA 的原理、优势有了一个基本的了解。同时,我们也了解到配置、使用 IWA 的基本方法及步骤。通过使用 IWA,可以极速加快数据查询速度,为企业业务优化、辅助决策提供更好的帮助。
学习
- 阅读 Informix 11.70 信息中心 Informix 数据仓库加速器 ,获得更多关于 Informix 数据仓库加速器的相关信息。
- 访问 Informix Dynamic Server 产品专题,了解关于 Informix 产品和相关技术资源的详细信息。
- 在 developerWorks 中国网站 Information Management 专区 了解关于信息管理的更多信息。查找技术文档、how-to 文章、培训、下载、产品信息以及更多内容。
- developerWorks 技术活动 和 网络广播:随时关注这些活动中的技术。
- 在 Twitter 上关注 developerWorks。
获得产品和技术
- 使用可以直接从 developerWorks 下载的 IBM 产品评估试用版软件 构建您的下一个开发项目。
讨论
- 参与 developerWorks 博客 并加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。