Uzun süren sorgular için Oracle veritabanı nasıl kontrol edilir


100

Oracle veritabanı kullanan uygulamam yavaşlıyor veya tamamen durmuş gibi görünüyor.

Hangi sorguların en pahalı olduğunu nasıl öğrenebilirim, böylece daha fazla araştırma yapabilirim?

Yanıtlar:


138

Bu, şu anda "AKTİF" olan SQL'i gösterir: -

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
/

Bu kilitleri gösterir. Bazen işler yavaş ilerler, ancak kilit beklemenin engellenmesi nedeniyle:

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
/

Bu, uzun işlemleri bulmak için iyidir (örn. Tam tablo taramaları). Çok sayıda kısa işlemden kaynaklanıyorsa, hiçbir şey görünmeyecektir.

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
/

1
Bu tür sorguları x dakikadan fazla çalıştırırlarsa güvenli bir şekilde sonlandırmanın bir yolu var mı? Cevabınız için teşekkürler @UmberFerrule
TommyT

2
@TommyT alter system kill sessionBurada açıklandığı gibi kullanabilirsiniz : docs.oracle.com/cd/B28359_01/server.111/b28310/…
WW.

37

Bunu deneyin, size şu anda 60 saniyeden fazla çalışan sorguları verecektir. SQL'de birden çok satır varsa, çalışan sorgu başına birden çok satır yazdırdığını unutmayın. Neyin birbirine ait olduğunu görmek için sid, seri numarasına bakın.

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

bu sorguyu çalıştırıyorum ve bana geçersiz ifade olduğunu söylüyor

Bu geçerlidir. Test ettim. Sorgulamak için hangi aracı kullanıyorsunuz? # İşaretiyle karıştırılıyor olabilir. Başını ve sonunu böyle değiştirmeyi deneyin: "sid, q.piece tarafından gelen ... sırayla seçmek *"
Carlos A. Ibarra

2
Ayrıca, bunu v $ session, v $ sqltext_with_newlines
WW

Bu çalışır ancak sorgunun SQL metnini çok garip bir şekilde biçimlendirilmiş olarak döndürür.
Bernhard Döbler

7

v $ session_longops

Sofar! = Totalwork ararsanız, tamamlanmamış olanları görürsünüz, ancak işlem tamamlandığında girişler kaldırılmaz, böylece orada da birçok geçmişi görebilirsiniz.


Güzel ipucu. Ayrıca burada ayrıntılı olarak tartışılmıştır .
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;

1

Veritabanından bir AWR (otomatik iş yükü deposu) raporu oluşturabilirsiniz.

SQL * Plus komut satırından çalıştırın:

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

Bir AWR raporunun nasıl oluşturulacağı ve anlaşılacağıyla ilgili belgeyi okuyun. Veritabanı performansı ve kaynak sorunlarının eksiksiz bir görünümünü verecektir. AWR raporuna aşina olduktan sonra, kaynakları tüketen En İyi SQL'i bulmak faydalı olacaktır.

Ayrıca, 12C EM Express kullanıcı arayüzünde bir AWR oluşturabiliriz.


0

Aşağıdaki sorguyu kullanarak tamamlanan% ve kalan süre gibi uzun süredir devam eden sorgu ayrıntılarını kontrol edebilirsiniz:

 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;

Sorun giderme adımlarının tam listesi için burayı kontrol edebilirsiniz: Uzun süren oturumlarda sorun giderme


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;

0

5 saniyeden uzun süren sorguları bulmak için v $ sql_monitor görünümünü kullanabilirsiniz. Bu, yalnızca Oracle'ın Kurumsal sürümlerinde mevcut olabilir. Örneğin bu sorgu, TEST_APP hizmetimden yavaş çalışan sorguları belirleyecektir:

select to_char(sql_exec_start, 'dd-Mon hh24:mi'), (elapsed_time / 1000000) run_time,
       cpu_time, sql_id, sql_text 
from   v$sql_monitor
where  service_name = 'TEST_APP'
order  by 1 desc;

Elapsed_time'ın mikrosaniye cinsinden olduğuna dikkat edin, bu nedenle / 1000000 daha okunabilir bir şey elde etmek için

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.