Oracle: Có công cụ nào để theo dõi các truy vấn, như Profiler cho máy chủ sql không? [đóng cửa]


84

tôi làm việc với máy chủ sql, nhưng tôi phải chuyển sang ứng dụng với Oracle DB. để theo dõi các truy vấn ứng dụng của tôi, trong Sql Server, tôi sử dụng công cụ Profiler tuyệt vời. có cái gì tương đương cho Oracle không?


38
Tại sao bạn chấp nhận một câu trả lời sai? Giải thích kế hoạch KHÔNG làm những gì trình biên dịch làm. Nó hoàn toàn không liên quan.
Jasmine

1
bạn đã tìm thấy công cụ tốt nhất như thế sql server profilernào? bạn đang sử dụng cái gì bây giờ?
Shahid Ghafoor

Tôi đã viết một cuốn sách về truy tìm các ứng dụng Oracle. Nó có sẵn ở dạng PDF tại method-r.com .
Cary Millsap

Vui lòng kiểm tra hồ sơ oracle trong dbForge Studio cho Oracle từ Devart.
Devart

Rất nhiều câu trả lời dưới đây, nhưng không ai lạ đã đề cập đến một trong Oracle hai profilers cho PL / SQL: DBMS_PROFILER(cơ bản và hạn chế, nhưng siêu tiện lợi) hoặc DBMS_HPROF(chính xác hơn nhưng đòi hỏi phải thiết lập nhiều hơn). Tuy nhiên, tôi không biết SQL Server nên có thể nó có một khái niệm về cấu hình khác với một trong hai gói Oracle và những gì bạn muốn giống như truy tìm trong Oracle.
William Robertson

Câu trả lời:


22

Bạn có thể sử dụng Oracle Enterprise Manager để theo dõi các phiên hoạt động, với truy vấn đang được thực thi, kế hoạch thực thi, khóa, một số thống kê và thậm chí là thanh tiến trình cho các tác vụ dài hơn.

Xem: http://download.oracle.com/docs/cd/B10501_01/em.920/a96674/db_admin.htm#1013955

Chuyển đến Phiên bản -> phiên và xem Tab SQL của mỗi phiên.

Có nhiều cách khác. Người quản lý doanh nghiệp chỉ đặt những màu sắc đẹp đẽ những gì đã có sẵn trong các chế độ xem đặc biệt như những gì được ghi lại ở đây: http://www.oracle.com/pls/db92/db92.catalog_views?remark=homepage

Và, tất nhiên, bạn cũng có thể sử dụng công cụ Giải thích PLAN FOR, TRACE và rất nhiều cách khác để công cụ hóa. Có một số báo cáo trong trình quản lý doanh nghiệp về các Truy vấn SQL đắt nhất. Bạn cũng có thể tìm kiếm các truy vấn gần đây được lưu trên bộ nhớ cache.


17

Tôi đã tìm thấy một giải pháp dễ dàng

Bước 1. kết nối với DB với người dùng quản trị bằng PLSQL hoặc sqldeveloper hoặc bất kỳ giao diện truy vấn nào khác

Bước 2. chạy script dưới đây; trong cột S.SQL_TEXT, bạn sẽ thấy các truy vấn được thực thi

SELECT            
 S.LAST_ACTIVE_TIME,     
 S.MODULE,
 S.SQL_FULLTEXT, 
 S.SQL_PROFILE,
 S.EXECUTIONS,
 S.LAST_LOAD_TIME,
 S.PARSING_USER_ID,
 S.SERVICE                                                                       
FROM
 SYS.V_$SQL S, 
 SYS.ALL_USERS U
WHERE
 S.PARSING_USER_ID=U.USER_ID 
 AND UPPER(U.USERNAME) IN ('oracle user name here')   
ORDER BY TO_DATE(S.LAST_LOAD_TIME, 'YYYY-MM-DD/HH24:MI:SS') desc;

Vấn đề duy nhất với điều này là tôi không thể tìm ra cách hiển thị các giá trị tham số đầu vào (cho các lệnh gọi hàm), nhưng ít nhất chúng ta có thể xem những gì được chạy trong Oracle và thứ tự của nó mà không cần sử dụng một công cụ cụ thể.


2
Bạn có thể thêm S.SQL_FULLTEXT nếu văn bản truy vấn hơn 1000 ký tự, vì SQL_TEXT bị cắt tại thời điểm đó.
Tridus

2
Bạn không nên đặt hàng trước LAST_ACTIVE_TIME vì đó là VARCHAR2 (19). Sử dụng cái này thay thế: ORDER BY TO_DATE (S.LAST_LOAD_TIME, 'YYYY-MM-DD / HH24: MI: SS') desc
Igor Krupitsky

1
ORA-00942: bảng hoặc dạng xem không tồn tại 00942. 00000 - "bảng hoặc dạng xem không tồn tại" * Nguyên nhân: * Hành động: Lỗi tại Dòng: 11 Cột: 6 Điều đó có nghĩa là tôi không có đặc quyền quản trị viên?
toha

Điều này không bao gồm các giá trị tham số. nếu bạn cũng muốn có điều đó, hãy xem tại: stackoverflow.com/a/14217618/6339469
HamedH

16
alter system set timed_statistics=true

--hoặc là

alter session set timed_statistics=true --if want to trace your own session

- phải đủ lớn:

select value from v$parameter p
where name='max_dump_file_size' 

- Tìm hiểu sid và số serial của phiên bạn quan tâm:

 select sid, serial# from v$session
 where ...your_search_params...

--bạn có thể bắt đầu theo dõi với sự kiện 10046, tham số thứ tư đặt mức theo dõi (12 là mức lớn nhất):

 begin
    sys.dbms_system.set_ev(sid, serial#, 10046, 12, '');
 end;

- tắt theo dõi với cài đặt mức 0:

begin
   sys.dbms_system.set_ev(sid, serial#, 10046, 0, '');
end;

/ * mức có thể: 0 - tắt 1 - mức tối thiểu. Giống như set sql_trace = true 4 - giá trị biến ràng buộc được thêm vào tệp theo dõi 8 - lượt chờ được thêm 12 - cả giá trị biến ràng buộc và sự kiện chờ đều được thêm * /

--same nếu bạn muốn theo dõi phiên của riêng mình với cấp độ lớn hơn:

alter session set events '10046 trace name context forever, level 12';

--tắt:

alter session set events '10046 trace name context off';

--tệp với thông tin theo dõi thô sẽ được định vị:

 select value from v$parameter p
 where name='user_dump_dest'

--name của tệp (*. trc) sẽ chứa spid:

 select p.spid from v$session s, v$process p
 where s.paddr=p.addr
 and ...your_search_params...

- ngoài ra bạn có thể tự đặt tên:

alter session set tracefile_identifier='UniqueString'; 

- cuối cùng, sử dụng TKPROFđể làm cho tệp theo dõi dễ đọc hơn:

C:\ORACLE\admin\databaseSID\udump>
C:\ORACLE\admin\databaseSID\udump>tkprof my_trace_file.trc output=my_file.prf
TKPROF: Release 9.2.0.1.0 - Production on Wed Sep 22 18:05:00 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
C:\ORACLE\admin\databaseSID\udump>

--để xem trạng thái sử dụng tệp theo dõi:

set serveroutput on size 30000;
declare
  ALevel binary_integer;
begin
  SYS.DBMS_SYSTEM.Read_Ev(10046, ALevel);
  if ALevel = 0 then
    DBMS_OUTPUT.Put_Line('sql_trace is off');
  else
    DBMS_OUTPUT.Put_Line('sql_trace is on');
  end if;
end;
/

Chỉ là bản dịch http://www.sql.ru/faq/faq_topic.aspx?fid=389 Bản gốc đầy đủ hơn, nhưng dù sao thì bản này cũng hay hơn những gì người khác đã đăng trên IMHO


Hữu ích hơn nhiều so với các câu trả lời khác!
Andomar

Quá phức tạp. Không ai sẽ sử dụng nó.
ADM-IT

7

GI Oracle Profiler v1.2

Đó là một Công cụ để Oracle nắm bắt các truy vấn được thực thi tương tự như SQL Server Profiler. Công cụ không thể thiếu để bảo trì các ứng dụng sử dụng máy chủ cơ sở dữ liệu này.

bạn có thể tải xuống từ trang web chính thức iacosoft.com


Xin chào, bạn có cần Giấy phép đặc biệt từ ORACLE để sử dụng phần mềm này không? Tôi biết Oracle cho phép bạn thẩm định một số bảng / chế độ xem nhất định, và nếu bạn làm điều đó và không có giấy phép cho nó, họ sẽ tính thêm phí cho bạn.
sergiu

2
Xin chào, bạn phải trả tiền để truy vấn v $ sqlarea? Tôi có thể nhập liên kết cho biết điều gì?
pio

xuất sắc cảm ơn người đàn ông !!! Bạn tiết kiệm cho tôi rất nhiều công việc
Hernaldo Gonzalez

Nếu truy vấn của tôi không thành công, nó sẽ không được trình biên dịch hiển thị.
QUẢN TRỊ CNTT


5

Xem như tôi vừa bình chọn một câu hỏi gần đây là một bản sao và chỉ theo hướng này. . .

Một vài thứ nữa - trong SQL * Plus - SET AUTOTRACE ON - sẽ giải thích kế hoạch và số liệu thống kê cho mỗi câu lệnh được thực thi.

TOAD cũng cho phép lập hồ sơ phía khách hàng.

Điểm bất lợi của cả hai điều này là chúng chỉ cho bạn biết kế hoạch thực thi cho câu lệnh, nhưng không cho bạn biết cách trình tối ưu hóa đạt được kế hoạch đó - vì vậy bạn sẽ cần theo dõi phía máy chủ cấp thấp hơn.

Một điều quan trọng khác cần hiểu là ảnh chụp nhanh Statspack - chúng là một cách tốt để xem xét hiệu suất của cơ sở dữ liệu nói chung. Giải thích kế hoạch, v.v., rất tốt trong việc tìm kiếm các câu lệnh SQL riêng lẻ đang bị tắc nghẽn. Statspack rất giỏi trong việc xác định thực tế là vấn đề của bạn là một câu lệnh đơn giản với kế hoạch thực thi tốt đang được gọi 1 triệu lần trong một phút.


3

Catch is Capture tất cả SQL chạy giữa hai thời điểm. Giống như cách SQL Server cũng làm.

Có những tình huống hữu ích khi nắm bắt SQL mà một người dùng cụ thể đang chạy trong cơ sở dữ liệu. Thông thường, bạn chỉ cần bật theo dõi phiên cho người dùng đó, nhưng có hai vấn đề tiềm ẩn với cách tiếp cận đó.

  1. Đầu tiên là nhiều ứng dụng dựa trên web duy trì một nhóm các kết nối cơ sở dữ liệu liên tục được chia sẻ giữa nhiều người dùng.
  2. Thứ hai là một số ứng dụng kết nối, chạy một số SQL và ngắt kết nối rất nhanh, khiến việc bật theo dõi phiên trở nên khó khăn (tất nhiên bạn có thể sử dụng trình kích hoạt đăng nhập để bật theo dõi phiên trong trường hợp này).

Một giải pháp nhanh chóng và hiệu quả cho vấn đề là nắm bắt tất cả các câu lệnh SQL được chạy giữa hai thời điểm.

Quy trình sau sẽ tạo hai bảng, mỗi bảng chứa một ảnh chụp nhanh của cơ sở dữ liệu tại một điểm cụ thể. Các bảng sau đó sẽ được truy vấn để tạo ra một danh sách tất cả các SQL đã chạy trong khoảng thời gian đó.

Nếu có thể, bạn nên thực hiện việc này trên một hệ thống phát triển yên tĩnh - nếu không, bạn có nguy cơ lấy lại quá nhiều dữ liệu.

  1. Chụp ảnh chụp nhanh đầu tiên Chạy sql sau để tạo ảnh chụp nhanh đầu tiên:

    create table sql_exec_before as
    select executions,hash_value
    from v$sqlarea
    /
    
  2. Yêu cầu người dùng thực hiện nhiệm vụ của họ trong ứng dụng.

  3. Chụp nhanh lần thứ hai.

    create table sql_exec_after as
    select executions, hash_value
    from v$sqlarea
    /
    
  4. Kiểm tra kết quả Bây giờ bạn đã nắm bắt được SQL, đã đến lúc truy vấn kết quả.

Truy vấn đầu tiên này sẽ liệt kê tất cả các băm truy vấn đã được thực thi:

select  aft.hash_value
from sql_exec_after aft
left outer join sql_exec_before bef
  on aft.hash_value  =  bef.hash_value 
where aft.executions > bef.executions
   or bef.executions is null;
/

Cái này sẽ hiển thị hàm băm và chính SQL: đặt các trang 999 dòng ngắt 100 trên hash_value

select  hash_value, sql_text
from    v$sqltext
where   hash_value in (
    select  aft.hash_value
    from sql_exec_after aft
    left outer join sql_exec_before bef
      on aft.hash_value  =  bef.hash_value
    where aft.executions > bef.executions
       or bef.executions is null;
)
order by
    hash_value, piece
/

5. Dọn dẹp Đừng quên xóa các bảng chụp nhanh sau khi bạn đã hoàn thành:

drop table sql_exec_before
/

drop table sql_exec_after
/

Cảm ơn bạn vì các tập lệnh hoàn chỉnh thể hiện kỹ thuật.
Roman Pokrovskij

2

Oracle, cùng với các cơ sở dữ liệu khác, phân tích một truy vấn nhất định để tạo ra một kế hoạch thực thi. Kế hoạch này là cách hiệu quả nhất để lấy dữ liệu.

Oracle cung cấp explain plancâu lệnh '' phân tích truy vấn nhưng không chạy nó, thay vào đó điền vào một bảng đặc biệt mà bạn có thể truy vấn (bảng kế hoạch).

Cú pháp (phiên bản đơn giản, có các tùy chọn khác như để đánh dấu các hàng trong bảng kế hoạch bằng một ID đặc biệt hoặc sử dụng một bảng kế hoạch khác) là:

explain plan for <sql query>

Việc phân tích dữ liệu đó được để lại cho một câu hỏi khác hoặc nghiên cứu thêm của bạn.



1

Đây là tài liệu Oracle giải thích cách theo dõi các truy vấn SQL, bao gồm một số công cụ (SQL Trace và tkprof)

liên kết


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.