Cara memeriksa database Oracle untuk kueri yang berjalan lama

99

Aplikasi saya, yang menggunakan database Oracle, menjadi lambat atau sepertinya telah berhenti sama sekali.

Bagaimana cara mengetahui kueri mana yang paling mahal, sehingga saya dapat menyelidiki lebih lanjut?

Peter Mortensen
sumber

Jawaban:

134

Yang ini menunjukkan SQL yang saat ini "AKTIF": -

select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text
from v$sqltext_with_newlines t,V$SESSION s
where t.address =s.sql_address
and t.hash_value = s.sql_hash_value
and s.status = 'ACTIVE'
and s.username <> 'SYSTEM'
order by s.sid,t.piece
/

Ini menunjukkan kunci. Terkadang segala sesuatunya berjalan lambat, tetapi itu karena diblokir menunggu kunci:

select
  object_name, 
  object_type, 
  session_id, 
  type,         -- Type or system/user lock
  lmode,        -- lock mode in which session holds lock
  request, 
  block, 
  ctime         -- Time since current mode was granted
from
  v$locked_object, all_objects, v$lock
where
  v$locked_object.object_id = all_objects.object_id AND
  v$lock.id1 = all_objects.object_id AND
  v$lock.sid = v$locked_object.session_id
order by
  session_id, ctime desc, object_name
/

Ini bagus untuk menemukan operasi yang lama (mis. Scan tabel lengkap). Jika karena banyak operasi yang singkat, tidak akan ada yang muncul.

COLUMN percent FORMAT 999.99 

SELECT sid, to_char(start_time,'hh24:mi:ss') stime, 
message,( sofar/totalwork)* 100 percent 
FROM v$session_longops
WHERE sofar/totalwork < 1
/
WW.
sumber
1
Apakah ada cara untuk mematikan kueri seperti itu dengan aman jika berjalan selama lebih dari x menit. Terima kasih atas jawabannya meskipun @UmberFerrule
TommyT
2
@TommyT Anda dapat menggunakan alter system kill sessionseperti yang dijelaskan di sini: docs.oracle.com/cd/B28359_01/server.111/b28310/…
WW.
37

Coba ini, ini akan memberi Anda kueri yang sedang berjalan selama lebih dari 60 detik. Perhatikan bahwa ini mencetak beberapa baris per kueri yang berjalan jika SQL memiliki banyak baris. Lihat sid, serial # untuk melihat apa yang dimiliki bersama.

select s.username,s.sid,s.serial#,s.last_call_et/60 mins_running,q.sql_text from v$session s 
join v$sqltext_with_newlines q
on s.sql_address = q.address
 where status='ACTIVE'
and type <>'BACKGROUND'
and last_call_et> 60
order by sid,serial#,q.piece
Carlos A. Ibarra
sumber
saya menjalankan kueri ini dan saya diberi tahu bahwa pernyataan itu tidak valid
Itu valid. Saya mengujinya. Alat apa yang Anda gunakan untuk menanyakan? Mungkin bingung dengan tanda #. Coba ubah awal dan akhir seperti ini: "pilih * dari ... pesan menurut sid, q.piece"
Carlos A. Ibarra
2
Juga, Anda harus menjalankan ini dengan akun pribadi yang memiliki akses ke v $ sesi, v $ sqltext_with_newlines
WW.
Ini berfungsi tetapi mengembalikan teks SQL dari kueri dengan format yang sangat aneh.
Bernhard Döbler
7

v $ session_longops

If you look for sofar! = Totalwork Anda akan melihat yang belum selesai, tetapi entri tidak dihapus ketika operasi selesai sehingga Anda dapat melihat banyak riwayat di sana juga.

Gary Myers
sumber
Petunjuk bagus. Secara detail dibahas juga di sini .
dma_k
4
Step 1:Execute the query

column username format 'a10'
column osuser format 'a10'
column module format 'a16'
column program_name format 'a20'
column program format 'a20'
column machine format 'a20'
column action format 'a20'
column sid format '9999'
column serial# format '99999'
column spid format '99999'
set linesize 200
set pagesize 30
select
a.sid,a.serial#,a.username,a.osuser,c.start_time,
b.spid,a.status,a.machine,
a.action,a.module,a.program
from
v$session a, v$process b, v$transaction c,
v$sqlarea s
Where
a.paddr = b.addr
and a.saddr = c.ses_addr
and a.sql_address = s.address (+)
and to_date(c.start_time,'mm/dd/yy hh24:mi:ss') <= sysdate - (15/1440) -- running for 15 minutes
order by c.start_time
/   

Step 2: desc v$session

Step 3:select sid, serial#,SQL_ADDRESS, status,PREV_SQL_ADDR from v$session where sid='xxxx' //(enter the sid value)

Step 4: select sql_text from v$sqltext where address='XXXXXXXX';

Step 5: select piece, sql_text from v$sqltext where address='XXXXXX' order by piece;
mani22487
sumber
1

Anda dapat membuat laporan AWR (repositori beban kerja otomatis) dari database.

Jalankan dari baris perintah SQL * Plus:

SQL> @$ORACLE_HOME/rdbms/admin/awrrpt.sql

Baca dokumen yang terkait dengan cara menghasilkan & memahami laporan AWR. Ini akan memberikan gambaran lengkap tentang kinerja database dan masalah sumber daya. Setelah kita terbiasa dengan laporan AWR, akan sangat membantu untuk menemukan SQL Teratas yang menghabiskan sumber daya.

Selain itu, di 12C EM Express UI kita dapat menghasilkan AWR.

Ramki
sumber
0

Anda dapat memeriksa detail kueri yang berjalan lama seperti% selesai dan sisa waktu menggunakan kueri di bawah ini:

 SELECT SID, SERIAL#, OPNAME, CONTEXT, SOFAR, 
 TOTALWORK,ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE" 
 FROM V$SESSION_LONGOPS 
 WHERE OPNAME NOT LIKE '%aggregate%' 
       AND TOTALWORK != 0 
       AND SOFAR <> TOTALWORK;

Untuk daftar lengkap langkah pemecahan masalah, Anda dapat memeriksa di sini: Pemecahan masalah sesi yang berjalan lama

santosh tiwary
sumber
0
select sq.PARSING_SCHEMA_NAME, sq.LAST_LOAD_TIME, sq.ELAPSED_TIME, sq.ROWS_PROCESSED, ltrim(sq.sql_text), sq.SQL_FULLTEXT
  from v$sql sq, v$session se
 order by sq.ELAPSED_TIME desc, sq.LAST_LOAD_TIME desc;
akasha
sumber