北京亿信华辰软件有限责任公司论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 652|回复: 3

关于分析表计算日志的疑问

[复制链接]

30

主题

58

帖子

170

积分

版主

Rank: 7Rank: 7Rank: 7

积分
170
发表于 2015-9-15 16:20:58 | 显示全部楼层 |阅读模式
查询一张分析表的日志,发现sql耗时683毫秒,在数据库执行该sql大概是0.7
秒,但是页面计算时间很长,显示20
s
请问除了sql执行的时间以外,还有什么会影响页面计算速度?

2014-08-28 15:28:41 开始计算报表:QYJDZHCX 区域建档综合查询(内存情况:
FREE=351.8M TOTAL=1002.1M MAX=1002.1M
2014-08-28 15:28:51 执行
SQL:
select max(dateid) from F_JCWS_JDSL where orgcode in(select orgcode from
v_dim_org_jc where innercode like '1001%') and dateid <=20140827
2014-08-28 15:29:01 生成SQL耗时2毫秒

2014-08-28 15:29:01 执行
SQL:
select * from ( select row$_.*, rownum rownum$_ from ( select sum(a.JKDAS)
as B2,sum(a.GXYDAS) as C2,sum(a.TNBDAS) as D2,sum(a.JSBDAS) as E2, SUBSTR(b.
INNERCODE,1,8) as A2
from MV_JCWS_QYJD_N a
left join V_DIM_ORG_JC b
on (a.ORGCODE=b.ORGCODE)
where (((b.INNERCODE LIKE '1001%') AND (a.DATEID = '20140827')) AND (2>1 AND
2>1 AND 2>1 AND 2>1))
group by SUBSTR(b.INNERCODE,1,8)
order by SUBSTR(b.INNERCODE,1,8) nulls first ) row$_ ) where rownum$_ <=
1000
2014-08-28 15:29:01 SQL执行完毕,查询出3条数据,耗时:683毫秒;其中生成SQL

2毫秒;分步临时表耗时:0毫秒;执行查询sql耗时:680毫秒;
2014-08-28 15:29:01 执行查询耗时20217毫秒。(内存情况:
FREE=318.1M
TOTAL=1002.1M MAX=1002.1M

2014-08-28 15:29:01 构造结果表耗时10毫秒。

2014-08-28 15:29:01 计算“QYJDZHCX 区域建档综合查询耗时20228毫秒。(内存

情况:FREE=317.9M TOTAL=1002.1M MAX=1002.1M
回复

使用道具 举报

30

主题

58

帖子

170

积分

版主

Rank: 7Rank: 7Rank: 7

积分
170
 楼主| 发表于 2015-9-15 16:21:18 | 显示全部楼层
从开始计算到完成计算,耗时步骤分为:
1.报表编译
2.分析对象的生成
3.计算结果的收集
(1)SQL语句的生成
(2)SQL的执行
(3)执行结果的处理(将SQL查询结果存入内存记录对象)
(4)结果表的构造
4.内存计算
目前该日志信息基本只记录了第3部分,之前和之后的时间没详细记录(这部分用时大部分用户都不关心,所以没记录)。
回复 支持 反对

使用道具 举报

30

主题

58

帖子

170

积分

版主

Rank: 7Rank: 7Rank: 7

积分
170
 楼主| 发表于 2015-9-15 16:21:44 | 显示全部楼层
分析对象生成具体做了哪些工作?哪些情况下会进行内存计算?
回复 支持 反对

使用道具 举报

30

主题

58

帖子

170

积分

版主

Rank: 7Rank: 7Rank: 7

积分
170
 楼主| 发表于 2015-9-15 16:22:05 | 显示全部楼层
(1)通常地,如果公式表元引用了主题表字段或者表元设置为了“指标”,则认为此表元的计算主要通过数据库计算,即通常SQL查询得到。
(2)如果一个表元的公式没有引用任何主题表字段,可以认为该表元主要参与内存计算,即通过分析表达式计算得到表元的值,不是通过数据库查询直接得到值。
(3)还有一部分公式,在这两者完成后,构造结果表时才能计算,比如求行号的公式ROW(),求结果表表元自身高度的表达式等。
(4)生成分析对象做的事情是:就是根据表元属性和报表属性,以及表达式类型,排序、分组和关联关系等设置等生成内存对象,每个内存对象对应一个SQL(一个大的SQL,即一个复合Olap或者一个简单的Olap)的计算。
(5)计算耗时不光是执行一个SQL,前期要分析准备,后期要计算并构造结果以便显示,sql计算只是其中的一环节,大部分用户只关心执行了哪些sql,其他部分大部分情形下大部分用户都不用太关心。
(6)总的计算时间是上面各部分用时之和,中间还有各种情形下计算时需要临时查表的情况,比如获取关联维的数据(如需要维补足时)等。
(7)应用服务器和数据库服务器性能和负荷,都会影响总耗时。
(8)如果每次计算都如此,700ms与20s,差别如此大,并且表样简单(行列数较少、没有大量复杂公式),要考虑是否有中间临时查表慢的情况,而可能这个临时查的表没有建立索引或者建立的索引有问题。怀疑是此类问题的话,可以在服务器压力较小时,开启后台控制台(需要在试验完成后关闭),看下是不是有执行某条SQL慢(还需要打开数据库连接设置中的调试模式)的情形。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Comsenz Inc. 北京亿信华辰软件有限责任公司

GMT+8, 2017-1-19 23:06 , Processed in 0.080579 second(s), 19 queries .

快速回复 返回顶部 返回列表