完整word版ESSBASE的使用及优化.docx
- 文档编号:23848107
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:37
- 大小:764.81KB
完整word版ESSBASE的使用及优化.docx
《完整word版ESSBASE的使用及优化.docx》由会员分享,可在线阅读,更多相关《完整word版ESSBASE的使用及优化.docx(37页珍藏版)》请在冰豆网上搜索。
完整word版ESSBASE的使用及优化
ESSBASE的使用及性能优化
计算脚本相关
Essbase中,一个指标可以通过计算公式调用自己得到,用@SHIFT函数实现.
如:
BC
---—-—-
B1C1
B2C2
B3C3
…
其中,C2=C1+B2;C3=C2+B3…
那么,指标C就可用公式:
@SHIFT(C,-1)+B来实现.
数据加载不进的问题,某个维存在空值的情况,或事实表数据没有清洗干净,报错如下:
不选时间维的计算公式:
IF(@ISGEN(”sj",1))
#MISSING;
ELSE
qmqsye—bqxzqs;
ENDIF;
ESSBASE求百分比指标:
number%number—>Year—〉Market—>Product—>Scenario;
求同期值公式:
IF(@ISGEN("D_Date”,6))
(@MDSHIFT(set01,-36,"D_Date”,@GENMBRS(”D_Date",6)));
ELSEIF(@ISGEN("D_Date”,5))
(@MDSHIFT(set01,—12,”D_Date”,@GENMBRS("D_Date”,5)));
ELSEIF(@ISGEN("D_Date”,4))
(@MDSHIFT(set01,—4,”D_Date”,@GENMBRS(”D_Date",4)));
ELSEIF(@ISGEN(”D_Date",3))
(@MDSHIFT(set01,-2,”D_Date",@GENMBRS("D_Date",3)));
ELSEIF(@ISGEN(”D_Date",2))
(@MDSHIFT(set01,—1,"D_Date",@GENMBRS("D_Date",2)));
ENDIF;
求前期值公式:
IF(@ISGEN(”D_Date”,7))
@MDSHIFT(set01,-1,"D_Date”,@GENMBRS(”D_Date”,7));
ELSEIF(@ISGEN("D_Date",6))
@MDSHIFT(set01,—1,”D_Date",@GENMBRS("D_Date”,6));
ELSEIF(@ISGEN("D_Date",5))
@MDSHIFT(set01,—1,"D_Date”,@GENMBRS(”D_Date",5));
ELSEIF(@ISGEN("D_Date”,4))
@MDSHIFT(set01,-1,”D_Date”,@GENMBRS("D_Date",4));
ELSEIF(@ISGEN("D_Date",3))
@MDSHIFT(set01,-1,”D_Date",@GENMBRS("D_Date",3));
ELSEIF(@ISGEN("D_Date",2))
@MDSHIFT(set01,-1,"D_Date”,@GENMBRS("D_Date”,2));
ENDIF;
国税求同期值公式:
IF(@ISGEN("时间",5))"去年同期欠缴税额"=@PRIOR("本期欠缴税额”,365,@genmbrs(”时间",5));
ELSEIF(@ISGEN("时间",4))”去年同期欠缴税额”=@PRIOR("本期欠缴税额",12,@genmbrs(”时间”,4));
ELSEIF(@ISGEN(”时间”,3))"去年同期欠缴税额"=@PRIOR("本期欠缴税额",4,@genmbrs(”时间",3));
ELSEIF(@ISGEN("时间",2))"去年同期欠缴税额”=@PRIOR("本期欠缴税额”,1,@genmbrs("时间",2));
ENDIF;
国税求前期值公式:
IF(@ISGEN("时间”,5))"上期欠缴税额”=@PRIOR(”本期欠缴税额”,1,@genmbrs("时间",5));
ELSEIF(@ISGEN("时间",4))”上期欠缴税额"=@PRIOR(”本期欠缴税额",1,@genmbrs("时间",4));
ELSEIF(@ISGEN("时间",3))"上期欠缴税额"=@PRIOR(”本期欠缴税额",1,@genmbrs(”时间",3));
ELSEIF(@ISGEN(”时间",2))”上期欠缴税额"=@PRIOR(”本期欠缴税额",1,@genmbrs(”时间",2));
ENDIF;
Unix下后台启动和停止Essbase服务
启动命令:
nohupESSBASEpassword—b&
停止方法:
手动:
交互式,在esscmd中用shutdownserver命令,根据系统提示完成。
脚本:
echo"loginessadminpasswordonlocalhost;altersystemshutdown;exit;"|essmsh–i
HP-UX下配置Essbase连本机Oracle8i的ODBC
配置环境
HP-UX
IBMDB2OlapSever7.1
Oracle817
配置.profile
将Oracle的。
profile文件环境变量内容copy到essadmin的。
profile文件.
[注]:
根据实际情况修改至。
profile文件正确,不要引起两个。
profile文件间内容的冲突。
例如:
exportARBORPATH=/essbase
exportSHLIB_PATH=$SHLIB_PATH:
$ARBORPATH/bin:
$ARBORPATH/dlls
exportPATH=$PATH:
$ARBORPATH/bin:
$ARBORPATH/dlls
exportODBCINI=/essbase/。
odbc.ini
PATH=$ORACLE_HOME/bin:
$PATH;exportPATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib64;exportLD_LIBRARY_PATH
ORACLE_BASE=/oracle;exportORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/ora817;exportORACLE_HOME
NLS_LANG=”AMERICAN_AMERICA。
ZHS16CGB231280"
ORA_TERM=hp;exportORA_TERM
ORACLE_SID=DW;exportORACLE_SID
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data;exportORA_NLS33
SHLIB_PATH=$ORACLE_HOME/lib:
/usr/lib:
$SHLIB_PATH;exportSHLIB_PATH
TMPDIR=/oracle/tmp
umask022
配置关于oracle的odbc
得到.odbc.ini文件模板
运行$ARBORPATH下的inst-sql。
sh,将在$ARBORPATH下生成.odbc.ini文件。
配置。
odbc.ini
vi。
odbc.ini,编辑得到类似如下内容:
[ODBCDataSources]
dw=INTERSOLV3.11Oracle8Driver
[dw]
Driver=/essbase/dlls/ARor815.sl
Description=Oracle8
ServerName=dw
[ODBC]
Trace=0
TraceFile=odbctrace。
out
TraceDll=/essbase/dlls/odbctrac。
sl
InstallDir=/essbase/dlls
[注]:
默认的Driver为ARor813.sl,对于oracle817数据库,Driver应改为ARor815。
sl.
测试
用Essbase的终端(ApplicationManager)测试odbc是否配通。
小结
配置HPUX下Essbase连本机Oracle的ODBC,比较简单,不用像Informix安装Client端,直接使用Essbase自带的driver。
只需修改。
profile和。
odbc.ini文件。
AIX下配置Essbase到本机DB2的ODBC过程
整个过程分为两个步骤:
配置ODBC:
以下是万佳BI项目EssbaseforAIX的ODBC的配置过程:
在万佳BI项目中,配置从DB2到Essbase的ODBC过程如下:
3.以admin登录(如果Essbase的user为admin),编辑admin用户的.profile文件,加入如下部分:
。
/db2system/db2inst1/sqllib/db2profile(与DB2的安装路径有关)
exportARBORPATH=/essbase(essbase的安装路径)
exportLIBPATH=$LIBPATH:
$ARBORPATH/bin:
$ARBORPATH/dlls
exportPATH=$PATH:
$ARBORPATH/bin:
$ARBORPATH/dlls
#exportODBCINI=/home/admin/。
odbc。
ini
(以上部分的第一句最重要,最后一句可以不要)
4。
logout并再次login用户admin,运行/essbase/inst—sql。
sh;
提问:
intersolvorIBM—DB2?
选择:
DB2
5。
编辑admin用户下(/home/admin/)的。
odbc。
ini文件,确保有如下部分:
例:
[ODBCDataSources]
DWCN=IBMDB2ODBCDriver
[DWCN]
Driver=/db2system/db2inst1/sqllib/lib/db2。
o(与DB2的安装路径有关)
Description=DB2
Host=aixf85(主机名)
Database=dwcn(数据库名)
#Username=db2inst1(用户名,可不输入)
#Password=(此外即使输入口令也无用)
6。
在命令行下运行:
su-admin
ESSBASEpassword
7。
在NT客户端打开Applicationmanager,在任意一个正常的Database上建立一个新的rule,并用此rule的opensql去测试以上对ODBC配置的正确性.
CatalogDB:
上面的过程完成之后,如果直接使用,对于数据量小的loaddata过程偶而可以正确完成,但对于大数据量的loaddata过程不能正确完成,系统提示网络方面的错误(如图所示)。
我认为,出现这个问题是因为同一台主机上共存DB2和Essbase,在.odbc.ini中指定的数据源是直接到本机数据库中找到的,而不是通过网络。
这种通讯方式是Essbase不能接受的。
试想如果DB2和Essbase分别装在不同的机上,在Essbase这台机上最终势必要配置连到目标DB的ODBC(也就是配置。
odbc.ini文件),该ODBC中的数据源指定的DB就一定要通过网络了,也就是说这个目标DB是Essbase这台机器认识的(一般是安装了该种DB产品的客户端),这就要首先建立连到目标DB的ODBC。
因此,如果DB2和Essbase在同一机上的时候,就少了这一个过程。
因此,还必须做如下方面的工作:
1。
db2catalogtcpipnodevgsznode(新的节点名)remote168.1.6。
152(IP地址)server50000(端口号);
2。
db2catalogdbdwcnasszdc(dwcn的别名)atnodevgsznode;
3.编辑Essbase用户下的.odbc.ini文件,将数据源的名字指定为szdc。
通过如上操作,就相当于通过网络建立了一个连到DB2的ODBC。
这样,以后在Essbase中openSQL的时候就要选szdc了。
Essbase的一些初级问题
Q:
资料说blocksize的大小最好在8k~64k,但是实际上做出来的模型的blocksize往往只有几百或几十,有没有很大影响?
A:
在不影响稳定的情况下,应尽量将其调大。
Q:
blockdensity和blocknumber之间有什么关系?
blockdensity自然越大越好,但是往往它越大,blocknumber就越多,如何平衡?
A:
一定要多做测试,测database的工作性能、测稳定性.尽量将density调大,这样才能保证模型的稳定性.毕竟稳定压倒一切。
Q:
在DataWareHouse中,如果串行地对多个database进行操作,例如加载数据,计算等,经常会出现错误,错误原因是无法分配内存;但是手工将每个database分开操作,过程和自动化过程完全一样,又没有错误.是不是essbase内存分配的问题?
如何解决?
A:
我认为这是Essbase自身对内存管理的问题.因此,在流程设计中应该避开这些问题。
方法就是操作完一个database之后,就去unload它,再操作下一个。
Q:
在加载数据或者计算时,如果想将它停下来,有什么办法?
A:
加载的过程是没办法停下来的,强行停止会损坏模型;但计算时可以停下来,方法就是在后台窗口中按下ESC键。
Q:
在模型计算中会出现类似的错误:
Invalidblockheader:
Block’snumbersdonotmatch,然后模型就无法加载或计算了,必须重建database,这是什么原因?
A:
像在问题2中所说的那样,一般都是因为density太低,导致出现这个问题。
Q:
计算正确完成后,出现loaddb过长的原因?
A:
我认为原因在于Essbase对内存的管理还不完善。
当一个主题计算完成之后,一些信息还未写入硬盘,第二个主题已经开始了计算.这样,前一个主题的数据遭到破坏,导致这个正常计算完成的database不能正常unloaddb。
这个被破坏的文件是APP中对应database文件夹中的*。
ind文件(*与该database名相同)。
这个文件不同于数据文件中的索引文件,索引文件的文件名为ess00001.ind。
因此,这个文件我们称之为索引之索引。
这是从该文件的基本功能上引申出来的。
下面具体描述一下这个文件的功能。
当一个database计算完成,并对它正常unloaddb后,这个模型才算正常计算成功.此时去load该database不会有任何问题,包括重启服务或是重启计算机。
对执行loaddatabase操作时,系统首先去找*.ind文件,并由它去组织数据。
也就是先通过*。
ind,找到索引,再找到数据。
因此,*.ind被称为索引之索引.如果一个刚刚计算完成的database还没有来得及写这个*。
ind文件,就开始计算下一个模型,由于系统组织内存等原因,导致*。
ind文件写不成功,因此,这个模型虽然在datawarehouse中显示正常计算完成,但实际不然。
当用户不知情的情况下去load该database的时候,由于没有这个索引之索引文件,Essbase将根据现有的索引文件和数据文件重构*。
ind文件。
这个过程所需时间视乎该database的数据量大小而定.如果数据量很小,这个过程将很快,快得用户感觉不到这个过程的存在.如果database存储的数据量非常大,则这个过程将要花费大量时间。
比如我们的模型goodsale,在这种情况下load要2个小时左右。
以前在这个时候,看到CPU在猛烈消耗,真不知它究竟在干些什么,还真为它担心呢.不过话又说回来了,如果系统的性能足够好,模型处理的数据量也小,则不会产生*.ind文件损坏的问题.就目前我们的认识程度来说,大概是这样的吧。
Essbase中Database的备份与恢复的经验
Essbase数据的备份不同于一般的数据库系统。
数据库有成熟的备份机制,可以离线备份、在线备份、增量备份,并且还有回滚(rollback)等等数据保护机制,保证数据的实时性与正确性。
而Essbase的备份机制相比就要差很多,它是一种文件系统,说到备份,其实就是备份相应的数据与系统文件。
对于任何一个database来说,。
otl和。
rul文件是可以不受路径限制进行备份和恢复的。
但用这些文件恢复的database只是恢复了database的结构(outline和rule),没有恢复数据。
有时,我们备份与恢复是希望保留数据的。
带数据Essbase模型的备份与恢复,适用于本机database的备份与恢复,也适用于不同主机间数据的移植(不同主机的Essbase安装路径很可能不同)。
带数据Essbase模型的备份与恢复,分为源与目的database的路径相同与不同两种情况,不论什么情况,备份与恢复的方法一律相同。
我们知道,每个database的索引与数据文件默认是放在APP下该database所在的文件夹下的.如果用户没有改变这个路径,备份与恢复问题就变得非常简单了:
方法一
1.unload你想备份的database;
2.复制该database的文件夹;
3.在目的端重建相同名称的APP以及你要恢复的database,并unloaddb;
4.用你已经复制的database文件夹覆盖新建的database的文件夹;
5.loaddb,成功!
方法二
如果源database指定了数据存放的路径,备份与恢复就相应变得复杂起来,不仅要备份源database文件夹,还要备份相应的索引和数据文件.具体作法如下:
1.unload你想备份的database;
2.复制该database的文件夹;
3.在目的端重建相同名称的APP以及你要恢复的database,并unloaddb;
4.用你已经复制的database文件夹覆盖新建的database的文件夹;
5.复制源database的索引和数据文件夹;
6.在目的机硬盘上(与源database的索引及数据文件所在的盘符相同,如果没有,可以用虚拟盘的方法,用subst命令。
例:
substH:
e:
\H)建立与目的机上该database所在路径相同的路径,并将已复制的源database索引和数据的文件夹粘贴到此处;
7.打开applicationmanager,在该database的菜单database/setting/storage中设置location为源database的盘符;
8.loaddb,成功!
影响模型数据易忽略的两点
未更新视图!
如果某模型的加载视图是一个多层的视图,若只对上层视图进行了改动,而最下层的视图没有重新组织,加载计算后的结果就会出现问题。
因此,总结一下得出结论,如果一个view的数据源的结构发生了变化,就一定要重新建立view。
注意用unionall,而不是union!
主题数据加载的时候,如果数据来源于多个表,一定要注意union语句的写法,否则会造成数据丢失。
关于Essbase的加载、计算的优化
设计,设计,还是设计
1.在outline中选定适当的dense/sparse维及其顺序、设定动态计算
2.组织加载数据
3.设定各种Cache
4.设定CommitBlocks
5.其它调整
6.……
以上简要说明了对于一个Essbase模型来说,如何去优化加载、计算的性能。
重要性按以上的递减顺序排列。
对于一个设计得较差的模型来说,性能调优的意义是不大的,因此,模型的设计是最为关键的。
在outline中,对于dense/sparse维的选择是至关重要的。
一定要根据实际情况、根据经验,做许多测试,最终选择一种最优的设置方案。
这一步比较重要,它对将来模型的稳定性、速度、数据量等等都有直接影响。
在dense/sparse已经确定的情况下,一般要将dense维按照成员数由多到少的顺序放在最上面,而sparse维按照成员数由少到多的顺序放在下面。
另外,如果有属性维,则一定要放在最下面.一定不要忘了对可以设置动态计算的dense维设置动态计算,这样对提高计算性能和减小数据量都很有帮助。
尽量不要对sparse维设置动态计算,因为它会在加载时影响许多blocks。
组织加载数据。
尽量精简加载表的结构或使用加载view。
在数据加载的opensql中的orderby对加载的性能影响非常大。
大家在做的应用的时候可以做些实验。
以我们的模型supstk为例,当时也做了orderby,只不过是按sparse维从小到大的顺序,用时5个小时左右;但重新按sparse维从大到小的顺序orderby后,加载只用时78分钟!
可见这一因素对性能影响之大。
各种cache值的设置,对于模型的性能影响也非常之大。
其中影响最大的莫过于calculatorcache。
对于这个cache的设置附录中有详细说明.当然,这些经验都利益于Essbase提供的两个PDF文档,如果有时间,建议大家多看看,确实很有用。
此外,对于IndexCache、DataCache和DataFileCache也一定要做相应设置!
如果内存很多,模型很大,建议CommitBlocks设置为10000,这是个经验数值.不过我感觉这个参数的设置对性能的影响不是太大.大家可以试试其它值.
下面具体分部分地进行介绍:
Database的设计
最重要是dense,sparse的设置.维设置的不同,可能会大大影响到加载计算的性能。
设置因每个模型的维个数、数据情况而有不同。
原则是使density/blocknumber最大。
如何知道各个维的density和blocknumber?
有一个简易的方法,使用的前提条件是已经知道database的数据源和部分真实数据。
以下是示例:
假定database有两个dense维,三个sparse维
cells1=selectcount(*)fromfact_table
blocksize=dense1*dense2
blocknumber=selectcount(*)as"blocknumber”from(select1fromfact_tablegroupbysparse1,sparse2,sparse3)a
density=cells/(blocknumber*blocksize)
其中,fact_table是已对所有维groupby的最终的事实表,dense1和dense2分别是dense维的成员数(不包括动态计算),
blocknumber*blocksize等于潜在最多的cell,而上述cells1的值等于实际存在的cell数,两者相除就等于加载后计算前的density,而模型计算完成后,一般来说density会有所增大。
知道了各个维的密度后,可以确定维的排列顺序。
应当把dense维放在sparse上面,dense维和sparse又分别从小到大地排列,使整个Otl看来像两个叠加的三角形。
尽可能地让dense维的个数和sparse维的个数持平。
让blocksize保持在1k~100k内。
Database设计是否合理,还可以用加载、计算、查询的速度来衡量,因此,可以先定义好几种结构,用少量测试数据测试。
一般datablocksize越大,计算越快而查询越慢。
设计的好坏对加载计算的快慢有很大影响。
所以,尽量不要让你的维有一个超过1000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word ESSBASE 使用 优化