oracle并行的小细节(r2笔记44天)
今天在从生产环境中做一个数据抽取,为了提高效率,加了并行。发现了一些小的细节。
首先,抽取数据时,对于并行度的指定我是设定200M为一个单位,如果表有1G,那么就需要启5个并行,结果有一个表有40G,按照这个单位,需要200个并行。
但是在实际中,ddl的执行并行度,数据库不一定会买账,首先从数据库实例层面有一些参数限定。
这下面的配置中,这个库最多只能使用64个并行。
SQL> show parameter parall
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback string LOW
parallel_adaptive_multi_user boolean FALSE
parallel_automatic_tuning boolean FALSE
parallel_degree_limit string CPU
parallel_degree_policy string MANUAL
parallel_execution_message_size integer 65536
parallel_force_local boolean FALSE
parallel_instance_group string
parallel_io_cap_enabled boolean FALSE
parallel_max_servers integer 64
为了保险起见,我指定了抽取数据时的那个ddl的并行度为30,但是实际运行的时候只启用了8个。
USERNAME TOTAL_CNT ACTIVE INACTIVE KILLED SNIPED JDBC Thin Client
--------------- ---------- ---------- ---------- ---------- ---------- ----------------
TMP_MIG 9 9 0 0 0 0
但是可以注意到一个细节,实际中只启用了8个并行,但是在数据库里的对应的session却有9个。 来看看session的情况,第一个session是通过sqlplus连进来的,剩下的都是和并行绑定的session.
SID SERIAL# USERNAME MACHINE PROGRAM
---------- ---------- ------------------------------ ---------------------------------------------------------------- ------------------------------------------------
4163 36087 TMP_MIG prod_db sqlplus@prod_db (TNS V1-V3)
4383 17193 TMP_MIG prod_db oracle@prod_db (P048)
4568 13403 TMP_MIG prod_db oracle@prod_db (P049)
4750 15373 TMP_MIG prod_db oracle@prod_db (P050)
4956 8551 TMP_MIG prod_db oracle@prod_db (P052)
5107 11535 TMP_MIG prod_db oracle@prod_db (P051)
5329 12139 TMP_MIG prod_db oracle@prod_db (P053)
5492 21119 TMP_MIG prod_db oracle@prod_db (P054)
5698 14709 TMP_MIG prod_db oracle@prod_db (P055)
如果启用后的有些并行session处理的快,会马上释放对应的session,session就会处于inactive状态。
在数据抽取执行了一会以后,来查看session的情况,发现有7个session处于Inactive状态了。
USERNAME TOTAL_CNT ACTIVE INACTIVE KILLED SNIPED JDBC Thin Client
--------------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------- -----------
TMP_MIG 9 2 7 0 0 0
当然了,可以看到oracle的并行似乎是采用了多个session(多个session对应指定的parallel)来处理数据。
其实我更关心parallel的这些session都做些什么。来尝试一下看看它们正在执行的sql,倒底是什么,尝试了多个session,都没有找到,看来oracle是不想让我们知道这些细节了。
SQL> select prev_sql_id sql_id from v$session where sid=4383;
SQL_ID
-------------
SQL> c/4383/5698
1* select prev_sql_id sql_id from v$session where sid=5698
SQL> /
SQL_ID
-------------
在稍候的工作继续观察,看能不能得到一些惊喜。
- (65) 线程的基本概念 / 计算机程序的思维逻辑
- 用Python玩转微信的正确姿势!
- 版本管理工具总结
- java枚举类型enum的使用
- (66) 理解synchronized / 计算机程序的思维逻辑
- 用Python搭建一个校园维基网站(一)
- (67) 线程的基本协作机制 (上) / 计算机程序的思维逻辑
- 制作Aspose CHM文档的过程记录
- 用python搭建一个校园维基网站(二)—— 可编辑内容的首页的创建
- Django博客教程(四):让 django 完成翻译—迁移数据库模型
- Calendar类中add/set/roll方法的区别
- 如何构建一个分布式爬虫(理论篇)
- Python微型Web框架Bottle源码分析
- VirtualBox相关问题总结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详细介绍通过配置Apache实现404页面替换
- bug分支和feature分支_动力节点Java学院整理
- Linux下Python脚本自启动与定时任务详解
- Linux服务器tomact 8.0启动慢的完美解决方法
- vim学习高级技巧之序列的生成方法详解
- 【LoRa社区网关点亮活动】基于腾讯云IoT Explorer搭建开放的LoRaWAN网络
- 面试官:说一下List排序方法
- GWAS全基因组关联分析流程(BWA+samtools+gatk+Plink+Admixture+Tassel)
- linux中ipset命令的使用方法详解
- VirtualBox 未指定要bridged的网络界面的解决办法
- Vim中宏命令的使用实例详解
- 在CentOS搭建Git服务器的详细步骤
- CentOS使用EPEL源的方法步骤
- VirtualBox 错误:This kernel requires the following features not present on the CPU
- keepalived实现nginx高可用