day12_oracle hint——oracle hint例子
一、nologging 使用【强制操作不记录 联机日志,加快操作速度】
(1) 【一些临时使用的表,比如:操作某些表的某几条记录,表比较小,不想备份整表,做个表的复本!如果操作完毕了,不满意,再从复本表中取回数据!】
set timing on【打开操作执行时间】
SQL> alter system flush shared_pool;
SQL> alter system flush buffer_cache;
create table test as select * from all_objects;
Table created.
Elapsed: 00:00:05.93
create table test2 nologging as select * from all_objects;
Table created.
Elapsed: 00:00:02.70
select TABLE_NAME,LOGGING,OWNER from all_tables where TABLE_NAME in ('TEST','TEST2');
【校验是否记录日志,如果logging空的话,表可能是分区表、临时表、索引组织表】
(2) 【一些日志表,不重要的表】
set timing on【打开操作执行时间】
insert into test select * from all_objects;
49309 rows created.
Elapsed: 00:00:05.28
insert into test2 select * from all_objects;
49310 rows created.
Elapsed: 00:00:18.40
(3)【某一些数据不重要,这个表本身还是要记录日志的】
set timing on【打开操作执行时间】
SQL> truncate table test;
SQL> truncate table test2;
SQL> drop table test;
SQL> drop table test2;
SQL> alter system flush shared_pool;
SQL> alter system flush buffer_cache;
SQL> create table test as select * from all_objects;
SQL> create table test2 as select * from all_objects;
set timing on【打开操作执行时间】
SQL> insert into test select * from test;
49310 rows created.
Elapsed: 00:00:01.29
SQL> insert /*+ NOLOGGING */ into test2 select * from test2;
49309 rows created.
Elapsed: 00:00:00.30
二、 append
【在使用了append选项以后,insert数据会直接加到表的最上面,是在表的高水位上分配空间,而不会在表的空闲块中插入数据。使用append会增加数据插入的速度。】
set timing on【打开操作执行时间】
SQL> truncate table test;
SQL> truncate table test2;
SQL> drop table test;
SQL> drop table test2;
SQL> alter system flush shared_pool;
SQL> alter system flush buffer_cache;
SQL> create table test as select * from all_objects;
SQL> create table test2 as select * from all_objects;
set timing on
SQL> insert into test select * from test;
49309 rows created.
Elapsed: 00:00:00.55
SQL> insert /*+append*/ into test2 select * from test2;
49310 rows created.
Elapsed: 00:00:00.19
三、整合
set timing on【打开操作执行时间】
SQL> truncate table test;
SQL> truncate table test2;
SQL> drop table test;
SQL> drop table test2;
SQL> alter system flush shared_pool;
SQL> alter system flush buffer_cache;
SQL> create table test as select * from all_objects;
SQL> create table test2 as select * from all_objects;
SQL> insert into test select * from test;
49309 rows created.
Elapsed: 00:00:00.41
SQL> insert /*+ append*/ into test2 nologging select * from test2;
49310 rows created.
Elapsed: 00:00:00.12
-------------------------------------------------------------------------
四、parallel 【开启并行,提高速度,占用CPU资源,慎用】
可以在写SQL时用hint 强制来使用并行。
HINT 提示修改
parallel(table,4) 并行度为4
parallel(table) 如果使用parallel 但未指定并行度,则DOP要通过初始化参数CPU_count 和Parallel_THREADS_PER_CPU计算得到,
并行度为4的程序,最多可以分配或创建9个并行执行服务器来满足这个事务操作,所以并行操作速度有很大提高,但对CPU占用比较多
并行操作增加了事务操作的性能,但会连续的记录重做日志,并且造成瓶颈,所以可以使用nologging 模式来避免瓶颈
sql> alter table table_name NOLOGGING;
sql> select /*+ parallel(table,4)*/ count(*) from table;
并行处理服务器(Parallel Execution Servers)
并行处理服务器默认是开启的。因为PARALLEL_MAX_SERVERS参数的默认值是大于0的;
在SESSION级别修改并行处理
1 关闭并行处理
ALTER SESSION DISABLE PARALLEL DML|DDL|QUERY;
如,关闭DDL的并行处理
ALTER SESSION DISABLE PARALLEL DDL;
2 开启并行处理
ALTER SESSION ENABLE PARALLEL DML|DDL|QUERY;
如,开启DML的并行处理
ALTER SESSION ENABLE PARALLEL DML;
SQL语句强制并行处理
ALTER SESSION FORCE PARALLEL DML|DDL|QUERY;
如:强制并行DDL,并行度为5
ALTER SESSION FORCE PARALLEL DDL PARALLEL 5;
注:强制并行处理的优先级比SQL语句中HINT的优先级要低