Bagaimana Anda menunjukkan eksekusi SQL pada database Oracle?

26

Bagaimana Anda bisa menunjukkan SQL yang sedang dijalankan pada oracle db?

Informasi tambahan yang akan berguna akan mencakup pengguna, id sesi, dll.

Clarkey
sumber

Jawaban:

35

Sebagian besar info tersedia dalam sesi v $ ... dan Teks SQL dapat diambil dari v $ sql atau v $ sqltext_with_newlines ...

Berikut adalah pertanyaan yang sering saya gunakan dalam format In-flight SQL, berjalan paling lama di atas.

-- 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;
David Mann
sumber
apa arti dari In Flight SQL?
toha
In-flight = saat ini berjalan pada database oracle, atau dalam hal ini saat ini tersedia dalam v $ sesi dan status = 'ACTIVE'
David Mann
9

Jawaban yang bagus ditemukan di sini .

Jalankan sql berikut:

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;

Jika output tidak dapat dibaca, ubah LINESIZE (ambil dari sini ):

SET LINESIZE 20000

Jika sql di atas tidak berfungsi, Anda mungkin harus masuk sebagai sysdba:

sqlplus '/as sysdba'
Clarkey
sumber
Tautan Anda ke jawaban Baik sudah mati
Gerrat
@ Gerrat Saya memperbarui tautan ke arsip yang di-cache.
Clarkey