oracle基础2

优化器

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

 

 

你可能感兴趣的:(oracle,sql,C++,c,C#)