程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> PLSQL_在執行1億條資料插入長腳本如何判斷需耗時多久v$sql / v$sqltext / v$sqlarea / v$sql_plan(案例)(監控SQL效率),sqlarea

PLSQL_在執行1億條資料插入長腳本如何判斷需耗時多久v$sql / v$sqltext / v$sqlarea / v$sql_plan(案例)(監控SQL效率),sqlarea

編輯:Oracle教程

PLSQL_在執行1億條資料插入長腳本如何判斷需耗時多久v$sql / v$sqltext / v$sqlarea / v$sql_plan(案例)(監控SQL效率),sqlarea


2014-08-27 BaoXinjian

一、摘要


當執行耗時時間較長的PLSQL時,有時需要查看程式運行的進度,目前已經處理了多少資料,還需處理多上資料

如果程式中專門的Log Module管控這一塊,問題就不太大

如果沒有這個這塊的管控,可能就需要通過跟蹤session,並查詢動態性能視圖,大概猜測出系統的運行情況,特別是undo表空間的變化

 

二、案例


案例:

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;

 

 

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'

 

Step4. 動態性能視圖2 - v$sql

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

 

Step5. 動態性能視圖3 - v$sqltext

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

 

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'

 

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

 

 

 

 

 

Step6. 通過確認undo空間的大小變化,確定已操作記錄條數

 

 

三、案例 - 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

 

********************作者:鮑新建********************

 

 

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


PLSQL執行sql的幾種方法

plsql很方便我們執行sql。下面就簡單介紹我常用的幾種(當然每次svn的分支也可以ant腳本自動執行某個文件下的所以sql文件)首先打開plsq的命令窗口1)執行sql文件(可以把需要執行的sql放一個文件中)輸入@'' 在單引號中輸入sql文件的路徑既可,比如D:\db下的jbpm.oracle.sql文件,見下圖(sql文件內容是select * from system_menu r where r.menu_name='銷售訂單' ;) 2)導入dmp文件。導入dmp文件前先刪除對應的user(下面以test_user為例)drop user test_user cascade;$ impdp system/test123@SYSTEM directory=data_pump_dir schemas=test_user dumpfile=date.DMP REMAP_SCHEMA=test_user:test_userTABLE_EXISTS_ACTION=replace logfile=imp.log;alter user test_user identified by 123456; 3)當需要重新從正式版數據庫到數據到測試版時,我們需要重啟測試版服務器或者kill掉應用程序服務器(比如tomcat)的session連接v$session 這張表可以查找到連接 oracle 數據庫的應用程序基本信息。因此可以通過該表來kill掉相應程序的session如果你想kill到連接到用戶 test_user ,可以執行下面的sql: select * from v$session r where r.USERNAME=‘test_user’ ;然後kill對應的session'就行了,參考下面的截圖: 比如你要kill 第一條;就執行下面的sql : alter system kill session '21,77' ; //因為sid, serial#.這2列很唯一的。 下面補充一些連接oracle的應用程序信息和oracle 操作 session 情況。 1.查找到連接 oracle 數據庫的應用程序基本信息。 select sid, serial#,username, --連接用戶名program, --應用程序名machine, --機器名osuser, --操作系統用戶logon_time --登錄時間from v$session; 2.如何查看session級的等待事件?當我們對數據庫的性能進行調整時,一個最重要的參考指標就是系統等待事 件。$system_event,v$session_event,v$session_wait這三個視圖裡記錄的就是系統級和session級的等待 事件,通過查詢這些視圖你可以發現數據庫的一些操作到底在等待什麼?是磁盤I/O,緩沖區忙,還是插鎖等等。通過如下sql你可以查詢你的每個應用程序到底在等待什麼,從而針對這些信息對數據庫的性能進行調整。Select s.username,s.program,s.status,se.event,se.total_waits,se.total_timeouts,se.time_waited,se.average_waitfrom v$session s, v$session_event seWhere s.sid=se.sid And se.e......余下全文>>
 

PLSQL執行sql的幾種方法

plsql很方便我們執行sql。下面就簡單介紹我常用的幾種(當然每次svn的分支也可以ant腳本自動執行某個文件下的所以sql文件)首先打開plsq的命令窗口1)執行sql文件(可以把需要執行的sql放一個文件中)輸入@'' 在單引號中輸入sql文件的路徑既可,比如D:\db下的jbpm.oracle.sql文件,見下圖(sql文件內容是select * from system_menu r where r.menu_name='銷售訂單' ;) 2)導入dmp文件。導入dmp文件前先刪除對應的user(下面以test_user為例)drop user test_user cascade;
$ impdp system/test123@SYSTEM directory=data_pump_dir schemas=test_user dumpfile=date.DMP REMAP_SCHEMA=test_user:test_userTABLE_EXISTS_ACTION=replace logfile=imp.log;
alter user test_user identified by 123456; 3)當需要重新從正式版數據庫到數據到測試版時,我們需要重啟測試版服務器或者kill掉應用程序服務器(比如tomcat)的session連接v$session 這張表可以查找到連接 oracle 數據庫的應用程序基本信息。因此可以通過該表來kill掉相應程序的session如果你想kill到連接到用戶 test_user ,可以執行下面的sql: select * from v$session r where r.USERNAME=‘test_user’ ;然後kill對應的session'就行了,參考下面的截圖: 比如你要kill 第一條;就執行下面的sql : alter system kill session '21,77' ; //因為sid, serial#.這2列很唯一的。 下面補充一些連接oracle的應用程序信息和oracle 操作 session 情況。 1.查找到連接 oracle 數據庫的應用程序基本信息。 select sid, serial#,
username, --連接用戶名
program, --應用程序名
machine, --機器名
osuser, --操作系統用戶
logon_time --登錄時間
from v$session; 2.如何查看session級的等待事件?當我們對數據庫的性能進行調整時,一個最重要的參考指標就是系統等待事 件。$system_event,v$session_event,v$session_wait這三個視圖裡記錄的就是系統級和session級的等待 事件,通過查詢這些視圖你可以發現數據庫的一些操作到底在等待什麼?是磁盤I/O,緩沖區忙,還是插鎖等等。通過如下sql你可以查詢你的每個應用程序到底在等待什麼,從而針對這些信息對數據庫的性能進行調整。
Select s.username,s.program,s.status,se.event,se.total_waits,se.total_timeouts,se.time_waited,se.average_wait
from v$session s, v$session_event se
Where s.sid=se.sid And se.e......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved