1.多表主外键关系急于删除或增加数据
1) 让主键失效:alter table table_name disable primary key cascade;
然后操作要删除或者增加的数据 之后恢复即可
2)让主键生效:alter table table_name enable primary key;
2.表bak
拷贝表
create student_bak as select * from student where 1=1;
复制表结构
create student_bak as select * from student where 1<>1;
3.分析表和索引
一般分析表和索引的语句如下:
analyze table 表名称 compute statistics for all indexes for all indexed columns;
如果表比较少的话,可以这么写,如果表多的话,可以改写为:
select 'analyze table '||t.table_name||' compute statistics for all indexes for all indexed columns;' from user_tables t where t.tablespace_name="表空间名称"
注意:分析用户表可以提高系统性能;千万不要分析系统表,否则可能导致系统(oracle)运行不稳定;
4.删除数据量大表
表数据多尽量使用truncate ,会比delete效率更高
5.数据库临时表
如果临时表长时间使用,此时应用对表的操作会变得效率很低,花费时间增加,这是因为临时表使用时间长水位变得很高,停止应用,降低表的水位会增加程序性能
6.表分区
大表最好使用分区,使用分区主要是3个原因:
1) 为了提高性能;
2) 为了减轻管理负担;
3) 为了提高DML和查询操作的性能。
定期检查表分区,防止表空间不足,表空间不足错误提示如下
7.sql恒等式
1)在oracle 9i数据库中尽量不要使用恒等式 :where 1=1 ,2=2 ,因为oracle9i 使用恒等式必然改变执行计划,无论是否建有索引、主键等,都会全表扫描,根本不会使用索引。
2)oracle 10g中如果系统启用了cursor_sharing=force或者similar,就会导致1=1被解析成:"SYS_B_0" = :"SYS_B_1",同样导致全表扫描(包括10g,9i),甚至引发oracle的bug。
8.使用函数
如果不使用基于函数的索引,那么在sql语句的where子句中对存在索引的列使用函数时,会使函数忽略掉这些索引.一些常见的函数,如:trunc、substr,to_date,to_char,instr等,等能该表列的值,因此无法使用已被函数引用的列的索引。
注意:通过改变所比较列上的值,而不是改变列本身,就可以启用索引引用,这样可以避免全表扫描。