Mondrian系列(五)-深入维度、层次和级别(6)-功能依赖优化

news/2024/7/10 4:23:05 标签: 优化, hierarchy, c, 数据库, sql, mysql
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

在一些情况中࿰c;可以通过采用已知的功能依赖优势来在数据处理过程中class="tags" href="/tags/YouHua.html" title=优化>优化性能。这种依赖是典型的与产生数据相关的业务规则之结果࿰c;通常不能通过数据本身而推断。

在Mondrian中࿰c;功能依赖(Functional dependency)使用 元素的 属性以及 元素的 属性声明。

property成员的dependsOnLevelValue属性用于指明该成员属性的值功能上依赖哪个成员属性的Level值。换句话说࿰c;对一个给定的leve值࿰c;属性值是稳定的。

Hierarchy中的uniqueKeyLevelName属性用于指出给定的level(如果存在)采用所有在层次活动中更高level作为唯一替代key࿰c;确保对于那些level值的联合是唯一的。

要解释这些内容࿰c;看下面的例子:

cellspacing="0" cellpadding="2" width="788">

    color="#ff0000">uniqueKeyLevelName=”color="#0000ff">Vehicle Identification Namber>
   

   
   
        color="#ff0000">dependsOnLevelValue=”true”/>
        color="#ff0000">dependsOnLevelValue=”true”/>
    Vehicle Identification Number” column=”vehicle_id” type=”Numeric”/>
        color="#ff0000">dependsOnLevelValue=”true” />
        color="#ff0000">dependsOnLevelValue=”true” />
   
        color="#ff0000">dependsOnLevelValue=”true” />
   
   

在上面的例子中࿰c;我们知道一个给定的制造厂仅存在于一个单独的城市和省࿰c;一个给定的汽车只有一种颜色方案和一种内饰程度࿰c;并且许可证号码与每个单独的省关联。因此࿰c;我们可以说所有这些成员属性功能依赖相关的leve值。

另外࿰c;我们知道车辆识别号码唯一标识每辆车࿰c;每辆车只有一个许可证。因而࿰c;我们得知Make,Model,Manufacturing Plant的联合࿰c;以及Vechicle Identification Number唯一识别每辆车࿰c;license number是冗余的。

这些属性保证Mondrian生成的SQL语句中GROUP BY 能被class="tags" href="/tags/YouHua.html" title=优化>优化。如果缺少任何功能依赖信息࿰c;典型的查询看起来会像下面那样:

cellspacing="0" cellpadding="2" width="600">
ckquote> <code>

SELECT

`automotive_dim`.`make_id` AS c0,

`automotive_dim`.`model_id` AS c1,

`automotive_dim`.`plant_id` AS c2,

`automotive_dim`.`plant_state_id` AS c3,

`automotive_dim`.`plant_city_id` AS c4,

`automotive_dim`.`vehicle_id` AS c5,

`automotive_dim`.`color_id` AS c6,

`automotive_dim`.`trim_id` AS c7,

`automotive_dim`.`license_id` AS c8,

`automotive_dim`.`license_state_id` AS c9

FROM

`automotive_dim` AS `automotive_dim`,

GROUP BY

`automotive_dim`.`make_id`,

`automotive_dim`.`model_id`,

`automotive_dim`.`plant_id`,

`automotive_dim`.`plant_state_id`,

`automotive_dim`.`plant_city_id`,

`automotive_dim`.`vehicle_id`,

`automotive_dim`.`color_id`,

`automotive_dim`.`trim_id`,

`automotive_dim`.`license_id`,

`automotive_dim`.`license_state_id`

ORDER BY

`...


code>
ckquote>

我们知道当在查询中的所有属性也功能依赖于他们的level时࿰c;GROUP BY语句会被认为是冗余的࿰c;并且会完全去掉࿰c;以减少在一些数据库上的性能开销。在上面的例子中࿰c;如果给出了功能依赖上面的SQL语句会变成:

cellspacing="0" cellpadding="2" width="600">

<code>code>

SELECT

`automotive_dim`.`make_id` AS c0,

`automotive_dim`.`model_id` AS c1,

`automotive_dim`.`plant_id` AS c2,

`automotive_dim`.`plant_state_id` AS c3,

`automotive_dim`.`plant_city_id` AS c4,

`automotive_dim`.`vehicle_id` AS c5,

`automotive_dim`.`color_id` AS c6,

`automotive_dim`.`trim_id` AS c7,

`automotive_dim`.`license_id` AS c8,

`automotive_dim`.`license_state_id` AS c9

FROM

`automotive_dim` AS `automotive_dim`,

ORDER BY

`...

如果查询不够深入到包含unique key的程度࿰c;或者有一些成员属性没有功能依赖于他们的level࿰c;一些数据库(尤其是MYSQL)允许在select中的列不全部出现在GROUP BY 语句中。在这样的一些数据库上࿰c;Mondrian能将功能依赖的属性移出GROUP BY语句࿰c;着眼工会减少SQL查询的处理时间。

cellspacing="0" cellpadding="2" width="600">

<code>code>

SELECT

`automotive_dim`.`make_id` AS c0,

`automotive_dim`.`model_id` AS c1,

`automotive_dim`.`plant_id` AS c2,

`automotive_dim`.`plant_state_id` AS c3,

`automotive_dim`.`plant_city_id` AS c4,

`automotive_dim`.`vehicle_id` AS c5,

`automotive_dim`.`color_id` AS c6,

`automotive_dim`.`trim_id` AS c7,

`automotive_dim`.`license_id` AS c8,

`automotive_dim`.`license_state_id` AS c9

FROM

`automotive_dim` AS `automotive_dim`,

GROUP BY

`automotive_dim`.`make_id`,

`automotive_dim`.`model_id`,

`automotive_dim`.`plant_id`,

`automotive_dim`.`vehicle_id`,

`automotive_dim`.`license_id`,

ORDER BY

`...

注意࿰c;在Mondrian4.0时可能会有所改变。
cle>

http://www.niftyadmin.cn/n/1140201.html

相关文章

【调整数组顺序使奇数位于偶数前面】C++

[编程题]调整数组顺序使奇数位于偶数前面 时间限制&#xff1a;1秒 空间限制&#xff1a;32768K 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有的奇数位于数组的前半部分&#xff0c;所有的偶数位于位于数组的后半部分&#xff0c;并…

Mondrian系列(五)-深入维度、层次和级别(7)-表提示

Mondrian支持有限的一系列元素中的数据库相关提示&#xff0c;提示如下&#xff1a; DatabaseHint TypePermitted ValuesDescriptionMySQLforce_index在这个表的索引的名字强制使用索引的名字 my_index

如何访问私有函数

如何访问私有函数 类对象不可以访问对象中的私有成员&#xff0c;只能通过成员函数来访问。 如果类成员想访问私有成员&#xff0c;可以通过将成员函数升为友元函数来进行访问&#xff0c;也可以通过对访问对象的类型进行转化。 一&#xff0c; 通过升级成员函数 class Base {…

继承基类成员访问方式的变化

1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是 被继承到了派生类对象中&#xff0c;但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。 2. 基类private成员在派生类中是不能被访问&#xff0c;如果基类成员…

【字符集合】两种方法

题目描述 输入一个字符串&#xff0c;求出该字符串包含的字符集合 输入描述: 每组数据输入一个字符串&#xff0c;字符串最大长度为100&#xff0c;且只包含字母&#xff0c;不可能为空串&#xff0c;区分大小写。 输出描述: 每组数据一行&#xff0c;按字符串原有的字符顺序&…

【两种排序方法】C++

考拉有n个字符串字符串&#xff0c;任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法&#xff1a; 1.根据字符串的字典序排序。例如&#xff1a;** “car” < “carriage” < “cats” < "doggies < “koala” 2.根据字符串的长度排序。…

【华为OJ】棋盘格子数

【题目描述】请编写一个函数&#xff08;允许增加子函数&#xff09;&#xff0c;计算n x m的棋盘格子&#xff08;n为横向的格子数&#xff0c;m为竖向的格子数&#xff09;沿着各自边缘线从左上角走到右下角&#xff0c;总共有多少种走法&#xff0c;要求不能走回头路&#x…