[saiku] 优化多维度查询效率
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] 优化多维度查询效率的更多相关文章
- 注意使用 BTREE 复合索引各字段的 ASC/DESC 以优化 order by 查询效率
tbl_direct_pos_201506 表有 190 万数据.DDL: CREATE TABLE `tbl_direct_pos_201506` ( `acq_ins_code` char(13) ...
- mysql update join优化update in查询效率
数据库版本:5.6.16 update in 修改数据,结果执行时间过慢,一直不出结果. SQL语句及执行计划如下: UPDATE erp_order_extra SET last_time=1231 ...
- neo4j - 查询效率的几种优化思路
最近在公司实习做的就是优化neo4j图形数据库查询效率的事,公司提供的是一个在Linux上搭建且拥有几亿个节点的数据库.开始一段时间主要是熟悉该数据库的一些基本操作,直到上周才正式开始步入了优化数据库 ...
- 查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题
开发经常遇到分页查询的需求,但是当翻页过多的时候,就会产生深分页,导致查询效率急剧下降. 有没有什么办法,能解决深分页的问题呢? 本文总结了三种优化方案,查询效率直接提升10倍,一起学习一下. 1. ...
- sqlserver 数据查询效率优化
首先优化是具体情况具体分析,从硬件.改进表结构.索引.改进sql查询语句.存储方式都有关系等多方面入手 比如单表数据量(100w-200w条)不大的情况下,查询效率慢 可以从优化sql语句.对多个排序 ...
- 提高SQL查询效率(SQL优化)
要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359 我们要做到不但会写SQL,还要做到 ...
- mysql in 子查询 效率慢 优化(转)
mysql in 子查询 效率慢 优化(转) 现在的CMS系统.博客系统.BBS等都喜欢使用标签tag作交叉链接,因此我也尝鲜用了下.但用了后发现我想查询某个tag的文章列表时速度很慢,达到5秒之久! ...
- mysql处理上百万条的数据库如何优化语句来提高处理查询效率
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- mysql数据库的优化和查询效率的优化
一.数据库的优化 1.优化索引.SQL 语句.分析慢查询: 2.设计表的时候严格根据数据库的设计范式来设计数据库: 3.使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO: ...
随机推荐
- (1)定义一个接口CanFly,描述会飞的方法public void fly(); (2)分别定义类飞机和鸟,实现CanFly接口。 (3)定义一个测试类,测试飞机和鸟,在main方法中创建飞机对象和鸟对象, 再定义一个makeFly()方法,其中让会飞的事物飞。并在main方法中调用该方法, 让飞机和鸟起飞。
package b; public interface CanFly { public void fly(); } package b; public class FeiJi implements C ...
- BZOJ 3601: 一个人的数论
题目链接:www.lydsy.com/JudgeOnline/problem.php?id=3601 题意: 思路: 因此可以用高斯消元得到ai. const int mod=1000000007; ...
- BZOJ 2007 海拔(平面图最小割-最短路)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2007 题意:给出一个n*n的格子,那么顶点显然有(n+1)*(n+1)个.每两个相邻顶点 ...
- BZOJ 1855 股票交易(单调队列优化DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1855 题意:最近lxhgww又迷上了投资股票, 通过一段时间的观察和学习,他总结出了股票 ...
- UVA 10534 三 Wavio Sequence
Wavio Sequence Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Sta ...
- How to: Update an .edmx File when the Database Changes
https://msdn.microsoft.com/en-us/library/cc716697.aspx In the Model Browser, right-click the .edmx f ...
- Messages消息处理
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- CUBRID学习笔记 4 端口和win7下连接数据库cubrid教程
都是官方的文档 ,水平有限, 大家可以看原文. http://www.cubrid.org/wiki_tutorials/entry/connecting-to-a-remote-cubrid-dat ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- POJ 3069 Saruman's Army(萨鲁曼军)
POJ 3069 Saruman's Army(萨鲁曼军) Time Limit: 1000MS Memory Limit: 65536K [Description] [题目描述] Saruman ...