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的优先级要低





原文地址:https://www.cnblogs.com/xiaoxiao5ya/p/6b9af7bef1da5d9e549a1f2f7613fa90.html