精华内容
下载资源
问答
  • Oracle Parallel 多线程

    万次阅读 2012-04-14 10:45:43
    也就是说,加上这个说明,可以强行启用Oracle的多线程处理功能。举例的话,就像电脑装了多核的CPU,但大多情况下都不会完全多核同时启用(2核以上的比较明显),使用parallel说明,就会多核同时工作,来提高效率。 ...
     
    

    对于一个大的任务,一般的做法是利用一个进程,串行的执行,如果系统资源足够,可以采用parallel技术,把一个大的任务分成若干个小的任务,同时启用n个进程/线程,并行的处理这些小的任务,这些并发的进程称为并行执行服务器(parallel executeion server),这些并发进程由一个称为并发协调进程的进程来管理。

    启用Parallel前的忠告:只有在需要处理一个很大的任务,如需要几十分钟,几个小时的作业中,并且要有足够的系统资源的情况下(这些资源包括cpu,内存,io),您才应该考虑使用parallel。否则,在一个多并发用户下,系统本身资源负担已经很大的情况下,启用parallel,将会导致某一个会话试图占用了所有的资源,其他会话不得不去等待,从而导致系统系能反而下降的情况,一般情况下,oltp系统不要使用paralleloltp系统中可以考虑去使用。

     

    Parallel分类

    l  并行查询parallel query

    l  并行dml parallel dml pdml

    l  并行ddl parallel ddl pddl

     

    一、 并行查询

    并行查询允许将一个sql select语句划分为多个较小的查询,每个部分的查询并发地运行,然后将各个部分的结果组合起来,提供最终的结果,多用于全表扫描,索引全扫描等,大表的扫描和连接、创建大的索引、分区索引扫描、大批量插入更新和删除

     

    1.    启用并行查询

    SQL> ALTER TABLE T1 PARALLEL;

    告知oracle,对T1启用parallel查询,但并行度要参照系统的资源负载状况来确定。

    利用hints提示,启用并行,同时也可以告知明确的并行度,否则oracle自行决定启用的并行度,这些提示只对该sql语句有效。

    SQL> select /*+ parallel(t1 8) */ count(*)from t1;

     

    SQL> select degree from user_tables where table_name='T1';

    DEGREE

    --------------------

      DEFAULT

     

    并行度为Default,其值由下面2个参数决定

    SQL> show parameter cpu

     

    NAME                                TYPE       VALUE

    ----------------------------------------------- ------------------------------

    cpu_count                           integer    2

    parallel_threads_per_cpu            integer    2

     

    cpu_count表示cpu

    parallel_threads_per_cpu表示每个cpu允许的并行进程数

    default情况下,并行数为cpu_count*parallel_threads_per_cpu

     

    2.    取消并行设置

    SQL> alter table t1 noparallel;

    SQL> select degree from user_tables wheretable_name='T1';

     

    DEGREE

    ----------------------------------------

            1

     

    3.    数据字典视图

    v$px_session

    sid:各个并行会话的sid

    qcsidquery coordinator sid,查询协调器sid

     

    二、 并行dml

    并行dml包括insertupdatedeletemerge,在pdml期间,oracle可以使用多个并行执行服务器来执行insertupdatedeletemerge,多个会话同时执行,同时每个会话(并发进程)都有自己的undo段,都是独立的一个事务,这些事务要么由pdml协调器进程提交,要么都rollback

    在一个有充足I/o带宽的多cpu主机中,对于大规模的dml,速度可能会有很大的提升,尤其是在大型的数据仓库环境中。

    并行dml需要显示的启用

    SQL> alter session enable parallel dml;

     

    Disable并行dml

    SQL> alter session disable parallel dml;

     

    三、 并行ddl

    并行ddl提供了dba使用全部机器资源的能力,常用的pddl

    create table as select ……

    create index

    alter index rebuild

    alter table move

    alter table split

    在这些sql语句后面加上parallel子句

    SQL> alter table t1 move parallel;

    Table altered

    SQL> create index T1_IDX on T1 (OWNER,OBJECT_TYPE)

     2   tablespace SYSTEM

    3        parallel;

    4        

    1. 用途 强行启用并行度来执行当前SQL。这个在Oracle 9i之后的版本可以使用,之前的版本现在没有环境进行测试。也就是说,加上这个说明,可以强行启用Oracle的多线程处理功能。举例的话,就像电脑装了多核的CPU,但大多情况下都不会完全多核同时启用(2核以上的比较明显),使用parallel说明,就会多核同时工作,来提高效率。 但本身启动这个功能,也是要消耗资源与性能的。所有,一般都会在返回记录数大于100万时使用,效果也会比较明显。 2. 语法 /*+parallel(table_short_name,cash_number)*/ 这个可以加到insert、delete、update、select的后面来使用(和rule的用法差不多,有机会再分享rule的用法) 开启parallel功能的语句是: alter session enable parallel dml; 这个语句是DML语句哦,如果在程序中用,用execute的方法打开。 3. 实例说明 用ERP中的transaction来说明下吧。这个table记录了所有的transaction,而且每天数据量也算相对比较大的(根据企业自身业务量而定)。假设我们现在要查看对比去年一年当中每月的进、销情况,所以,一般都会写成: select to_char(transaction_date,'yyyymm') txn_month, sum( decode( sign(transaction_quantity),1,transaction_quantity,0 ) ) in_qty, sum( decode( sign(transaction_quantity),-1,transaction_quantity,0 ) ) out_qty from mtl_material_transactions mmt where transaction_date >= add_months( to_date( to_char(sysdate,'yyyy')||'0101','yyyymmdd'), -12) and transaction_date <= add_months( to_date( to_char(sysdate,'yyyy')||'1231','yyyymmdd'), -12) group by to_char(transaction_date,'yyyymm') 这个SQL执行起来,如果transaction_date上面有加index的话,效率还算过的去;但如果没有加index的话,估计就会半个小时内都执行不出来。这是就可以在select 后面加上parallel说明。例如: select /*+parallel(mmt,10)*/ to_char(transaction_date,'yyyymm') txn_month, ... 这样的话,会大大提高执行效率。如果要将检索出来的结果insert到另一个表tmp_count_tab的话,也可以写成: insert /*+parallel(t,10)*/ into tmp_count_tab ( txn_month, in_qty, out_qty ) select /*+parallel(mmt,10)*/ to_char(transaction_date,'yyyymm') txn_month, ... 插入的机制和检索机制差不多,所以,在insert后面加parallel也会加速的。关于insert机制,这里暂不说了。 Parallel后面的数字,越大,执行效率越高。不过,貌似跟server的配置还有oracle的配置有关,增大到一定值,效果就不明显了。所以,一般用8,10,12,16的比较常见。我试过用30,发现和16的效果一样。不过,数值越大,占用的资源也会相对增大的。如果是在一些package、function or procedure中写的话,还是不要写那么大,免得占用太多资源被DBA开K。 4. Parallel也可以用于多表 多表的话,就是在第一后面,加入其他的就可以了。具体写法如下: /*+parallel(t,10) (b,10)*/ 5. 小结 关于执行效率,建议还是多按照index的方法来提高效果。Oracle有自带的explan road的方法,在执行之前,先看下执行计划路线,对写好的SQL tuned之后再执行。实在没办法了,再用parallel方法。Parallel比较邪恶,对开发者而言,不是好东西,会养成不好习惯,导致很多bad SQL不会暴漏,SQL Tuning的能力得不到提升。我有见过某些人create table后,从不create index或primary key,认为写SQL时加parallel就可以了。
    展开全文
  • 在windows里查看oracle进程线程信息

    千次阅读 2013-11-07 13:20:39
    在windows里查看oracle进程线程信息 2010-09-16 Tag: Viewing Threads To view information on Oracle Database threads using Oracle Administration Assistant for Windows, you must either enable Windows ...

    在windows里查看oracle进程线程信息

    2010-09-16        Viewing Threads

             To view information on Oracle Database threads using Oracle Administration Assistant for Windows, you must either enable Windows native authentication for the database or run utilityocfgutil.exe with arguments username and password. The utility stores the username and password in the following registry location:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleOraConfig

            When Windows native authentication is not enabled, Oracle Remote Configuration Agent retrieves the username and password from this registry key to log in to the database.

    To view information on Oracle Database threads using Oracle Administration Assistant for Windows(下面是说明该工具存放的路径):

    1. From the Start menu, select Programs, then select Oracle - HOME_NAME, then select Configuration and Migration Tools and then select Administration Assistant for Windows.

    2. Right-click the SID, where SID is a specific instance name, such asorcl.

    3. Choose Process Information.

      The Process Information dialog appears, listing name, type, user, thread ID, and CPU usage for each Oracle Database thread.

    4. To terminate a thread, select it and click Kill Thread.

    Description of procinfo.gif follows
    展开全文
  • 如何中断当前线程

    千次阅读 2017-12-29 22:38:08
    如何中断当前线程 中断当前线程有两种方式。第一种方式是通过调用线程的stop()方法,第二种方式通过调用interrupt()方法。  由于第一种方式是不安全的,所以本篇文章不做讨论,主要分享一下如何使用interrupt()...

    如何中断当前线程

    中断当前线程有两种方式。第一种方式是通过调用线程的stop()方法,第二种方式通过调用interrupt()方法。 
    由于第一种方式是不安全的,所以本篇文章不做讨论,主要分享一下如何使用interrupt()方法来中断线程。

    采用interrupt中止线程

    Thread类中提供了三个中断线程的方法,如下图: 
    这里写图片描述
    这里写图片描述
    方法详情: 
    - interrupt():中断当前线程。该方法仅设置当前线程的状态为中断,实际上并不中断线程的运行。如果要中断线程的运行,还需要当前线程自己中断 
    - interrupted():测试当前线程的状态是否被中断。使用这个方法会清除当前线程的状态。简言之,如果这个方法被调用了两次,那么第二次会返回false. 除非当前线程在第二次调用之前,第一次清除线程状态之后,再次再中断。 
    - isInterrupted():测试当前线程的状态是否被中断。这个方法与interrupted()这个方法最大的差异是isInterrupted()方法不会清除当前线程的状态。

    代码示例

    public class ThreadInterruptDemo implements Runnable {
    
        @Override
        public void run() {
    
    //        System.out.println("第一次调用Thread.interrupted()" + Thread.interrupted());
    //        System.out.println("第二次调用Thread.interrupted()" + Thread.interrupted());
    
            /**
             * isInterrupted()
             * 用来测试当前线程的运行状态
             * true:表示当前线程为中断状态
             * false:表示当前线程为运行状态
             * 可以通过这样的方法来中断线程运行
             */
            if (Thread.currentThread().isInterrupted()){
                System.out.println("由于线程状态是中断,所以return不再执行线程任务");
                return;
            }
    
            while (true) {
                try {
                    Thread.sleep(3L);
                    System.out.println("线程正在执行");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
            }
    
        }
    
        public static void main(String[] args) {
            Thread thread = new Thread(new ThreadInterruptDemo(), "ThreadInterruptDemo");
            // 开启线程
            thread.start();
    
            /**
             * 中断当前线程
             * 该方法仅设置当前线程的状态为中断,实际上并不中断线程的运行
             * 如果要中断线程的运行,还需要当前线程自己中断
             */
            thread.interrupt();
        }
    
    }
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    源代码链接: 
    https://github.com/myNameIssls/javase-study/blob/master/javase-multithreading/src/main/java/cn/tyrone/javase/thread/ThreadInterruptDemo.java 
    参考链接: 
    https://docs.oracle.com/javase/8/docs/api/ 
    https://www.cnblogs.com/w-wfy/p/6414801.html 
    http://blog.csdn.net/paincupid/article/details/47626819

    展开全文
  • Java使用多线程导入数据到Oracle

    千次阅读 2016-05-20 21:27:44
    Java使用多线程批量导入数据到Oracle

    Oracle中的设置

    多线程导入数据到Oracle中,如果是自己设置主键的值,那么肯定会遇到主键冲突的问题。例如线程A计算出的id为10(max(id) + 1),在A线程还没有完成导入时线程B用相同办法得到的id也是10,这时两个线程都请求插入数据时就会出现违反唯一约束条件的错误。

    为了解决这个问题,我想到两种解决方法。

    • java代码控制

    一种是自己设置一个类,在一开始计算出所有的id值存在一个数组中,用一个方法来每次获取一个id值返回给来索要的线程,用同步锁把这个方法锁起来,这样就可以保证每个线程获取的id值不一样。但是我想这样锁着方法肯定会影响速度,而且如果开多个程序同时导入的话会出现大问题。(个人水平有限,想到的方法缺陷肯定很大,因此不推荐用这种方法)

    • Oracle控制

    自己不管主键的增加,把这个任务交给Oracle来完成。Oracle端通过序列和触发器完成,在完成插入前,从序列中获取到下一个值设置成id。

    1.设置序列

    create sequence SEQ_TEST
    increment by 1
    start with 1
    nomaxvalue
    nocycle

    定义好sequence后,你就可以用currVal,nextVal取得值:
    CurrVal:返回 sequence的当前值
    NextVal:增加sequence的值,然后返回增加后sequence值

    2.设置触发器

    create or replace trigger TRG_TEST 
    before insert on TEST
    for each row
    begin
    select SEQ_TEST.nextval into :new.TEST_ID from dual;
    end;

    这个的意思就是在向test表插入数据前,用序列SEQ_TEST的下一个值代替test表的TEST_ID.

    至此,多线程导入数据可能会出现的主键冲突问题得以解决。

    Java代码

    其实代码思想很简单,就是将原始数据分成多个部分,每个线程分工导入不同的部分。我要实现的功能是将Excel表中的数据导入到Oracle中,因此我只需要先读取整个Excel,得到总行数,然后设置每个线程负责部分的开始位置和结束位置。贴代码:

    //每个线程的起始位置
    int startFirst = 1;
    int startSecond = Methods.totalRows / 3;
    int startThird = Methods.totalRows / 3 + Methods.totalRows / 3;
    
    //每个线程的步长
    int stepFirst = startSecond - 1 - 1;
    int stepSecond = startThird - startSecond - 1;
    int stepThird = Methods.totalRows - startThird;
    
    new Thread(new InsertThread(startFirst, stepFirst, Methods.orclConnectionFirst)).start();
    new Thread(new InsertThread(startSecond, stepSecond, Methods.orclConnectionSecond)).start();
    new Thread(new InsertThread(startThird, stepThird, Methods.orclConnectionThird)).start();

    注意这里一定要一个线程对应一个connection,公用一个connection达不到提速效果。此处的InsertThread就是自己定义个一个实现Runnable接口的类,在重写的run方法里进行插入Oracle操作,贴代码:

    public class InsertThread implements Runnable{
        private int startRow;
        private int step;
        private Connection connection;
    
        public InsertThread(int startRow, int step, Connection connection){
            this.startRow = startRow;
            this.step = step;
            this.connection = connection;
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            ...
            //这里进行插入操作
            ...
        }
    }
    展开全文
  • 查看oracle当前连接数和进程数

    千次阅读 2018-05-24 17:26:00
    查看数据库当前会话的连接数:  select count(*) from v$session; 查看数据库的并发连接数:  select count(*) from v$session where status='ACTIVE'; 查看当前数据库建立的会话情况:  sel...
  • 在UNIX或者LINUX中可以比较方便的管理ORACLE运行的进程,但在WINDOWS中ORACLE的每个会话是采用线程的机制进行管理,所以通过普通的任务管理器不能查看到具体的ORACLE用户线程。当然,通过专用的线程管理工具是可以...
  • 基于Oracle plsql的多线程编程架构 (附存储过程) 1年前 1413 作者介绍 冯守东,北京科讯华通科技发展有限公司高级项目经理。超12年Oracle开发及管理经验,多年运营商和政府企业级系统运维经验,曾获得东软最佳...
  • oracle 线程超过最大连接数

    千次阅读 2011-10-31 20:35:47
    查看当前有哪些用户正在使用数据 SELECT  osuser, a.username,cpu_time / executions / 1000000 || ' s ' , sql_fulltext,machine  from  v$session a, v$sqlarea b where  a.sql_address  = b....
  • Oracle查看数据库连接数基础命令

    千次阅读 2019-02-02 09:31:08
    ...查看当前的连接数 select count(*) from v$process 查询oracle的并发连接数 select count(*) from v$session where status='ACTIVE'; 查看不同用户的连接数 select username,count...
  • proc多线程访问ORACLE数据库

    千次阅读 2014-03-16 22:05:52
    全局变量和静态变量在线程之间是共享的,因此通常需要在程序中使用某种互斥机制来管理线程对这些变量的访问,互斥体Mutexes就是用来保证数据完整性的同步装置。     有关互斥体的更多讨论,参看多线程编程方面的...
  • oracle使用parallel并行,多线程查询

    千次阅读 2017-05-11 13:39:00
    insert into tmp (select /*parallel (a, 4)*/ * from plsuer.as_cdrindex_info_h partition(P_20170430) where temp = 10143); 这条语句是使用4个线程执行当前sql
  • 怎样查看oracle当前的连接数呢?只需要用下面的SQL语句查询一下就可以了。 #查看当前不为空的连接 select * from v$session where username is not null #查看不同用户的连接数 select username,count...
  • SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,   l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time   FROM v$locked_object l, all_objects o, v$sess
  • oracle查看和修改最大连接数

    千次阅读 2014-10-30 18:04:30
    oracle查看和修改最大连接数
  • python实现自动化报表(Oracle/plsql/Excel/多线程)

    千次阅读 多人点赞 2019-11-29 00:01:01
    python实现自动化报表(Oracle/plsql/Excel/多线程) 日常会有很多固定报表需要手动更新,本文将利用python实现多线程运行oracle代码,并利用xlwings包和numpy包将结果写入到指定excel模版(不改变模版内容),并...
  • 超12年Oracle开发及管理经验,多年运营商和政府企业级系统运维经验,曾获得东软最佳设计方案奖。熟悉Weblogic、TUXEDO、IBM WAS等相关中间件运维。熟悉MySQL、DB2、Informix等其他开源或商业数据,以及Openstack、...
  • Oracle查看进程执行sql

    万次阅读 2012-06-29 12:13:12
    Oracle数据库查看一个进程是如何执行相关的实际SQL语句 SELECT b.sql_text, sid, serial#, osuser, machine  FROM v$session a, v$sqlarea b  WHERE a.sql_address = b.address;  查询前台发出的SQL...
  • Oracle查看并修改最大连接数 Oracle查看并修改最大连接数 第一步,在cmd命令行,输入sqlplus 第二步,根据提示输入用户名与密码  1. 查看processes和sessions参数  SQL&gt; show parameter processes  ...
  • ORACLE查看进程并结束进程

    万次阅读 2018-12-10 18:08:24
    1)查看当前哪些job_name的州状态是EXECUTING。 从dba_datapump_jobs中选择job_name,state; 2)查看对应的SID: select sess.sid,   sess.serial#,   lo.oracle_username,   lo.os_user_name,...
  • 主要介绍了Oracle查看正在运行的SQL进程脚本分享,本文使用脚本实现了类似mysql show processlist命令的功能,需要的朋友可以参考下
  • oracle9.2.0.7 spring hibernate 环境。遇到java多线程模块连接数据库,产生连接占满的问题,查看数据库中,当前session正在执行的sql是,ALTER SESSION SET TIME_ZONE...
  • 介绍如何终止 Oracle 连接会话/进程和运行中的 SQL 语句,包括使用 GV$SESSION 和 GV$PROCESS 等视图查看会话和对应的系统进程信息,然后使用 ALTER SYSTEM KILL SESSION 或者 ALTER SYSTEM DISCONNECT SESSION 命令...
  • oracle 查看被锁的进程

    千次阅读 2019-07-22 14:29:23
    SELECT sid, serial#, username, osuser FROM v$session where sid in ( select session_id from v$locked_object); ALTER SYSTEM KILL SESSION '135,2373';//sid, serial#
  • Oracle-Oracle数据库结构

    万次阅读 2017-06-02 13:16:32
    再谈Oracle数据库结构之前写了一篇文章《Oracle-知识结构漫谈》 粗略的介绍了Oracle数据库接口,在这里再更加详细的描述一下,当做是对原有知识的巩固,温故知新。Oracle体系结构数据库的体系结构是从某一个角度来...
  • 使用oracle的存储过程,可以大大减少java程序代码的编写工作量,而且存储过程执行在数据库上,这样可以利用oracle的良好性能支持,极大地提高程序执行效率和稳定性。定时执行存储过程,就要用到job。 以下是常用...
  • 查看oracle数据库的连接数以及用户

    千次阅读 2016-03-03 11:12:12
    查看oracle数据库的连接数以及用户
  • Oracle查看并修改最大连接数 第一步,在cmd命令行,输入sqlplus 第二步,根据提示输入用户名与密码 1. 查看processes和sessions参数 SQL> show parameter processes NAME TYPE VALUE db_writer_processes ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 74,475
精华内容 29,790
关键字:

oracle查看当前线程