having 子句的用法
having 子句对 group by 子句所确定的行组进行控制having 子句条件中只允许涉及常量聚组函数或group by 子句中的列
外部联接+的用法
外部联接+按其在=的左边或右边分左联接和右联接若不带+运算符的表中的一个行不直接匹配于带+预算符的表中的任何行则前者的行与后者中的一个空行相匹配并被返回若二者均不带+则二者中无法匹配的均被返回利用外部联接+可以替代效率十分低下的 not in 运算大大提高运行速度例如下面这条命令执行起来很慢
select aempno from emp a where aempno not in(select empno from emp where job=SALE);
倘若利用外部联接改写命令如下:
select aempno from emp a emp b where aempno=bempno(+) and bempno is null and bjob=SALE;
可以发现运行速度明显提高
删除表内重复记录的方法
可以利用这样的命令来删除表内重复记录:
delete from table_name a where rowid< (select max(rowid) from table_name where column=lumn and column=lumn and colum=lum and );
不过当表比较大(例如万条以上)时这个方法的效率之差令人无法忍受需要另想办法(可参看拙文《电信计费中长途重复话单的技术处理》《计算机与通信》)
set transaction 命令的用法
在执行大事务时有时oracle会报出如下的错误:
ORA:snapshot too old (rollback segment too small)
这说明oracle给此事务随机分配的回滚段太小了这时可以为它指定一个足够大的回滚段以确保这个事务的成功执行例如
set transaction use rollback segment roll_abc;delete from table_name where mit;
回滚段roll_abc被指定给这个delete事务commit命令则在事务结束之后取消了回滚段的指定
使用索引的注意事项
selectupdatedelete 语句中的子查询应当有规律地查找少于%的表行如果一个语句查找的行数超过总行数的%它将不能通过使用索引获得性能上的提高
索引可能产生碎片因为记录从表中删除时相应也从表的索引中删除表释放的空间可以再用而索引释放的空间却不能再用频繁进行删除操作的被索引的表应当阶段性地重建索引以避免在索引中造成空间碎片影响性能在许可的条件下也可以阶段性地truncate表truncate命令删除表中所有记录也删除索引碎片
数据库重建应注意的问题
在利用import进行数据库重建过程中有些视图可能会带来问题因为结构输入的顺序可能造成视图的输入先于它低层次表的输入这样建立视图就会失败要解决这一问题可采取分两步走的方法:首先输入结构然后输入数据命令举例如下 (uesrname:jfclpassword:hfjfhost sting:ora数据文件:expdatadmp):
imp jfcl/hfjf@ora file=empdatadmp rows=Nimp jfcl/hfjf@ora file=empdatadmp full=Y buffer= commit=Y ignore=Y
第一条命令输入所有数据库结构但无记录第二次输入结构和数据字节提交一次ignore=Y选项保证第二次输入既使对象存在的情况下也能成功