查看: 79|回复: 0

[数据库编程] 存储过程执行时间过长如何掐掉

[复制链接]
  • TA的每日心情
    难过
    2016-3-1 09:50
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2019-7-2 12:01:33 | 显示全部楼层 |阅读模式
    前文再续,说我最近被一存储过程折磨。
    为啥说折磨呢。主要是很难调试。数据库的强项不在于编码,存储过程写的过程比较别扭,其实运行起来更坑爹。出了问题,你很难知道是哪一部分引起的。如果这个存储过程执行的时间很长,就更加痛苦了,是哪一部分慢嘛?
    另外,由于执行时间长,实在等不下去,就想中途掐掉。要怎么搞?
    ?
    1

    2

    3

    4

    5

    6

    7

    8

    [size=1em]--获得SID
    [size=1em]select [size=1em]* [size=1em]from [size=1em]v$access [size=1em]where [size=1em]object=[size=1em]'存储过程名'[size=1em];

    [size=1em]--获得SID,serial#
    [size=1em]select [size=1em]sid,serial#,lockwait,status,wait_time,state [size=1em]from [size=1em]v$session [size=1em]where [size=1em]sid=[size=1em]'SID'[size=1em];

    [size=1em]--杀掉进程
    [size=1em]alter [size=1em]system kill session [size=1em]'SID,serial#'[size=1em];



    如果是存储过程托付给了JOB执行,要中途停掉JOB该如何处理呢?
    ?
    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    [size=1em]--首先要关闭JOB计划
    [size=1em]begin
    [size=1em]  [size=1em]dbms_job.broken(JOB编号,[size=1em]true[size=1em]);
    [size=1em]  [size=1em]commit[size=1em];
    [size=1em]end[size=1em];

    [size=1em]--检查JOB有没有正在运行,停止计划对它没有影响
    [size=1em]--获得SID
    [size=1em]select [size=1em]* [size=1em]from [size=1em]dba_jobs_running;

    [size=1em]--获得SID,serial#
    [size=1em]select [size=1em]sid,serial#,lockwait,status,wait_time,state [size=1em]from [size=1em]v$session [size=1em]where [size=1em]sid=[size=1em]'SID'[size=1em];

    [size=1em]--杀掉进程
    [size=1em]alter [size=1em]system kill session [size=1em]'SID,serial#'[size=1em];



    有时候,存储过程甚至不能被编译,那么有可能是存储过程正在运行,或者其处理的表被锁定。有以下语句可供参考:
    ?
    [size=1em]1

    [size=1em]2

    [size=1em]3

    [size=1em]4

    [size=1em]5

    [size=1em]6

    [size=1em]7

    [size=1em]8

    [size=1em]9

    [size=1em]10

    [size=1em]11

    [size=1em]12

    [size=1em]13

    [size=1em]14

    [size=1em]15

    [size=1em][size=1em]--存储过程无法编译
    [size=1em]SELECT V.OSUSER,  V.PROCESS, V.PROGRAM,v.MACHINE,V.TERMINAL,
    [size=1em]V.MODULE,V.USERNAME,V.STATUS, V.SID,V.SERIAL#,
    [size=1em]       'alter system kill session ''' || V.sid || ',' || V.SERIAL# || ''';' as KILL_SESSION,
    [size=1em]       V.PADDR
    [size=1em]  FROM V$SESSION V
    [size=1em] WHERE V.USERNAME LIKE '%用户名%'
    [size=1em]   AND V.STATUS in( 'INACTIVE','ACTIVE')
    [size=1em]   and v.PROGRAM = 'plsqldev.exe';

    [size=1em] SELECT object_name, machine, s.sid, s.serial# ,s.status,
    [size=1em] 'alter system kill session ''' || s.sid || ',' || s.SERIAL# || ''';' as KILL_SESSION  
    [size=1em]FROM gv$locked_object l, dba_objects o, gv$session s
    [size=1em]WHERE l.object_id = o.object_id
    [size=1em]AND l.session_id = s.sid;



    您需要登录后才可以回帖 登录 | 注册青鸟豆号

    本版积分规则

    Copyright 1999-2019 Beijing Aptech Beida Jade Bird Information Technology Co.,Ltd

    北大青鸟IT教育 北京阿博泰克北大青鸟信息技术有限公司 版权所有

    京ICP备11045574号-3 京公网安备11010802013845号

    快速回复 返回顶部 返回列表