关于cache提示的请教(大家都发表下自己的理解)

heyixiang 2005-12-02 09:09:55
select /*+ cache(a) */ * from table_name a

如上提示语法的使用,可以将a表全部load到内存中进行计算加快速度,但是这种情况一般适于a表比较小的时候,如果a表比较大的话会占用很多的内存.

一般关联查询的时候一个表往往只使用其中的几个字段,如果a表有4G的话全部load到内存中是无法想象的,pro*C++是配合oracle开发出现的,它可以只将a表中指定的字段load到内存中,这样的话可能占用的内存只有几十MB或者上百MB,不会对性能带来太大的影响,大幅度提高了速度.

我们公司似乎倾向于pro*C++的开发,对于我们数据库开发人员来说,我们的处理方法和那些用pro*C++的处理方法在操作速度上是没有可比性的,我很想在他们面前突出数据库的重要性,但这点让我很尴尬.


所以我想请教,oracle能不能也实现将指定字段load到内存中进行操作?
比如建立一个view,选出a表中需要的字段,然后select /*+ cache(b) */ * from view_name b,不知道这种方法是不是错误的方法,如果大家对cache有不同的理解请多多发表意见.

如果先从a表中选取指定的字段建临时表c,再将临时表c放到内存中,似乎方法也不错,但是建c表也是需要相当的开销.
...全文
210 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hevin 2005-12-04
  • 打赏
  • 举报
回复
http://www.matrix.org.cn/thread.shtml?topicId=26693&forumId=36

第 13 章 物化视图

8.1.5企业版/个人版开始支持

需要权限:GRANT CREATE MATERIALIZED VIEW,还必须直接赋予GRANT QUERY REWRITE。为实现查询重写,必须使用CBO。
13.1 物化视图如何工作
设置

COMPATIBLE参数必须高于8.1.0

QUERY_REWRITE_ENABLED = TRUE

QUERY_REWRITE_INTEGRETY =

ENFORCED - 查询仅用Oracle强制与保证的约束、规则重写;

TRUSTED – 查询除用Oracle强制与保证的约束、规则,也可用用户设定的数据间的任何关系来重写;

STALE_TOLERATED – 即便Oracle知道物化视图中数据过期(与事实表等不同步),也重写查询。

创建物化视图的用户必须具有直接赋予的GRANT QUERY REWRITE权限,不能通过角色继承。
内部机制

全文匹配

部分匹配:从FROM子句开始,优化器比较之后的文本,然后比较SELECT列表

一般重写方法:

数据充分

关联兼容

分组兼容

聚集兼容
13.2 确保使用物化视图
约束

考虑到现实环境的数据量,可以将主键、外键、非空等约束置为NOVALIDATE,并调整QUERY_REWRITE_INTEGRITY为TRUSTED,这样可以达到“欺骗”数据库的目的,但必须注意如果无法保证此类约束的真实有效,查询改写后可能造成结果不精确。
维度

实际就是指明已存在的表中各列的归并关系,从而关联事实表后形成的物化视图可用于向“上”归并(相当于用表中代表更高归并关系的列关联事实表)。标准语法:

CREATE DIMENSION time_hierarchy_dim

LEVEL day IS time_hierarchy.day

LEVEL mmyyyy IS time_hierarchy.mmyyyy

LEVEL yyyy IS time_hierarchy.yyyy

HIERARCHY time_rollup

(day CHILD OF mmyyyy CHILD OF yyyy)

ATTRIBUTE mmyyyy

DETERMINES mon_yyyy;
13.3 DBMS_OLAP
估计(物化视图)大小

DBMS_OLAP.ESTIMATE_SUMMARY_SIZE(视图名, 视图定义, 估计行数, 估计字节数);

其中后两个参数为NUMBER型输出参数。
维度有效性检查

DBMS_OLAP.VALIDATE_DIMENSION(视图名, 用户名, FALSE, FALSE);

SELECT * FROM 维度表名

WHERE ROWIN IN (SEELCT bad_rowid FROM MVIEW$_EXCEPTION);

所选出行即为不符合维度定义的行。
推荐物化视图

首先必须添加合适的外键,包通过外键来判定表之间的关系而不是维度。

DBMS_OLAP.RECOMMEND_MV(事实表名, 1000000000, ‘’);

第二个参数表示物化视图可用的空间大小,可传入一个较大的数。第三个参数传入需要保留的特定物化视图,传入空即为不考虑其他物化视图。

执行C:\oracle\RDBMS\demo\sadvdemo后执行:

DEMO_SUMADV.PRETTYPRINT_RECOMMENDATIONS
13.4 最后说明
物化视图不为OLTP系统设计

在事实表等更新时会导致物化视图行锁,从而影响系统并发性。
heyixiang 2005-12-04
  • 打赏
  • 举报
回复
物化视图 是不是 oracle 10i中的新东西?

我目前的状况是使用oracle8.1.6
heyixiang 2005-12-04
  • 打赏
  • 举报
回复
全局临时表 这个东西我还纳闷,不知道是什么,以为是新东西,后来一查原来就是会话临时表,看来我了解的不够全面,换了一个名字就不认识了 -_!!


临时表分为会话临时表和事务临时表,事务临时表就是说只要你一commit,临时表中的数据就清空了,而会话临时表则对于一个session来说的,如果没有断开连接或者没有删除,表中的数据则是永远存在的。这两种临时表都使用的是临时表空间。

但是先把数据创建到临时表中,还是会产生一个建表的开销,这样的流程就相当于:表→选择需要的字段插入到临时表→内存,而C++程序就相当于:表→选出需要的字段到内存。我不清楚C++中的开销具体有些什么步骤,但我感觉这样的速度似乎还是没得比,而且还要占用临时表空间。
heyixiang 2005-12-03
  • 打赏
  • 举报
回复
我看我需要研究下你说的这两个东西.
bierbin 2005-12-03
  • 打赏
  • 举报
回复
我不是很清楚这些,不过我想为什么不真实地创建一个表到本地,例如create table tmpdata
as select a1,a4,a7 from a表。然后在把 刚才建立的tmpdata 表的内容全部导入到 cache,这样真个的执行时间应该比view慢不了很多吧? 至于考虑到 tmpdata 表删除的问题, 我在我的项目用类似如下的办法处理—— 每次create 之前,先做一个 检验 tmpdata 表是否存在的函数,select 1 from tmpdata,如果异常返回0,传给调用函数,证明没有相同表名的表存在,可以执行进行create操作;如果有同名表存在,先drop再create。 我目前每天运作的从一张1500万数据的sybase表中取每天增量的数据到oracle的方法,就是上面的办法,很土,但是效率可以接受。
持续关注!谢谢子豚帮我讨论job的问题。
hevin 2005-12-03
  • 打赏
  • 举报
回复
有什么结果了别忘了说一声。
hevin 2005-12-02
  • 打赏
  • 举报
回复
如果先从a表中选取指定的字段建临时表c,再将临时表c放到内存中,似乎方法也不错,但是建c表也是需要相当的开销.


建全局临时表或物化视图呢?

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧