热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

oracle并行之并行度篇

操作内并行使用的slaveprocess数量就是并行度dop,indextable都有dop作为默认操作并行度default1表示不使用并行处理SQLcreatetablet1(aint)parallel6;Tablecreated.SQLselectdegreefromuser_tableswheretable_name’T1′;DEGREE——

操作内并行使用的slave process数量就是并行度dop,indextable都有dop 作为默认操作并行度default 1表示不使用并行处理 SQL create table t1 (a int) parallel 6; Table created. SQL select degree from user_tables where table_name=’T1′; DEGREE ——

操作内并行使用的slave process数量就是并行度dop,index&table都有dop 作为默认操作并行度default 1表示不使用并行处理

SQL> create table t1 (a int) parallel 6;

Table created.

SQL> select degree from user_tables where table_name=’T1′;

DEGREE
———-
6

SQL> alter table t1 parallel 3;

Table altered.

SQL> select degree from user_tables where table_name=’T1′;

DEGREE
———-
3
*禁用alter table(index) parallel 1 (noprallel)
#create 时候使用parallel不仅会在创建table&index时使,后续的操作ddl,dml也会使用(如果只想建表时使用,建好后修改)

SQL> create table t2 (a int) parallel;(未指定并行度)

Table created.

SQL> select degree from user_tables where table_name=’T2′;

DEGREE
———-
DEFAULT ~~~这样使用default并行度=(cpu_count*parallel_threads_per_cpu)

SQL> show parameter cpu_count

NAME TYPE VALUE
———————————— ———– ——————————
cpu_count integer 2
SQL> show parameter parallel_thread

NAME TYPE VALUE
———————————— ———– ——————————
parallel_threads_per_cpu integer 2
SQL>

SQL> insert into t2 values (1);

1 row created.

SQL> commit;

Commit complete.

SQL> set autotrace trace exp
SQL> select * from t2;

Execution Plan
———————————————————-
Plan hash value: 1216610266

——————————————————————————–
——————————

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
| TQ |IN-OUT| PQ Distrib |

——————————————————————————–
——————————

| 0 | SELECT STATEMENT | | 1 | 13 | 2 (0)| 00:00:01
| | | |

| 1 | PX COORDINATOR | | | | |
| | | |

| 2 | PX SEND QC (RANDOM)| :TQ10000 | 1 | 13 | 2 (0)| 00:00:01
| Q1,00 | P->S | QC (RAND) |

| 3 | PX BLOCK ITERATOR | | 1 | 13 | 2 (0)| 00:00:01
| Q1,00 | PCWC | |

| 4 | TABLE ACCESS FULL| T2 | 1 | 13 | 2 (0)| 00:00:01
| Q1,00 | PCWP | |

——————————————————————————–
——————————

Note
—–
– dynamic sampling used for this statement

SQL>
SQL> set autotrace off
SQL> select process from v$pq_tqstat;

no rows selected

可以看到 用set autotrace 后 查v$pq_tqstat norows ,这是2个原因造成的
1.set autotrace的原理
开启autotrace时候 一个process对应 2个 session
通常情况下是一个 session对应一个 server processs,但SErVER PORCESSS 可以对应多个session

SQL> conn xh/a831115
已连接。
SQL> select distinct sid from v$mystat;

SID
———-
144

SQL> select username, sid, serial#, server, paddr, status from v$session where s
id=144;

USERNAME SID SERIAL# SERVER PADDR STATUS
—————————— ———- ———- ——— ——– ——–

XH 144 27 DEDICATED 20E4CC3C INACTIVE

SQL> select program ,addr from v$process where addr=(select paddr from v$session
where sid=144);

PROGRAM ADDR
—————————————————————- ——–
ORACLE.EXE (SHAD) 20E4CC3C

SQL> select sid from v$session where paddr=’20E4CC3C’;

SID
———-
144

SQL> set autotrace on
SQL> select sid from v$session where paddr=’20E4CC3C’;

SID
———-
144
154

2.v$pq_tqstat只提供当前session最后一次并行执行sql语句的信息
综合2点可以看出set autotrace 最后一个session 是 执行计划的,所以v$pq_tqstat为no rows

所以 直接执行
SQL> select * from t2;

A
———-
1

SQL> SELECT dfo_number, tq_id, server_type, process, num_rows, bytes
2 FROM v$pq_tqstat
3 ORDER BY dfo_number, tq_id, server_type DESC, process;

DFO_NUMBER TQ_ID SERVER_TYP PROCESS NUM_ROWS BYTES
———- ———- ———- ———- ———- ———-
1 0 Producer P000 1 24
1 0 Producer P001 0 20
1 0 Producer P002 0 20
1 0 Producer P003 0 20
1 0 Consumer QC 1 84

可以看到启动了4个slave process,这4个process=cpu_count*parallel_threads_per_cpu(2*2)

相关的hint:
parallel(10g,11g),no_parallel(10g,11g),parallel_index(10g,11g,9i),no_parallel_index(10g,11g)
noparallel(9i),noparallel_index(9i)
##需要知道并行hint只是告诉优化器可以使用并行,但不是强制使用并行一切还是从cost出发(重点)
declare
begin
for i in 1..1000 loop
insert into t2 values(i);
end loop;
commit;
end;

SQL> explain plan set statement_id=’t2_pp’ for select /*+parallel(t2 2)*/* from t2 where a>900;

Explained.

SQL> create index t2_id on t2 (a);

Index created.

SQL> explain plan set statement_id=’t2_id’ for select /*+parallel(t2 2)*/* from t2 where a>900;

Explained.

SQL> set linesize 1000
SQL> select * from table (dbms_xplan.display(null,’t2_pp’));

PLAN_TABLE_OUTPUT
————————————————————————————————————————————————————————————————————————————————————————————————————
Plan hash value: 1216610266

————————————————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
————————————————————————————————————–
| 0 | SELECT STATEMENT | | 100 | 1300 | 2 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM)| :TQ10000 | 100 | 1300 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | PX BLOCK ITERATOR | | 100 | 1300 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |
|* 4 | TABLE ACCESS FULL| T2 | 100 | 1300 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
————————————————————————————————————–

PLAN_TABLE_OUTPUT
————————————————————————————————————————————————————————————————————————————————————————————————————

Predicate Information (identified by operation id):
—————————————————

4 – filter(“A”>900)

Note
—–
– dynamic sampling used for this statement

20 rows selected.

SQL> select * from table (dbms_xplan.display(null,’t2_id’));

PLAN_TABLE_OUTPUT
————————————————————————————————————————————————————————————————————————————————————————————————————
Plan hash value: 523330294

————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————–
| 0 | SELECT STATEMENT | | 100 | 1300 | 2 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| T2_ID | 100 | 1300 | 2 (0)| 00:00:01 |
————————————————————————–

Predicate Information (identified by operation id):
—————————————————

PLAN_TABLE_OUTPUT
————————————————————————————————————————————————————————————————————————————————————————————————————

1 – access(“A”>900)

Note
—–
– dynamic sampling used for this statement

17 rows selected.

可以看到 即使在使用并行与走index时cost一样时候还是选择了走index(cost表面一样,若使用trace alter session set events ’10053 trace name context forever’;看的更详细,并行cpu cost要高些,所以选择了走index,所以hint parallel,parallel_index只是告诉query optimizer
可以考虑并行 不是强制使用)

推荐阅读
  • BIEE中的最终用户界面被称为Presentation Layer(展现层)。展现层呈现的内容与用户在Web报表开发界面中看到的一致,使用业务语言进行描述,隐藏了技术细节,如星型模型。本文将详细介绍展现层的设计要点及其与业务模型层的关系。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 本文介绍了在 MySQL 中如何使用正则表达式来提高查询效率,通过具体示例展示了如何筛选包含中文字符的记录,并详细解释了正则表达式的各种特殊字符和结构。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 本文介绍如何在将数据库从服务器复制到本地时,处理因外键约束导致的数据插入失败问题。 ... [详细]
  • 本视频教程将带你快速了解 Android 开发的基础知识,并详细讲解如何在 Android 应用中使用 SQLite 数据库进行数据存储和管理。 ... [详细]
  • 如何撰写数据分析师(包括转行者)的面试简历?
    CDA数据分析师团队出品,作者:徐杨老师,编辑:Mika。本文将帮助您了解如何撰写一份高质量的数据分析师简历,特别是对于转行者。 ... [详细]
  • 本文介绍了在 Spring Boot 中使用 JPA 进行数据删除操作时遇到的 SQL 错误及其解决方法。错误表现为:删除操作失败,原因是无法打开 JPA EntityManager 以进行事务处理。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • Oracle 用户锁定问题及解决方法
    本文介绍了如何在 Oracle 数据库中检查和处理用户锁定问题,包括查询被锁定的用户、解锁用户以及调整登录失败次数限制的方法。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
author-avatar
Ww不孤单_584
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有