session執行sql
A. 怎麼找到當前session正在執行的sql
1、查看全部session中SQL:
spool d:\oracle_realtime_sqllist.txt
SET LINESIZE 100
SET PAGESIZE 50000
COL USERNAME FOR A10
COL machine FOR A15
COL sql_text FOR A50
select
substr(s.username,1,18) username,
s.sid,s.serial#,s.machine,y.sql_text
from v$session s,v$process p,v$transaction t,v$rollstat r,v$rollname n,v$sql y
where s.paddr = p.addr
and s.taddr = t.addr (+)
and t.xisn = r.usn (+)
and r.usn = n.usn (+)
and s.username is not null
and s.sql_address=y.address
--and s.sid=56
order by s.sid,s.serial#,s.username,s.status
;
spool off
2、查看某個時,檢索條件中指定s.sid值即可。
SET LINESIZE 100
SET PAGESIZE 50000
COL USERNAME FOR A10
COL machine FOR A15
COL sql_text FOR A50
select
substr(s.username,1,18) username,
s.sid,s.serial#,s.machine,y.sql_text
from v$session s,v$process p,v$transaction t,v$rollstat r,v$rollname n,v$sql y
where s.paddr = p.addr
and s.taddr = t.addr (+)
and t.xisn = r.usn (+)
and r.usn = n.usn (+)
and s.username is not null
and s.sql_address=y.address
and s.sid=&sid
order by s.sid,s.serial#,s.username,s.status
;
3、根據操作系統進程號查看某個session。
select
substr(s.username,1,18) username,
s.sid,s.serial#,s.machine,y.sql_text
from v$session s,v$process p,v$transaction t,v$rollstat r,v$rollname n,v$sql y,v$process z
where s.paddr = p.addr
and s.taddr = t.addr (+)
and t.xisn = r.usn (+)
and r.usn = n.usn (+)
and s.username is not null
and s.sql_address=y.address
and s.paddr = z.addr
and z.spid = &pid
order by s.sid,s.serial#,s.username,s.status
;
B. 如何查詢session執行的歷史sql語句
如何知道一個session都執行過哪些SQL語句?(查看當前比較容易,歷史的呢?怎麼復原sql的執行場景——事務關系、執行序列、單SQL還是存儲過程)
【方法一】查詢v$sqltext、v$sqlarea、v$sqlstats視圖
select * from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('schema') order by t.LAST_ACTIVE_TIME desc;
#對v$sqltext、v$sqlarea查看的是shared pool中的SQL,其時間索引是其解析歷史,因為共享的問題這個查詢可能並不能完整地反映出執行的歷史。
#v$sqlstats信息保留時間比v$sql、v$sqltext、v$sqlarea長,及時SQL已經換出shared pool仍然可查到
【方法二】
聯合v$active_session_history和v$sqlarea
#v$active_session_history 這個表只是個取樣數據,按秒進行,只有在那一秒采樣點處於on cpu或非idle等待的session統計在內。所以可能會不全,有些執行很短的SQL會忽略。這個視圖無法還原完整的session歷史。
#v$sqlarea中有執行過的SQL語句,但並無到session的關聯信息,v$session中只關聯了當前的sql,所以也不行。
查看視圖:dba_hist_sqlstats、dba_hist_sqltext(歷史數據)
C. sql預處理和session
sql預處理對象
PreparedStatement pst = null;
connection.prepareStatement(sql);
Object[] pars = {name,pwd};
for(int i =0 ;i<pars.lenth;i++){
pst.setObject(i+1,pars[i]);
}
public int update(String sql,Object[] pars){
getCon();
int x = 0;
//sql預處理對象 PreparedStatement pst = null;
try {
pst = connection.prepareStatement(sql);
//pst.setString(1,user.getName());
//pst.setString(2,user.getPwd()); for(int i =0 ;i<pars.length;i++){
pst.setObject(i+1,pars[i]);
}
x = pst.executeUpdate();
}catch(SQLExeception e){
e.printStackTrace()
}
return x;
}
執行失敗返回-1 執行成功有多少返回多少
session.getsession()
session.setsession()
D. 怎麼找到當前session正在執行的sql
selectsid,v$session.serial#,v$process.spid,v$session.username,last_call_et,status,LOCKWAIT,machine,logon_time,sql_textfromv$session,v$process,v$sqlareawherepaddr=addrandsql_hash_value=hash_valueandv$session.usernameisnotnullandsql_textnotlike'%session%'andstatus='ACTIVE'orderbylast_call_etdesc;
廉瀧潛培薛朝汾店馳比注嶸聲麻蒴峙藩問分駟陸
E. 怎麼查詢一個session執行的所有sql
方法一】查詢v$sqltext、v$sqlarea、v$sqlstats視圖 select * from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('schema') order by t.LAST_ACTIVE_TIME desc; #對v$sqltext、v$sqlarea查看的是shared pool中的SQL
F. hive 使用同一個session執行不同的sql注意事項
最近在hue上開多個窗口執行不同的sql的時候,發現如果在某個窗口裡面設置某些properties的時候(比如 set spark.executor.memory=10g),會導致其他窗口裡面執行的sql失敗。
註: 我們使用spark作為默認的執行引擎 (即 set hive.execution.engine=spark)
原因是因為 當你在hue上用某個賬戶登錄之後,執行第一個sql的時候,hue會get 到hive的一個connection,hive也會在yarn上創建一個spark的應用,獲得到一個session。而多窗口執行sql其實是共用的這一個session。所以如果你在同一個session裡面做查詢的時候是沒問題的,你可以同時跑很多的sql,但是如果你set properties的時候就會有問題。因為session是在創建的時候載入properties的,所以如果你set properties的話就會需要重新創建這個session。也就是說會斷開老的 session創建一個新的session,那麼你在跑的其他窗口的查詢就會失敗。