2008-11-25 26 views

Trả lời

1

Có một số cách có thể để làm điều này, nhưng có một google cho tkprof

Không có giao diện ... nó hoàn toàn dòng lệnh và có thể là một liên lạc đáng sợ cho người mới bắt đầu Oracle; nhưng nó rất mạnh mẽ.

Liên kết này trông giống như một sự khởi đầu tốt:

http://www.oracleutilities.com/OSUtil/tkprof.html

+0

Có cách nào để lấy dữ liệu bằng truy vấn sql không? Oracle có duy trì dữ liệu liên quan trong một số bảng hệ thống không? –

+0

Nó không duy trì nhiều dữ liệu trong các bảng hệ thống khi bạn nhận được với tkprof. Xem câu trả lời của tôi cho một cách nhanh chóng và bẩn để tìm các báo cáo xấu. tkprof là tốt hơn nhưng bạn cần phải thiết lập cụ thể một thử nghiệm và chạy nó. –

42

tôi thấy câu lệnh SQL này là một nơi hữu ích để bắt đầu (xin lỗi tôi không thể gán này để tác giả ban đầu, tôi tìm thấy nó ở đâu đó trên internet):

SELECT * FROM 
(SELECT 
    sql_fulltext, 
    sql_id, 
    elapsed_time, 
    child_number, 
    disk_reads, 
    executions, 
    first_load_time, 
    last_load_time 
FROM v$sql 
ORDER BY elapsed_time DESC) 
WHERE ROWNUM < 10 
/

Điều này tìm thấy các câu lệnh SQL hàng đầu hiện được lưu trữ trong bộ nhớ cache SQL được sắp xếp theo thời gian đã trôi qua. Báo cáo sẽ biến mất khỏi bộ nhớ cache theo thời gian, vì vậy có thể không cố gắng chẩn đoán công việc hàng đêm của đêm trước khi bạn làm việc vào buổi trưa.

Bạn cũng có thể thử đặt hàng bởi disk_reads và hành quyết. Executions rất hữu ích vì một số ứng dụng nghèo gửi cùng một câu lệnh SQL quá nhiều lần. SQL này giả sử bạn sử dụng các biến liên kết một cách chính xác.

Sau đó, bạn có thể đi sql_idchild_number của một tuyên bố và cho chúng ăn vào bé này: -

SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id', &child)); 

Điều này cho thấy kế hoạch thực tế từ bộ nhớ cache SQL và đầy đủ nội dung của SQL.

+0

Bạn nên thêm elapsed_time vào lựa chọn nếu không nó khá khó hiểu. –

-1

Trong khi tìm kiếm tôi đã truy vấn sau đây mà không được công việc với một giả định (thực hiện truy vấn thời gian> 6 giây)


chọn tên người dùng, sql_text, sofar, totalwork, đơn vị

TỪ v $ sql, v $ session_longops

ĐÂU sql_address = địa chỉ VÀ sql_hash_value = hash_value

ORDER BY địa chỉ, hash_value, CHILD_NUMBER ;


Tôi nghĩ rằng truy vấn ở trên sẽ liệt kê chi tiết cho người dùng hiện tại.

Comments được hoan nghênh !!

+0

Truy vấn này không giới hạn đối với người dùng hiện tại và sẽ chỉ hoạt động nếu truy vấn xuất hiện trong v $ session_longops. Longops ghi lại bao xa một sắp xếp, quét bảng, chỉ mục quét toàn bộ Oracle. Nếu truy vấn của bạn chậm do kế hoạch vòng lặp lồng nhau xấu, nó sẽ không hiển thị becauase không có longops. –

1

Nó phụ thuộc vào phiên bản oracle bạn có, cho 9i và bên dưới Statspack là những gì bạn đang sau, 10g trở lên, bạn muốn awr, cả hai công cụ này sẽ cung cấp cho bạn hàng đầu và nhiều thứ khác.

4

Bạn có thể lấy đệm trung bình được mỗi thực hiện trong một khoảng thời gian hoạt động của dụ:

SELECT username, 
     buffer_gets, 
     disk_reads, 
     executions, 
     buffer_get_per_exec, 
     parse_calls, 
     sorts, 
     rows_processed, 
     hit_ratio, 
     module, 
     sql_text 
     -- elapsed_time, cpu_time, user_io_wait_time, , 
    FROM (SELECT sql_text, 
       b.username, 
       a.disk_reads, 
       a.buffer_gets, 
       trunc(a.buffer_gets/a.executions) buffer_get_per_exec, 
       a.parse_calls, 
       a.sorts, 
       a.executions, 
       a.rows_processed, 
       100 - ROUND (100 * a.disk_reads/a.buffer_gets, 2) hit_ratio, 
       module 
       -- cpu_time, elapsed_time, user_io_wait_time 
      FROM v$sqlarea a, dba_users b 
     WHERE a.parsing_user_id = b.user_id 
      AND b.username NOT IN ('SYS', 'SYSTEM', 'RMAN','SYSMAN') 
      AND a.buffer_gets > 10000 
     ORDER BY buffer_get_per_exec DESC) 
WHERE ROWNUM <= 20 
15

Bạn có thể tìm thấy đĩa chuyên sâu quét bảng đầy đủ với một cái gì đó như thế này:

SELECT Disk_Reads DiskReads, Executions, SQL_ID, SQL_Text SQLText, 
    SQL_FullText SQLFullText 
FROM 
(
    SELECT Disk_Reads, Executions, SQL_ID, LTRIM(SQL_Text) SQL_Text, 
     SQL_FullText, Operation, Options, 
     Row_Number() OVER 
     (Partition By sql_text ORDER BY Disk_Reads * Executions DESC) 
     KeepHighSQL 
    FROM 
    (
     SELECT Avg(Disk_Reads) OVER (Partition By sql_text) Disk_Reads, 
      Max(Executions) OVER (Partition By sql_text) Executions, 
      t.SQL_ID, sql_text, sql_fulltext, p.operation,p.options 
     FROM v$sql t, v$sql_plan p 
     WHERE t.hash_value=p.hash_value AND p.operation='TABLE ACCESS' 
     AND p.options='FULL' AND p.object_owner NOT IN ('SYS','SYSTEM') 
     AND t.Executions > 1 
    ) 
    ORDER BY DISK_READS * EXECUTIONS DESC 
) 
WHERE KeepHighSQL = 1 
AND rownum <=5; 
+0

Không phải DISK_READS tổng số lần đọc đĩa, vì vậy bạn không cần nhân với các lần thực thi? –

1

Các truy vấn sau trả về các câu lệnh SQL thực hiện số lượng lớn số lần đọc đĩa (cũng bao gồm người dùng vi phạm và số lần truy vấn đã được chạy):

SELECT t2.username, t1.disk_reads, t1.executions, 
    t1.disk_reads/DECODE(t1.executions, 0, 1, t1.executions) as exec_ratio, 
    t1.command_type, t1.sql_text 
    FROM v$sqlarea t1, dba_users t2 
    WHERE t1.parsing_user_id = t2.user_id 
    AND t1.disk_reads > 100000 
    ORDER BY t1.disk_reads DESC 

Chạy truy vấn dưới dạng SYS và điều chỉnh số lần đọc đĩa tùy thuộc vào những gì bạn cho là quá mức (100.000 tác phẩm đối với tôi).

Gần đây, tôi đã sử dụng truy vấn này để theo dõi người dùng từ chối tận dụng lợi thế của Explain Plans trước khi thực hiện báo cáo của họ.

Tôi tìm thấy truy vấn này trong một cuốn sách điều chỉnh Oracle SQL cũ (mà tôi không may không còn), vì vậy xin lỗi, nhưng không có ghi nhận tác giả.

1

thông tin đầy đủ mà tôi nhận được từ askTom-Oracle. Tôi hy vọng nó sẽ giúp bạn

select * 
from v$sql 
where buffer_gets > 1000000 
or disk_reads > 100000 
or executions > 50000 
Các vấn đề liên quan