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?
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?
Jawaban:
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
/
alter system kill sessionseperti yang dijelaskan di sini: docs.oracle.com/cd/B28359_01/server.111/b28310/…
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
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.
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;
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.
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