Cách kiểm tra cơ sở dữ liệu Oracle để tìm các truy vấn chạy dài


98

Ứng dụng của tôi, sử dụng cơ sở dữ liệu Oracle, chạy chậm hoặc có vẻ như đã dừng hoàn toàn.

Làm cách nào để biết truy vấn nào đắt nhất, để tôi có thể điều tra thêm?

Câu trả lời:


134

Cái này hiển thị SQL hiện là "ACTIVE": -

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
/

Điều này cho thấy ổ khóa. Đôi khi mọi thứ diễn ra chậm, nhưng đó là do nó bị chặn khi chờ khóa:

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
/

Đây là cách tốt để tìm các thao tác dài (ví dụ như quét toàn bộ bảng). Nếu đó là do nhiều thao tác ngắn, không có gì sẽ hiển thị.

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
Có cách nào để loại bỏ các truy vấn như vậy một cách an toàn nếu chúng chạy trong hơn x phút. Cảm ơn câu trả lời mặc dù @UmberFerrule
TommyT

2
@TommyT Bạn có thể sử dụng alter system kill sessionnhư được mô tả tại đây: docs.oracle.com/cd/B28359_01/server.111/b28310/…
WW.

37

Hãy thử điều này, nó sẽ cung cấp cho bạn các truy vấn hiện đang chạy trong hơn 60 giây. Lưu ý rằng nó in nhiều dòng cho mỗi truy vấn đang chạy nếu SQL có nhiều dòng. Nhìn vào sid, serial # để xem những gì thuộc về nhau.

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

tôi chạy truy vấn này và nó cho tôi biết là tuyên bố không hợp lệ

Nó hợp lệ. Tôi đã thử nghiệm nó. Bạn đang sử dụng công cụ nào để truy vấn? Nó có thể bị nhầm lẫn với dấu #. Hãy thử thay đổi khi bắt đầu và kết thúc như thế này: "select * from ... Để bởi sid, q.piece"
Carlos A. Ibarra

2
Ngoài ra, bạn sẽ cần phải chạy điều này với tài khoản riêng có quyền truy cập vào v $ session, v $ sqltext_with_newlines
WW.

Điều này hoạt động nhưng trả về văn bản SQL của truy vấn được định dạng rất lạ.
Bernhard Döbler

7

v $ session_longops

Nếu bạn tìm kiếm sofar! = Totalwork, bạn sẽ thấy những cái chưa hoàn thành, nhưng các mục nhập sẽ không bị xóa khi hoạt động hoàn thành nên bạn cũng có thể xem nhiều lịch sử ở đó.


Gợi ý tốt. Cũng được thảo luận chi tiết tại đây .
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

Bạn có thể tạo báo cáo AWR (kho lưu trữ khối lượng công việc tự động) từ cơ sở dữ liệu.

Chạy từ dòng lệnh SQL * Plus:

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

Đọc tài liệu liên quan đến cách tạo và hiểu báo cáo AWR. Nó sẽ cung cấp một cái nhìn đầy đủ về hiệu suất cơ sở dữ liệu và các vấn đề tài nguyên. Khi chúng ta đã quen thuộc với báo cáo AWR, sẽ rất hữu ích nếu tìm thấy SQL hàng đầu đang tiêu tốn tài nguyên.

Ngoài ra, trong giao diện người dùng EM Express 12C, chúng tôi có thể tạo AWR.


0

Bạn có thể kiểm tra các chi tiết truy vấn dài hạn như% đã hoàn thành và thời gian còn lại bằng cách sử dụng truy vấn dưới đây:

 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;

Để biết danh sách đầy đủ các bước khắc phục sự cố, bạn có thể xem tại đây: Khắc phục sự cố các phiên chạy dài


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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.