คุณจะแสดง SQL ที่กำลังทำงานบน oracle db ได้อย่างไร?
ข้อมูลเพิ่มเติมที่จะเป็นประโยชน์จะรวมถึงผู้ใช้รหัสเซสชัน ฯลฯ
คุณจะแสดง SQL ที่กำลังทำงานบน oracle db ได้อย่างไร?
ข้อมูลเพิ่มเติมที่จะเป็นประโยชน์จะรวมถึงผู้ใช้รหัสเซสชัน ฯลฯ
คำตอบ:
ข้อมูลส่วนใหญ่มีอยู่ในเซสชัน $ v ... และสามารถดึงข้อความ SQL จาก v $ sql หรือ v $ sqltext_with_newlines ...
นี่คือแบบสอบถามที่ฉันมักใช้รูปแบบ In-flight SQL ที่ยาวที่สุดที่ทำงานอยู่ด้านบน
-- In Flight SQL
SELECT nvl(ses.username,'ORACLE PROC')||' ('||ses.sid||')' USERNAME,
SID,
MACHINE,
REPLACE(SQL.SQL_TEXT,CHR(10),'') STMT,
ltrim(to_char(floor(SES.LAST_CALL_ET/3600), '09')) || ':'
|| ltrim(to_char(floor(mod(SES.LAST_CALL_ET, 3600)/60), '09')) || ':'
|| ltrim(to_char(mod(SES.LAST_CALL_ET, 60), '09')) RUNT
FROM V$SESSION SES,
V$SQLtext_with_newlines SQL
where SES.STATUS = 'ACTIVE'
and SES.USERNAME is not null
and SES.SQL_ADDRESS = SQL.ADDRESS
and SES.SQL_HASH_VALUE = SQL.HASH_VALUE
and Ses.AUDSID <> userenv('SESSIONID')
order by runt desc, 1,sql.piece;
ดำเนินการ sql ต่อไปนี้:
select x.sid
,x.serial#
,x.username
,x.sql_id
,x.sql_child_number
,optimizer_mode
,hash_value
,address
,sql_text
from v$sqlarea sqlarea
,v$session x
where x.sql_hash_value = sqlarea.hash_value
and x.sql_address = sqlarea.address
and x.username is not null;
หากเอาต์พุตไม่สามารถอ่านได้ให้เปลี่ยน LINESIZE (รับจากที่นี่ ):
SET LINESIZE 20000
หาก sql ด้านบนใช้งานไม่ได้คุณอาจต้องเข้าสู่ระบบเป็น sysdba:
sqlplus '/as sysdba'