最近在做一个需求,数据量比较大,遂自己根据查询语句建了几个索引,但是依然发现效果不明显。
让DBA帮忙优化后,指出在查询语句中,关于日期的过滤写法有问题:
T46460.gmv_date = TIMESTAMP '2012-11-01 00:00:00'
应该改成to_date的方式,这样执行起来要快不少。
首先去查了下为什么这种写法就会很慢,我在answer中针对日期列指定了具体的日期,比如2012年11月1日,以生成查询sql,BIEE在生成查询sql的时候,会用timestamp的方式进行转换,但是这样就会跳过该列的索引了,导致相当于进行了全表扫描来着。
另外的一个现象:
在查询提示器里,选择日期,一开始没有时分秒,一旦选择了执行后,查询提示器里会自动的加上了时分秒。
所以解决方案是,如何在生成的查询sql里保证使用的是to_date函数即可。
网上老外的博客里提到了针对timestamp列建立索引的方式来优化查询。
链接如下:http://obiee101.blogspot.com/2009/03/obiee-date-timestamp-and-oracle-indexes.html
遇到类似问题的文章链接:
http://www.rittmanmead.com/2009/03/dates-timestamp-and-oracle-bi-answers-filters/
数据平台的同事的文章:
http://www.alidata.org/archives/107
经过检查,rpd中针对日期维度使用的数据类型为datetime,于是修改成date类型。
这样改好后,的确查询的语句使用了to_date函数,查询性能提升明显。
但是发布后,却引入了新的问题。
发现默认展示没有问题,针对报表进行日期选择查询后,报如下错误:
A date value was expected
经过上网查询资料,说是BIEE的一个bug,patch的说明如下:
http://obiee101.blogspot.com/2010/01/obiee-patches-101341-part-2.html
在网上搜索其他文章,
https://forums.oracle.com/forums/thread.jspa?messageID=10684745
http://blog.csdn.net/mlz_2/article/details/6154805
可以通过修改globalfilterprompt.js文件解决。该文件的路径为:
OracleBI\oc4j_bi\j2ee\home\applications\analytics\analytics\res\b_mozilla\prompts\globalfilterprompt.js
我用firebug进行了debug,该文件的230多行,
var sTimeZoneOffset = tArgs[3];
var nOffset = parseInt(sTimeZoneOffset)
if (nOffset)
{
var tDTP = new DateTimeParser();
for (var i = 0; i < tValues.length; ++i)
{
tValues[i] = saw.tz.parseAndAdjustTimeZoneOffset(tValues[i], nOffset);
}
}
在for循环里面,parseAndAdjustTimeZoneOffset方法返回后,值就变成了日期+时分秒的格式。
该方法是在OracleBI\oc4j_bi\j2ee\home\applications\analytics\analytics\res\b_mozilla\common\datetime.js文件里,873行左右。
saw.tz.parseAndAdjustTimeZoneOffset = function (sDateTime, nTimeZoneOffset)
{
if (sDateTime)
{
if (nTimeZoneOffset)
{
var tDTP = new DateTimeParser();
var tDateTime = tDTP.parse(sDateTime, 1 | 2 | 4 | 8 | 16 | 32);
if (tDateTime)
{
tDateTime.adjustTimeZoneOffset(nTimeZoneOffset);
var sValue = tDateTime.dateString() + ' ' + tDateTime.timeString();
return sValue;
}
}
}
return sDateTime;
}
显式的加上了时分秒,因为上述的文章里没有具体讲到如何去更改,所以我就尝试将
tValues[i] = saw.tz.parseAndAdjustTimeZoneOffset(tValues[i], nOffset);
的调用给干掉。重新测试后,发现问题并未解决。估计js改的不彻底。
后续想到,其实我的本地OBIEE环境并没有遇到这个类似的问题。既然oracle已经打了patch,估计是我们的BIEE版本比线上的BIEE版本要新(事实上也正是如此)。
于是也不纠结js具体如何改了,把线上的js文件和我本地的js文件了进行了对比,发现的确是有差异来着。
于是将本地的js文件替换掉线上的js文件,最终问题解决。
补充下,记得清浏览器的缓存,否则浏览器加载的还是老的js,这个就坑爹了。
There is one last thing you need to know before proceeding – the browser caches the JS files so you’ll need to clear the browser’s cache every time you change your code. In Internet Explorer, you can do it in Tools -> Internet Options -> Delete Files -> Delete all offline content. You’ll do it a lot while developing, so having a button that does that will be great. You can use Microsoft’s IE developer toolbar or another developer toolbar.
分享到:
相关推荐
BIEE BIEE BIEE BIEE BIEE BIEE BIEE
BIEE实际项目使用过程中遇到常见问题汇总
对biee开发遇到的很多常见的问题进行了介绍,对biee开发的人员是一个很好参考
BIEE 11g 常见问题 整合版 biee如何实现下钻逻辑维,biee的许多功能实现 还有权限问题等
oracle 开发biee中遇到的常见问题解答,供大家参考!
BIEE入门视频,BIEE 资料,轻松学会BIEE,BIEE教程
BIEE配置ODBC连接impala BIEE配置ODBC连接impala BIEE配置ODBC连接impala
仪表板分组下拉显示 设置默认的仪表板 撤销页面“刷新“按钮 (不建议) ...交叉表行数限制 报表显示上的列级别控制 报表中现实自己有权限访问的第一个列 登录界面“版权所有“信息客户化 仪表盘顺序定制
Oracle BIEE 架构介绍PPT, 对BIEE架构的介绍很清楚,适合想了解BIEE的人群。
biee 仪表盘参数接收参数接收方法。形象易于学习,里面含有实例。
biee10g的一个小案例 帮助biee初学者可以很快全面了解biee
BIEE高级技巧运用之Union报表实现多层表头。
一篇BIEE的PDF,一篇BIEE的PDF一篇BIEE的PDF一篇BIEE的PDF一篇BIEE的PDF
BIEE开发核心 1. ORACLE BIEE基础 1.1. OBIEE 概述 1.2. BIEE 安装 1.3. 配置 1.4. 预览Demo效果 2. BIEE 开发步骤 2.1. 数据库 2.2. 创建资料库 2.3. 创建物理模型 2.4. 创建逻辑模型 2.5. 创建展现模型 2.6. 保存...
BIEE administrator tool使用
通过java调用oracle的biee接口webservice,主要实现三种方式: 1.通过路径获取图片和表格数据xml。 2.通过biee的逻辑sql获取图片和表格数据xml。 3.获取biee下的所有路径。 需要jar主要为axis.jar wsdl4j-1.5.1.jar ...
ORACLE BIEE的安装及一个完整的例子
介绍oracle biee的 开发步骤和应用中遇到的问题。
Oracle BIEE(简称BIEE)作为Oracle的新的商业智能平台企业版,起源于Oracle所收购的Siebel公司,BIEE原来叫做Siebel Analytic。
oracle BIEE技术手册 oracle BIEE技术手册 oracle BIEE技术手册