原帖由 newkid 于 2010-8-7 03:41 发表 ![]()
这个千万使不得。要是有这种灵丹妙药,ORACLE早替你自动加上了。
如果你这个SELECT 的源数据被频繁修改,每次修改ORACLE都要把相关的CACHE失效,反而变成额外负担。这和FOR UPDATE没有一点关系。
所以,该不该用这个功能,必须先理解它的原理,再理解自己的应用需求,才能够决定。原则也很简单,只要一个查询结果能被反复使用,CACHE就有帮助;如果这个结果本身是千变万化的,那就用不上了。
工具箱、包装器的思想没什么问题;但我认为Oracle已经有了最好的包装器PLSQL, 它替你处理绑定、替你处理游标(隐性游标)、替你管理缓存,更重要的是它鼓励你多用SQL而不是避免用SQL。
接受,不乱用/*+ result_cache */ 。
SELECT /*+ result_cache */ c.table_name Fld_Tlb_Name,c.column_name Fld_Column_Name,decode(data_type, 'CHAR',1, 'VARCHAR',1, 'VARCHAR2',1, 'DATE',129,'TIMESTAMP(6)',129,'FLOAT',8,'LONG',126, 'RAW',0, 'BINARY_DOUBLE',8,'BINARY_FLOAT',7, 'NUMBER',decode(nvl(DATA_SCALE,0),0,decode(nvl(data_precision,0), 0,257, 1,2, 2,2, 3,3, 4,3, 5,4, 6,4, 7,4, 8,4,9,4, 10,6, 11,6, 12,6, 13,6, 14,6, 15,6, 16,6, 17,6, 18,6, 257),8),257) Fld_Column_Type,decode(data_type, 'CHAR',data_length+1, 'VARCHAR',data_length+1,'VARCHAR2',data_length+1, 'DATE',20,'TIMESTAMP(6)',27,'FLOAT',8,'BINARY_DOUBLE',8,'BINARY_FLOAT',4,'LONG',-1, 'NUMBER', decode(nvl(DATA_SCALE,0),0,decode(nvl(data_precision,0), 0,40, 1,1, 2,1, 3,2, 4,2, 5,4, 6,4, 7,4, 8,4, 9,4, 10,8, 11,8, 12,8, 13,8, 14,8, 15,8, 16,8, 17,8, 18,8, data_precision+2),8),data_length) Fld_Column_Len,decode(data_type, 'CHAR',null, 'VARCHAR',null, 'VARCHAR2',null, 'DATE','YYYY-MM-DD HH24:MI:SS','TIMESTAMP(6)','YYYY-MM-DD HH24:MI:SS.FF6','FLOAT','%lg','LONG',null, 'BINARY_DOUBLE','%lg', 'BINARY_FLOAT','%g', 'NUMBER',decode(nvl(DATA_SCALE,0),0,null,'%'||TO_CHAR(data_precision+2)||'.'||TO_CHAR(DATA_SCALE)||'lf'),null) Fld_Format,k.position Fld_PK FROM all_tab_columns c, (select table_name,column_name,position from all_cons_columns where owner= :1 and table_name=:2 and position is not null) k where c.table_name = k.table_name(+) and c.column_name = k.column_name(+) and c.owner = :3 and c.table_name=:4 order by c.table_name, c.column_id
这个结果集是静态的,不怎么变。
这个没效果,可能是配置有问题。
[ 本帖最后由 yulihua49 于 2010-8-7 23:23 编辑 ] |