Tag Archives: ORACLE

oracle替代触发器的一种用法

原文地址: 快速增加表的默认值的方法 原文描述了一种尽量短时间锁定表的情况下给大表增加带默认值的字段的方法,主要思路如下: 先增加需要的字段,但不带默认值 修改新增字段的默认值 创建视图,将表中新增加字段的值,使用nvl函数转化为默认值 利用替代触发器,解决视图更新的问题 SQL语言: 高亮代码由发芽网提供 – 1. 创建测试的表 system@ORCL>create table t_person(id number);  Table created. system@ORCL>insert into t_person values (1); 1 row created. system@ORCL>insert into t_person values (2); 1 row created. system@ORCL>commit; Commit complete. – 2. 增加新字段,更改默认值 system@ORCL>alter table t_person add (name varchar(20)); Table altered. system@ORCL>alter table t_person modify (name default ‘unknown’); [...]

后端优化 — Numbers You Should Know

原文地址:我对后端优化的一点想法by童家旺(2012DTCC) L1 cache reference 0.5 ns(1GHz CPU) Branch mispredict 5 ns L2 cache reference 7 ns Mutex lock/unlock 25 ns Main memeory reference 100 ns Compress 1k bytes with Zippy 3,000 ns Send 2k bytes over 1Gbps network 20,000 ns Read 1MB sequentialy from main memory 250,000 ns Round trip with same datacenter 500,000 ns [...]

oracle全文索引测试

指定词法分析器lexer –chinese_lexer对中文的分词效率较高,但数据库的编码必须是UTF8 SYS@orcl>exec ctx_ddl.create_preference(‘my_lexer’, ‘chinese_lexer’); 创建单个字段的全文索引 SYS@orcl>desc t; Name Null? Type ——————– NAME VARCHAR2(50) ROLE VARCHAR2(50) SYS@orcl>create index index_t on t(role) indextype is ctxsys.context 2 parameters(‘lexer my_lexer’); Index created. 使用全文索引进行查询 SYS@orcl>select * from t where contains(role, ‘开发’) > 0; –使用score函数查询关键词的匹配度 SYS@orcl>select score(1), name, role from t where contains(role, ‘开发’, 1) > 0; 同步和优化索引 –默认情况下,全文索引不会同步更新,需要提交job定期更新 SYS@orcl>exec [...]

使用oerr命令查看oracle错误信息

Unix和Linux环境下可以直接使用,windows环境使用需要使用第三方的工具。 $ ./oerr ora 1555 01555, 00000, “snapshot too old: rollback segment number %s with name \”%s\” too small” // *Cause: rollback records needed by a reader for consistent read are // overwritten by other writers // *Action: If in Automatic Undo Management mode, increase undo_retention // setting. Otherwise, use larger rollback segments 参考资料: Viewing [...]

oracle中null在in、not in、exists操作中表现

1、null在in、not in操作符的左边时,结果都不是true SQL>select 1 from dual where null in (1,2,3,null); no rows selected SQL>select 1 from dual where null not in (1,2,3,null); no rows selected 2、使用not in时,如果操作符右边的集合中有null,其返回结果结果始终不是true SQL>select 1 from dual where 5 not in (1,2,3); 1 ———- 1 SQL>select 1 from dual where 5 not in (1,2,3,null); no rows selected 3、对包含null字段,not in和not exists操作不再等价,not exists返回结果更多,因为包含了null值 [...]

物化视图快速刷新测试

1. 创建物化视图相关的授权 GRANT CREATE MATERIALIZED VIEW TO adam; GRANT QUERY REWRITE TO adam; 2. 使用dmbs_mview.explain_mview查询无法快速刷新的原因 需要先创建表 mv_capabilities_table 脚本:$ORACLE_HOME/rdbms/admin/ultxmv.sql 具体用法: exec dbms_mview.explain_mview(mv=>’ekp.mv_org_person’,stmt_id=>’100′); select * from mv_capabilities_table t where t.capability_name like ‘REFRESH_FAST_AFTER%’ and statement_id = ’100′ dmbs_mview.explain_mview查询出无法快速刷新的原因: mv references PL/SQL function that maintains state, msnno 2083 查询语句中使用了函数wmsys.wm_concat inline view or subquery in FROM list not supported for [...]

使用在线重定义表增加新字段的一个例子

测试对象是ADAM.T2,只有一个字段N,想增加一个varchar2(10)的name字段 SYS@orcl>desc adam.t2; Name Null? Type —————————————— N NUMBER SYS@orcl>select count(*) from t2; COUNT(*) ———- 5 确认ADAM.T2是否支持在线重定义 SYS@orcl>exec dbms_redefinition.can_redef_table(‘adam’,'t2′,dbms_redefinition.cons_use_rowid); PL/SQL procedure successfully completed. 创建用于交换表定义临时表ADAM.T5 SYS@orcl>create table adam.t5 as select * from adam.t2 where 1 = 0; Table created. SYS@orcl>alter table adam.t5 add (name varchar2(20)); Table altered. 执行在线重定义操作 SYS@orcl>exec dbms_redefinition.start_redef_table(‘adam’,'t2′,’t5′,’n n’,2); PL/SQL procedure successfully completed. Elapsed: [...]

IN操作符中字符串变成列表

从asktom抄来的方案,原文地址:How can I do a variable “in list” create or replace type myTableType as table of varchar2 (255); create or replace function in_list( p_string in varchar2 ) return myTableType as l_string long default p_string || ‘,’; l_data myTableType := myTableType(); n number; begin loop exit when l_string is null; n := instr( l_string, ‘,’ ); [...]

Where do you cache Oracle data

原文地址:Where do you cache Oracle data? 文章中一些名词学习: QIO:认识Quick I/O 和Cached Quick I/O (vxfs) ISM:Solaris的动态ISM共享内存 Segmap:Solaris中的活动的文件缓存,参考Solaris memory allocation 在64位的数据库流行之前,同时使用文件系统的页面缓存和oracle数据文件的缓存是很常见的–服务器有很多内存,但数据库使用的内存不超过4G. 现在64位的数据库已经使用了很多年,仍然有一些系统在使用文件系统或QIO的缓存。 使用缓存IO过去会带来好处,但现在会导致大型系统性能下降、可伸缩性降低。使用缓存IO会带来的问题: 单次写加锁 内存碎片:8k的内存块,而不是4M或32M的ISM 双缓存需要双倍的内存带宽 Segmap带来的惩罚– 很多次xcall调用! 测试对象是一个46G带索引的表,使用100个进程同时读取单条记录模拟OLTP环境。只使用oracle的缓冲比同时使用文件缓存的读取速度提高了两倍,SYS CPU的时间也明显下降。 Cache OS Rows/sec getmaps/sec xcalls/sec Usr sys FS S9 287,114 86,516 2,600,000 71 28 DB S9 695,700 296 3,254 94 5 FS S10 334,966 106,719 1,003 78 21 [...]

oracle的translate函数

语法: translate(expr, from_string, to_string) 正常的用法,把expr中from_string中的每一位替换为to_string对应位置的字符,下面的例子是把what is your name?中的空格替换为下划线,问号替换为感叹号 SYS@orcl>select translate(‘what is your name?’, ‘ ?’, ‘_!’) from dual; TRANSLATE(‘WHATISY —————— what_is_your_name! 更加有用的使用方法是利用translate的一个特性,如果from_string的位数比to_string长,那么超出位数的字符会被替换为空,下面是一个例子,把name中的非数字删除: SYS@orcl>var name varchar2(20); SYS@orcl>exec :name := ‘abc12345def’; SYS@orcl>select translate(:name, ’0123456789′||:name, ’0123456789′) from dual; TRANSLATE(:NAME,’0123456789′||:NAME,’0123456789′) ———————————————————————————————————————— 12345 参考资料: oracle中translate函数的使用 oracle对translate函数的说明