Oracle多线程并行使用、关联与指定索引执行

CREATE TABLE T_SMAINT_2016012703 parallel 4 nologging AS
SELECT /*+parallel(4) leading(s a) use_hash(A) index(s IDX_CS_SERVICE_RECORD_MD2_04) */S.SMAINT_ID, S.SMAINT_DESC
  FROM T_CS_SERVICE_RECORD S
  JOIN T_CD_MAINT A
    ON A.SMAINT_ID = S.SMAINT_ID
   AND S.SORG_ID = ‘MDKT‘
   AND A.SORG_ID = S.SORG_ID
   AND A.PROD_ID = ‘KT‘
   AND S.PUB_CREATE_DATE BETWEEN
       TO_DATE(‘2015-01-01 00:00:00‘, ‘yyyy-mm-dd hh24:mi:ss‘) AND
       TO_DATE(‘2015-12-31 23:59:59‘, ‘yyyy-mm-dd hh24:mi:ss‘);
parallel 4 nologging:并行(Parallel)使用
/*+parallel(4) leading(s a) use_hash(A) index(s IDX_CS_SERVICE_RECORD_MD2_04) */
parallel(4):4个进程并行使用
leading(s a):指定表的查询顺序先查s表,根据S.PUB_CREATE_DATE条件走索引IDX_CS_SERVICE_RECORD_MD2_04查询结果集,再用hash连接关联a表。哈希连接会耗费大量cup和内存,而嵌套循环则会少很多。如上例子,如果使用嵌套循环,根据s表查询结果集一行一行数据关联a表循环查询
使用leading和use_nl来设置表的查询顺序,来加快查询速度,一般把小表设为第一个表。
/*+LEADING(TABLE)*/  将指定的表作为连接次序中的首表./*+USE_NL(TABLE)*/  将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.

1.查询

Sql代码

SELECT /*+ Parallel(t,8) */ * FROM emp t;

SELECT /*+ Parallel(8) */ * FROM emp t;

SELECT /*+ Parallel */ * FROM emp t;

2.创建索引

Sql代码

create index idx_emp_test on emp(empno,ename,job) nologging parallel 32;

创建索引的时候,如果有条件的话一定要加并行!客户这边的ExaData服务器,对运单表(5000多万记录,90多个字段,60多G数据)创建索引,索引字段包含6列,并行度开到64,创建索引耗时竟然只消耗13秒多点,把俺惊讶的……

时间: 2024-11-04 22:45:10

Oracle多线程并行使用、关联与指定索引执行的相关文章

Oracle使用并行建索引需要注意的问题

建索引时,我们为了建索引快,会加上并行,加上并行之后,此列索引就会是并行了.访问有并行度的索引时,CBO可能可能会考虑并行执行,这可能会引发一些问题,如在服务器资源紧张的时候用并行会引起更加严重的争用.当使用并行后,需要把并行度改回来. SQL> drop table test purge; SQL> create table test as select * from dba_objects; SQL> create index ind_t_object_id on test(obje

oracle 性能优化操作八: 利用HINT强制指定索引

在ORACLE优化器无法用上合理索引的情况下,利用HINT强制指定索引. 继续"oracle 性能优化操作七"的例子,ORACLE缺省认定,表中列的值是在所有数据行中均匀分布的, 也就是说,在一百万数据量下,每种DisposalCourseFlag值各有12.5万数据行与之对应. 假设SQL搜索条件DisposalCourseFlag=2,利用DisposalCourseFlag列上的索引进行数据搜索效率, 往往不比全表扫描的高,ORACLE因此对索引"视而不见",

iOS开发--多线程 并行开发

概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程

Oracle开启并行的几种方法

并行执行是同时开启多个进程/线程来完成同一个任务,并行执行的每一个进程/线程都会消耗额外的硬件资源,所以并行执行的本质就是以额外的硬件资源消耗来换取执行时间的缩短.这里的额外硬件资源消耗是指对数据库服务器上多个CPU.内存.从个I/O通道,甚至是RAC环境下多个数据库节点的额外利用. 下面总结一下Oracle里开启并行的几种方法 1.更改目标表的并行度 有两种方法修改目标表的并行度 alter table table_name parallel; alter table table_name p

oracle parallel 并行 设置 理解

引子:以前一直没太关注oracle并行这个特性.前几天一个兄弟碰到的一个问题,才让我觉得这个东西还是有很多需要注意的地方,有必要仔细熟悉下.其实碰到的问题不复杂: 类似如下的一条语句:insert into xxxx select /+parallel(a) / * from xxx a;数据量大约在75G左右,这位兄弟从上午跑到下午还没跑完,过来问我咋回事,说平常2hrs能跑完的东西跑了好几个小时还撒动静.查看系统性能也比较 正常,cpu,io都不繁忙,平均READ速度在80M/s左右(勉强凑

oracle创建表空间 创建用户指定表空间并授权

1.创建表空间 例如: (1)表空间名为myplace: (2)数据文件路径为E:\oracle\oracle_home\oradata\myspace (3)文件名为mydbf.dbf,空间大小为32M (4)设置表空间自动扩展,每次扩展32M,最大空间为2048M (5)本地管理表空间 create tablespace myspace     logging       datafile 'E:\oracle\oracle_home\oradata\myspace\mydbf.dbf' 

类中属性返回形式(对象,关联数组,索引数组)

class A { public $x, $y; function __construct($x, $y)  { $this->x = $x; $this->y = $y; } function get_value($arr = true)  { if($arr == 'arr')   { // 类中属性以关联数组形式转换返回 return get_object_vars($this); }else if($arr == 'obj')   { //类中属性以对象形式返回 return $thi

oracle使用LEFT JOIN关联产生的问题在查询结果中使用CASE WHEN 无法判断

oracle使用LEFT JOIN关联产生的问题在查询结果中使用CASE WHEN 无法判断 查询方式一: 1 SELECT 2 CASE WHEN (SELECT CAST(SUM(CASE 3 WHEN (ALLOCABLE_PRIME_CURRENCY_VALUE IS NULL AND STATE_IND = 1) THEN 4 NVL(PRIME_CURRENCY_VALUE, 0) 5 ELSE 6 NVL(ALLOCABLE_PRIME_CURRENCY_VALUE, 0) END

java8新特性(六):Stream多线程并行数据处理

转:http://blog.csdn.net/sunjin9418/article/details/53143588 将一个顺序执行的流转变成一个并发的流只要调用 parallel()方法 public static long parallelSum(long n){    return Stream.iterate(1L, i -> i +1).limit(n).parallel().reduce(0L,Long::sum); } 并行流就是一个把内容分成多个数据块,并用不不同的线程分别处理每