优化器
3种:基于规则的RBO,基于开销的CBO,和 CHOOSE:根据是否能找到统计数据决定采用RBO或CBO
oracle提供4种: rule, choose, first rows, all rows
frist rows: 属于CBO, 最快的响应时间,但会降低总体效率,主要用于实时响应
all rows: 属于CBO. 最小的吞吐量,采用并行全表扫描
会话级修改: alter session set optimizer_mode=first_rows
hints: 可以在语句级别指定优化器
select /*+ First_Rows */ name
from user;
函数索引:对某些字段的函数结果创建索引,这样在查询时使用函数也能有较好的性能。
create index idx1 on user(SUBSTR(username,1,7));
基于函数的索引,只有在CBO下才能被用到。
索引的使用
(1)如果对多个字段建立索引,则where语句必须使用前面的字段,才能使用此索引。
如: create index idx1 on user(a, b, c, d). 则必须条件是 a 或 a, b 或 a, b, c 才能使用到此索引,其它情况如 b, c 不能用到此索引。
(2)索引字段不能进行类型转换(如 where a='10', a是number类型),不能是表达式(如 where a + 10 > 50),不能使用不等号(如 a <> 10),否则用不上索引
软解析、硬解析
为了避免硬解析,pl/sql中应使用绑定变量,这主要是在动态执行sql中要注意:
不要直接拼凑sql语句:'insert into table(x, y) values(' || i || ' , ' ' abc ' ');' //其中i是变量,abc用两个单引号,因为insert 语句本身用单引号了,要表示 abc 是字符串,则用两个单引号
而是: 'insert into table(x, y) values(:i, ' ' abc ' ')' using i;
在存储过程中,一般写的并不是动态 sql,所以使用变量的方式就是绑定变量。
data block, extend, segment
data block是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理存储空间时,连续的data block就组成了extent . 一个数据库对象拥有的所有extents被称为该对象的segment.
data block的大小由参数 db_block_size 控制,一般是操作系统块大小的整数倍。包括块头、表目录、行目录、空闲空间(主要用于varchar)、数据等部分。
建表时会分配segment,它又会包含多个 extend
segment有三种: data segment, index segment, temporary segment
temporary segment 分配在临时表空间之上。
进行排序、分组汇总、索引等到操作时,会产生许多临时数据,Oracle数据库会先将这些临时数据存放到内存的PGA(程序全局区)内,PGA中有排序区,可以通过 sort_area_size调节大小。这个区一般都不够用,所以需要用到临时表空间。
pl/sql
动态语句使用绑定变量
cursor不能直接用,须: type cur is ref cursor; v_cur cur;
v_sql := 'select cout(*) from table1 where a=:p1 and b=:p2';
open cur for v_sql
loop
fetch cur into v_count using v_a, v_b;
exit when v_cur%notfound;
end loop;
不是游标的话:
execute immediate v_sql into v_count using v_a,v_b;
输出可以使用 dbms_output, 但需设置 set serveroutput on;
像表名是不能用绑定变量的,因为字符串的绑定变量相当于带了单引号。直接拼凑即可
数据导入导出
imp:
小心有大表,会导致大事务,然后undo表空间不够用,如果undo表空间不能自动扩展,会报错。由于是大事务,redo日志组也可能全部撑满,无法写入,alert日志将报 Checkpoint not complete,这时应增加日志组,尽量多给空间,以完成未完成的redo日志写入,当只有一个日志组状态为 active,其他为inactive,表示正常了。
undo表空间不够,而又有大事务,需要设置 commit=y buffer=500000000(单位字节)。
为了加快导入,可以对大表先删除索引,设置 INDEXES=n. 导入之后再增加索引:
imp system/manager@abc file=abc.dmp fromuser=aa touser=bb ignore=y indexes=n commit=y buffer=300000000