1、优化查询精度

优化原因:当维度过多时,查询很复杂,效率较慢。因此看能否通过优化sql的方式来提高查询效率。

代码跟踪查看(维度多余3时查询条件里面有in,优化不用in关键字)

    public abstract class AbstractQuerySpec implements QuerySpec {
protected Map<String, String> nonDistinctGenerateSql(SqlQuery sqlQuery){
String expr = column.generateExprString(sqlQuery); StarColumnPredicate predicate = getColumnPredicate(i);
final String where = RolapStar.Column.createInExpr(
expr,
predicate,
column.getDatatype(),
sqlQuery);
if (!where.equals("true")) {
sqlQuery.addWhere(where);
}
public class Aggregation {
createSegments{
new Segment(
    star,
    constrainedColumnsBitKey,
    columns,
    measure,
    predicates,//这里 : [true, true, true, F_JCJY_CODE_SSQ.SFDM={230000, 370000}] 当为具体数值不为true时使用了in(230000,370000)
    Collections.<Segment.ExcludedRegion>emptyList(),compoundPredicateList);
private StarColumnPredicate[] initPredicates() {
StarColumnPredicate[] predicates =
new StarColumnPredicate[columns.length];
for (int j = 0; j < columns.length; j++) {
Set<StarColumnPredicate> valueSet = valueSets[j]; StarColumnPredicate predicate;
if (valueSet == null) {
predicate = LiteralStarPredicate.FALSE;
} else {
ValueColumnPredicate[] values =
valueSet.toArray(
new ValueColumnPredicate[valueSet.size()]);
// Sort array to achieve determinism in generated SQL.
Arrays.sort(
values,
ValueColumnConstraintComparator.instance); predicate =
new ListColumnPredicate(
columns[j],
Arrays.asList((StarColumnPredicate[]) values));
} predicates[j] = predicate;
}
return predicates;
}
AggregationManager.loadAggregation(
cacheMgr,
cellRequestCount,
measuresList,
columns,
batchKey,
predicates,
groupingSetsCollector,
segmentFutures);
predicates = aggregation.optimizePredicates(columns, predicates);
public StarColumnPredicate[] optimizePredicates(
RolapStar.Column[] columns,
StarColumnPredicate[] predicates)
{

跟踪到最后,来到下面的代码处

if (MondrianProperties.instance().OptimizePredicates.get() || bloats[j] == 1){
newPredicates[j] = new LiteralStarPredicate(columns[j], true);//设置为ture
}

第一个条件

MondrianProperties.instance().OptimizePredicates.get()

配置mondrian.properties里面的(默认也是true)
mondrian.rolap.aggregates.optimizePredicates=true

第二个条件

bloats[j] == 1

mondrian包里面的Aggregation类的optimizePredicates方法修改如下:

if (valueCount < 2) {
bloats[i] = 1.0;//原来是0.0
continue;
} if (valueCount > maxConstraints) {
bloats[i] = 1.0;
continue;
} 而 maxConstraints 是在 mondrian。properties里面配置的。
默认是:1000,表示如果in里面的值小于1000个时,采用in精细化查询,否则不带in查询语句。这里我们配置为1. mondrian.rolap.maxConstraints=1

总结:需要修改的地方如下:

#Aggregation类
if (valueCount < 2) {
bloats[i] = 1.0;//原来是0.0
continue;
} #mondrian.properties配置文件
mondrian.rolap.maxConstraints=1
mondrian.rolap.aggregates.optimizePredicates=true

注意:后来发现,查询效率慢主要是因为查询出的结果需要经过一系列的矩阵变换计算和递归计算,是作为数据的后处理操作。

如果报出内存溢出,请增大应用内存。

2、缓存结果

查询后将结果缓存,以便第二次查询时提高查询效率

配置mondrian.properties

//开启聚合表功能
mondrian.rolap.aggregates.ChooseByVolume=true
mondrian.rolap.aggregates.Read=true
mondrian.rolap.aggregates.Use=true
//缓存结果集
mondrian.rolap.cellBatchSize=0
mondrian.rolap.star.disableCaching=false
mondrian.expCache.enable=true
mondrian.rolap.EnableRolapCubeMemberCache=true
mondrian.result.highCardChunkSize=50
mondrian.rolap.evaluate.MaxEvalDepth=1

//允许监控内存、显示维度前缀、空值处理
mondrian.util.memoryMonitor.enable=true
mondrian.olap.elements.NeedDimensionPrefix=true
mondrian.olap.NullMemberRepresentation=\u7a7a
//sql处理
mondrian.rolap.generate.formatted.sql=true
mondrian.rolap.maxSqlThreads=1000

3、其他方式

(1)使用聚合表

聚合表是数据仓库中包含事实数据的汇总信息的表

(2)建立物化视图

将查询的结果集先通过建立视图,定时跑批数据到视图中,直接查询视图得到结果,避免了查询时去计算。
简化计算和查询过程。

(3)退化维度

如果一个维度有很多可能,如学校作为维度有很多值。
这时候不再使用学校ID和表关联,而是直接将学校名称写到和他关联的表里面去。
这样就相当于少关联一张表,加快查询的效率。

[saiku] 优化多维度查询效率的更多相关文章

  1. 注意使用 BTREE 复合索引各字段的 ASC/DESC 以优化 order by 查询效率

    tbl_direct_pos_201506 表有 190 万数据.DDL: CREATE TABLE `tbl_direct_pos_201506` ( `acq_ins_code` char(13) ...

  2. mysql update join优化update in查询效率

    数据库版本:5.6.16 update in 修改数据,结果执行时间过慢,一直不出结果. SQL语句及执行计划如下: UPDATE erp_order_extra SET last_time=1231 ...

  3. neo4j - 查询效率的几种优化思路

    最近在公司实习做的就是优化neo4j图形数据库查询效率的事,公司提供的是一个在Linux上搭建且拥有几亿个节点的数据库.开始一段时间主要是熟悉该数据库的一些基本操作,直到上周才正式开始步入了优化数据库 ...

  4. 查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题

    开发经常遇到分页查询的需求,但是当翻页过多的时候,就会产生深分页,导致查询效率急剧下降. 有没有什么办法,能解决深分页的问题呢? 本文总结了三种优化方案,查询效率直接提升10倍,一起学习一下. 1. ...

  5. sqlserver 数据查询效率优化

    首先优化是具体情况具体分析,从硬件.改进表结构.索引.改进sql查询语句.存储方式都有关系等多方面入手 比如单表数据量(100w-200w条)不大的情况下,查询效率慢 可以从优化sql语句.对多个排序 ...

  6. 提高SQL查询效率(SQL优化)

    要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359   我们要做到不但会写SQL,还要做到 ...

  7. mysql in 子查询 效率慢 优化(转)

    mysql in 子查询 效率慢 优化(转) 现在的CMS系统.博客系统.BBS等都喜欢使用标签tag作交叉链接,因此我也尝鲜用了下.但用了后发现我想查询某个tag的文章列表时速度很慢,达到5秒之久! ...

  8. mysql处理上百万条的数据库如何优化语句来提高处理查询效率

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  9. mysql数据库的优化和查询效率的优化

    一.数据库的优化 1.优化索引.SQL 语句.分析慢查询: 2.设计表的时候严格根据数据库的设计范式来设计数据库: 3.使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO: ...

随机推荐

  1. Problem W UVA 662 二十三 Fast Food

    Fast Food Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status P ...

  2. HQL语句大全(转载)

    Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. ...

  3. [JAVA设计模式]第三部分:结构模式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. python strip()函数

    转发:jihite-博客园-python strip()函数 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm)        删除s字符串中开头.结尾处,位于 rm删除序列的 ...

  5. nyoj325 zb的生日(DFS)

    zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...

  6. DOS命令解释程序的编写

    实验一.DOS命令解释程序的编写 专业:物联网工程   姓名:黄淼  学号:201306104145 一. 实验目的 (1)认识DOS: (2)掌握命令解释程序的原理: (3)掌握简单的DOS调用方法 ...

  7. Python不同电脑之间传输文件实现类似scp功能不输密码

    SCP vs SFTP 通过paramiko还可以传输文件,如何通过paramiko在计算机之间传输文件,通过阅读官方文档,发现有如下两种方式: sftp = paramiko.SFTPClient. ...

  8. Android App组件之ListFragment -- 说明和示例

    Android App组件之ListFragment -- 说明和示例 1 ListFragement介绍 ListFragment继承于Fragment.因此它具有Fragment的特性,能够作为a ...

  9. CodeForces 429 B Working out(递推dp)

    题目连接:B. Working out 我想了很久都没有想到怎么递推,看了题解后试着自己写,结果第二组数据就 wa 了,后来才知道自己没有判选择的两条路径是否只是一个交点. 大概思路是:先预处理出每个 ...

  10. js控制只能输入数字

    onkeyup=clearNoNum(this) function clearNoNum(obj) {    obj.value = obj.value.replace(/[^\d.]/g," ...