2014-08-27 Created By BaoXinjian

PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_oracle一、摘要


当执行耗时时间较长的PLSQL时,有时需要查看程式运行的进度,目前已经处理了多少资料,还需处理多上资料

如果程式中专门的Log Module管控这一块,问题就不太大

如果没有这个这块的管控,可能就需要通过跟踪session,并查询动态性能视图,大概猜测出系统的运行情况,特别是undo表空间的变化


PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_oracle_02二、案例


案例:

Step1. 创建测试表bxj_test


create table bxj_test 
(
invoice_id number,
invoice_num varchar2(100),
total number,
company varchar2(100),
description varchar2(500),
creation_date date
)

Step2. 创建测试程式,杀入1以一条


declare
i integer;
begin
for i in 1 .. 100000000 loop
insert into apps.bxj_test
values
(i,
'INVOICENUM_' || lpad(to_char(i), 10, '0'),
dbms_random.value(1, 100000000),
'Gavin Corporation',
'Invoice Description' || to_char(sysdate, 'YYYYMMDD HH24:MI:SS'),
sysdate);
end loop;
commit;
end;


 PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_oracle_03


Step3. 动态性能视图1  -> v$session


SELECT   sid,
--serial#,
--username,
--command,
--status,
--osuser,
--sql_address,
--sql_hash_value,
sql_id,
sql_exec_start,
prev_sql_id,
prev_exec_start,
event,
wait_class,
state,
sql_trace,
program
FROM v$session
WHERE terminal = 'GAVIN-PC'
AND sid = 373
AND status = 'ACTIVE'
AND program like 'plsqldev.exe'


PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_oracle_04


Step4. 动态性能视图2 - v$sql


select sql_id, sql_text, executions, cpu_time, elapsed_time from v$sql
where sql_id = '3rf19a6yjvz18'


PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_oracle_05


Step5. 动态性能视图3 - v$sqltext


select * from v$sqltext
where sql_id = '3rf19a6yjvz18'
order by piece


PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_PLSQL_06


Step6. 动态性能视图4 - v$sql_plan


select sql_id, operation, optimizer, id, parent_id, depth, position, search_columns, cost from v$sql_plan
where sql_id = '3rf19a6yjvz18'


PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_sql_07


Step7. 其他动态性能视图


select * from V$SESSION_LONGOPS
where 1=1
and target = 'APPS.BXJ_TEST_INVOICE'
and sid = 38

select * from V$SESSION_WAIT
where sid = 24

select * from V$SESSION_WAIT_CLASS

select * from V$SESS_IO
where sid = 24

select * from V$SESSION_EVENT
where sid = 24



PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_sql_08


PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_PLSQL_09


PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_PLSQL_10


PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_oracle_11


Step6. 通过确认undo空间的大小变化,确定已操作记录条数

 PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_sql_12


PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)_sql_13三、案例 - nohup转入后台运行脚本


nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。

在注销后使用 nohup 命令运行后台中的程序。

要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。


1. 重定向日志文件

如 果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。


2. 主要概念

(1). 功能:使进程在退出登录后仍旧继续执行。

(2). 格式:$ nohup <程序名>  &

(3). 结果:如果程序program有结果输出,输出结果将会被保存到当前目录下的一个文件名为 nohup.out的文件中,如果用户在当前目录没有写的权限, 则结果将会被保存到用户主目录下的nohup.out文件中。

(4). 查看:jobs


3. 例子


[gavinprod]> cat create_temp_table.sql
create table bxj_test_no as
select * from mtl_material_transactions;
[gavinprod]> nohup sqlplus / @/home/oracle/gavin/create_temp_table.sql > /home/oracle/gavin/create_temp_table.log 2>&1 &

[gavinprod]> ps -ef | grep sql
oracle 18777 17579 0 01:33:18 pts/3 0:00 sqlplus / @/home/oracle/gavin/create_temp_table.sql
oracle 18880 17579 0 01:33:34 pts/3 0:00 grep sql

Thanks and Regards

参考:http://cc59.itpub.net/post/1845/286133