|
SPAN class=atitle>简介 DB2 Cube Views 是 DB2 Universal Database™(DB2 UDB)的一种附加特性,它为 DB2 UDB 提供了 OLAP 感知能力。数据仓库一般表示为一组表,它要求最终用户知道哪些表和列是相关的以及如何将表联结在一起。DB2 Cube Views 能够将数据仓库的表描述为 OLAP 对象。使用 DB2 Cube Views,应用程序可以将数据仓库表示为具有维和度量的多维数据集。最终用户使用这种方式更容易对数据进行概念化和查看。 对于允许用户查询 DB2 Cube Views 中定义的多维数据集和多维数据集模型的应用程序,需要能够根据 DB2 Cube Views 元数据生成针对数据仓库表的 SQL 查询。可以根据多维数据集模型或多维数据集对象构造 SQL 查询来获得 OLAP 数据。为了使解释更简单,本文描述如何根据多维数据集模型和与多维数据集模型相关的对象(比如事实、维、层次结构和级)生成 SQL 查询。这些说明也可以应用于基于多维数据集和多维数据集相关对象的查询。这些对象引用多维数据集模型中使用的事实、维、层次结构和级对象,它们与多维数据集模型中的这些对象是相似的。但是,它们不包含生成 SQL 查询所需的某些信息,比如联结。因此,在根据多维数据集生成 SQL 查询时,还需要从多维数据集获得多维数据集模型信息,从而获得联结和其他无法从多维数据集相关对象中找到的信息。 按照基本规则和 DB2 Cube Views 元数据定义的多维数据集模型完整性规则,查询的多维数据集模型应该是有效的。本文假设多维数据集模型的维具有平衡的层次结构和标准部署。 对多维查询的分析 生成针对数据仓库表的查询所需的大多数信息存储在多维数据集模型相关对象中。多维数据集模型可以看作星形联结或雪花形联结模式的抽象。它由一个事实对象(代表事实表)和一组维对象(代表维表)组成。事实对象和维对象都可以看作一组相互联结的表。维对象或事实对象的属性是组成维对象或事实对象的联结表上的列或列表达式。与属性相似,度量是组成事实对象的表上的列或列表达式。度量还有一个应用于列或列表达式的聚合函数。然后使用多维数据集模型对象中的联结对象将事实表与每个维对象的表联结起来。 一个查询通常由一个或多个度量组成,这些度量是来自用户感兴趣的事实表的度量实体。 OLAP 查询通常将事实表的许多行聚合成一个相对少量的汇总结果。汇总的数量取决于查询访问的多维数据集模型切片。一个切片包含来自多维数据集模型的每个维的层次结构的一个级。如果查询访问的细节级比事实表中存储的细节级高,那么来自事实表的数据会聚合到正确的细节级。 清单 1 给出了一个基于多维数据集模型的 SQL 查询示例,并展示了 SQL 语句的各个部分如何映射到多维数据集模型中的元素:
单 1. 基于多维数据集模型的 SQL 查询
SELECT[1] T1."MONTH_NUMBER" AS "MONTH_NUMBER (TIME)", T1."YEAR" AS "YEAR (TIME)", T1."MONTH_NAME" AS "MONTH_NAME (TIME)", 'Qtr ' CONCAT (cast(T1."QUARTER_NUMBER" as char(1))) AS "QUARTER_NAME", T3."CITY_NAME" AS "CITY_NAME (LOCATION)", T3."STATE_NAME" AS "STATE_NAME(LOCATION)", T4."PRODUCTID" AS "PRODUCTID (PRODUCT)", T5."LINE_NAME" AS "LINE_NAME (LINE)",[2] SUM(T7."SALES") AS "SALES (SALESFACT)", SUM((T7."COGS") + (T7."ADVERTISING")) AS "Total Expense" FROM [3] "CVSAMPLE"."TIME" AS T1, "CVSAMPLE"."STORE" AS T2, "CVSAMPLE"."LOCATION" AS T3, "CVSAMPLE"."PRODUCT" AS T4, "CVSAMPLE"."LINE" AS T5, "CVSAMPLE"."FAMILY" AS T6, "CVSAMPLE"."SALESFACT" AS T7WHERE[4] (T2."POSTALCODEID" = T3."POSTALCODEID" AND T4."LINEID" = T5."LINEID" AND T5."FAMILYID" = T6."FAMILYID" AND T7."TIMEID" = T1."TIMEID" AND T7."STOREID" = T2."STOREID" AND T7."PRODUCTID" = T4."PRODUCTID")[5] AND (T1."YEAR" = 2003 AND T1."MONTH_NAME" = 'December' AND T3."STATE_NAME" = 'California' AND T3."CITY_NAME" = 'Milpitas' AND T6."FAMILY_NAME" = 'Colas')GROUP BY [1] T1."MONTH_NUMBER", T1."YEAR", T1."MONTH_NAME", 'Qtr ' CONCAT (cast(T1."QUARTER_NUMBER" as char(1))), T3."CITY_NAME", T3."STATE_NAME", T4."PRODUCTID", T5."LINE_NAME"
1] 来自查询访问的多维数据集模型切片的属性。这些属性出现在 SELECT 子句和 GROUP BY 子句中。 [2] 查询中使用的度量。它们出现在 SELECT 子句中。 [3]FROM 子句由来自维、事实和多维数据集模型的联结对象的表组成。 [4] 来自维、事实和多维数据集模型的联结对象用来形成 WHERE 子句的联结谓词。 [5]WHERE 子句还包含用来产生结果子集的任何谓词。 描述多维数据集模型上的查询 以下步骤创建多维数据集模型查询的描述: - 判断查询的度量集。
示例: - SALES(SALESFACT), Total Expense
- 判断查询的切片。对于多维数据集模型中的每个 Dimension,从这个 Dimension 选择一个 Hierarchy。再从这个 Hierarchy 选择一个 Level,这将决定对这个 Dimension 进行查询的细节级。除了从 Hierarchy 选择 Level 之外,还可以为这个 Dimension 选择 All Level。这意味着这个 Dimension 的所有值在这个查询中都聚合在一起。
表 1. 查询中使用的维、层次结构和级维层次结构级TimeTimeMonthMarketMarketCityProductProductProduct
- 用户还可以使用谓词进一步减少返回的数据量。例如,可能只对 12 月的或加州的销售数据感兴趣。谓词可以应用于多维数据集模型中维的任何属性。
示例: - YEAR = 2003
- MONTH_NAME = 'December'
- STATE_NAME = 'California'
- CITY_NAME = 'Milpitas'
- FAMILY_NAME = 'Colas'
成 SQL 的中间步骤 下面几步研究事实和维对象,以便: - 判断在查询中使用哪些来自事实和维对象的属性。在这一步中选择的属性(以及度量的列表)用来创建 SQL 语句中使用的所有 SQL 表达式。
- 判断事实和维对象使用哪些表。
- 将属性和度量转换为 SQL 表达式,这些表达式用来构造对多维数据集模型进行查询的 SQL 语句。
判断在查询中使用的维属性 对于查询中的每个(维、层次结构、级)集,判断使用哪些维属性。正在分析的当前维、层次结构和级称为维 Di、层次结构 Hi 和级 Li。 - 选择 Di 的某些属性作为 SQL 语句中的列。SQL 语句中至少需要有 Li 的级键属性。SQL 语句将按照 Li 的级键进行选择和分组,从而确保查询采用 Di 的正确细节级。
Li 的默认属性或相关属性可以可选地添加到查询中,从而提供可能对用户有用的其他细节和信息。
另外,来自 Li 的任何父级的级键、默认属性或相关属性也可以添加到查询中。Hi 将列出 Li 的父级。
如果为 Di 选择了 “All Level”,那么不应该选择 Di 的任何属性作为选择语句中的列。
示例: - 对于 time 维:
month 级的级键属性(必需): 添加到查询中的其他属性:
- 对于 market 维:
city 级的级键属性(必需): 没有添加到查询中的其他属性
- 对于 product 维:
product 级的级键属性(必需): 添加到查询中的其他属性:
- 如果 Di 包含任何联结引用,那么要查看每个联结对象,记录这些联结左右两边的所有属性。需要从这些属性创建 SQL 表达式,从而形成 SQL 语句的联结谓词。
例: - 对于 time 维:
- time 不包含任何联结引用,所以在这一步中没有识别出属性。
- 对于 market 维:
- STORE-LOCATION 联结有以下属性:
- POSTALCODEID (STORE)
- POSTALCODEID (LOCATION)
- 对于 product 维:
- PRODUCT-LINE 联结有以下属性:
- LINEID (PRODUCT)
- LINEID (LINE)
- PRODUCT-FAMILY 联结有以下属性:
- FAMILYID (LINE)
- FAMILYID (FAMILY)
- 用来将 Di 联结到事实对象的联结对象会引用 Di 的一个或多个属性。要想找到引用的属性,首先要找到 Di 的事实-维联结。这个联结可以在多维数据集模型中找到。多维数据集模型包含一组 (dimension, join) 引用。在这组 (dimension, join) 引用中找到与 Di 对应的联结。
联结对象具有左属性和右属性,对这两个属性进行比较,从而形成联结谓词。一边的属性来自 Di,另一边的属性来自事实对象。要想了解 Di 在联结的哪一边,可以查看联结左右的属性,看哪一边包含 Di 的属性。这一边上的属性需要转换为 SQL 表达式,从而形成 SQL 语句的联结谓词。对联结的另一边上属性的处理将在后面讨论事实对象所需的步骤时讨论。
示例: - time 维使用 SALESFACT-TIME 联结联结到 sales 事实:
表 2. SALESFACT-TIME 联结左属性右属性操作符TIMEID (SALESFACT)TIMEID (TIME)= 因为属性 TIMEID (TIME) 属于 time 维,所以在联结的右边使用这个属性: - market 维使用 SALESFACT-STORE 联结联结到 sales 事实:
表 3. SALESFACT-STORE 联结左属性右属性操作符STOREID (SALESFACT)STOREID (STORE)= 因为属性 STOREID (STORE) 属于 store 维,所以在联结的右边使用这个属性: - product 维使用 SALESFACT-PRODUCT 联结联结到 sales 事实:
表 4. SALESFACT-PRODUCT 联结左属性右属性操作符PRODUCTID (SALESFACT)PRODUCTID (PRODUCT)= 因为属性 PRODUCTID (PRODUCT) 属于 product 维,所以在联结的右边使用这个属性:
- 如果 Di 的任何属性上有任何谓词,那么这些属性也需要转换为 SQL 表达式。
例: - 对于 time 维:
- 对于 market 维:
- 对于 product 维:
寻找每一维中使用的表 要寻找前一步中识别出的 Di 属性使用的所有表,可以检查属性对象中的列/属性引用列表。如果引用指向一个表列,那么将这个表添加到 Di 使用的表集中。如果引用指向另一个属性,那么再检查那个属性的列/属性引用列表,从而寻找 Di 使用的任何新表。判断出这一维使用的表集之后,需要为每个表分配一个惟一的关联名。如果其他维也使用同一个表,那么关联名可以区分查询中不同维使用的同一表的各个实例。 示例: 对于 time 维: 查询中使用的属性: - MONTH_NUMBER
- YEAR
- MONTH_NAME
- QUARTER_NAME
- TIMEID (TIME)
属性引用的表: 对于 market 维: 查询中使用的属性: - CITY_NAME
- STATE_NAME
- POSTALCODEID (STORE)
- POSTALCODEID (LOCATION)
- STOREID (STORE)
性引用的表:- CVSAMPLE.STORE (关联名 T2)
- CVSAMPLE.LOCATION (关联名 T3)
对于 product 维: 查询中使用的属性: - PRODUCTID (PRODUCT)
- LINE_NAME
- LINEID (PRODUCT)
- LINEID (LINE)
- FAMILYID (LINE)
- FAMILYID (FAMILY)
- FAMILY_NAME
属性引用的表: - CVSAMPLE.PRODUCT (关联名 T4)
- CVSAMPLE.LINE (关联名 T5)
- CVSAMPLE.FAMILY (关联名 T6)
将维属性转换为 SQL 表达式 将上面识别出的每个 Di 属性转换为 SQL 表达式。表 5 给出一个示例,将 time 维的 QUARTER_NAME 属性转换为 SQL 表达式: 表 5. QUARTER_NAME 属性SQL 表达式模板列/属性引用列表'Qtr ' CONCAT (cast({$$1} as char(1)))列:CVSAMPLE.TIME.QUARTER_NUMBER 先从属性的 SQL 表达式模板开始。这看起来像 SQL 表达式,但是其中有 ‘{$$n}’ 标志,列或属性应该作为表达式放在这些地方,从而完成 SQL 表达式。对于 ‘{$$n}’ 标志,n 是一个序数,对应于属性的列/属性列表中的第 n 个列/属性。所以对于 QUARTER_NAME,‘{$$1}’ 表示列表中的第一个列/属性引用,即 CVSAMPLE.TIME 表中的 QUARTER_NUMBER 列。 如果 ‘{$$n}’ 标志表示列/属性列表中的列引用,那么将 SQL 表达式模板中的 ‘{$$n}’ 替换为列名。通过在列名前面加上关联名,对它进行完全限定。对于示例中的 QUARTER_NAME,应该将 SQL 表达式模板中的 {$$1} 替换为 CVSAMPLE.TIME 表中的 QUARTER_NAME 列。CVSAMPLE.TIME 表的关联名是 T1,所以对于 QUARTER_NAME 产生的 SQL 表达式是:
'Qtr ' CONCAT (cast(T1."QUARTER_NUMBER" as char(1))) 注意: 因为 Cube Views 元数据在引用 DB2 表和列时使用定界约定,所以需要将表名和列名放在双引号中。
果 ‘{$$n}’ 标志表示列/属性列表中的属性引用,那么将 SQL 表达式模板中的 ‘{$$n}’ 替换为这个属性的 SQL 表达式。表 6. time 维属性的 SQL 表达式属性产生的 SQL 表达式MONTH_NUMBERT1."MONTH_NUMBER"YEART1."YEAR"MONTH_NAMET1."MONTH_NAME"QUARTER_NAME'Qtr ' CONCAT (cast(T1."QUARTER_NUMBER" as char(1)))TIMEID (TIME)T1."TIMEID" 表 7. market 维属性的 SQL 表达式属性产生的 SQL 表达式CITY_NAMET3."CITY_NAME"STATE_NAMET3."STATE_NAME"POSTALCODEID (STORE)T2."POSTALCODEID"POSTALCODEID (LOCATION)T3."POSTALCODEID"STOREID (STORE)T2."STOREID" 表 8. product 维属性的 SQL 表达式属性产生的 SQL 表达式PRODUCTID (PRODUCT)T4."PRODUCTID"LINE_NAMET5."LINE_NAME"LINEID (PRODUCT)T4."LINEID"LINEID (LINE)T5."LINEID"FAMILYID (LINE)T5."FAMILYID"FAMILYID (FAMILY)T6."FAMILYID"FAMILY_NAMET6."FAMILY_NAME"
判断查询中使用的事实对象属性 需要按照与维对象相似的方式处理事实对象。首先,寻找将出现在查询中的事实对象属性。 - 如果事实对象包含任何联结引用,那么要查看每个联结对象,记录这些联结左右两边的所有属性。需要从这些属性创建 SQL 表达式,从而形成 SQL 语句的联结谓词。
- 用来将查询的维联结到事实对象的联结对象会引用事实对象的一个或多个属性。在前面,已经检查了这些事实-维联结中属于维对象的属性。一边的属性来自维,另一边的属性来自事实对象。对于每个联结,查明联结的哪一边包含事实对象属性。这一边上的属性需要转换为 SQL 表达式,从而形成 SQL 语句的联结谓词。
- 如果事实对象的任何属性上有任何谓词,那么这
[1] [2] 下一页
 |
频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。
| 原始作者:佚名 |
录入时间:2007-1-10 5:05:47 |
| 信息来源:不详 |
投稿信箱:itqoo@126.com |
|
|
 |
|