Oracle: มีเครื่องมือในการติดตามคิวรีเช่น Profiler สำหรับ sql server หรือไม่ [ปิด]


86

ฉันทำงานกับเซิร์ฟเวอร์ sql แต่ฉันต้องย้ายไปยังแอปพลิเคชันที่มี Oracle DB สำหรับการติดตามการสืบค้นแอปพลิเคชันของฉันใน Sql Server ฉันใช้เครื่องมือ Profiler ที่ยอดเยี่ยม Oracle มีสิ่งที่เทียบเท่าหรือไม่


38
ทำไมคุณถึงยอมรับคำตอบที่ผิด? อธิบายแผนไม่ทำในสิ่งที่โปรไฟล์ทำ มันไม่เกี่ยวข้องกันโดยสิ้นเชิง
จัสมิน

1
คุณพบเครื่องมือที่ดีที่สุดเช่นsql server profiler? ตอนนี้คุณใช้อะไรอยู่?
Shahid Ghafoor

ฉันได้เขียนหนังสือเกี่ยวกับการติดตามแอปพลิเคชัน Oracle มันมีอยู่ในรูปแบบไฟล์ PDF ที่method-r.com
Cary Millsap

โปรดตรวจสอบoracle profilerใน dbForge Studio สำหรับ Oracle จาก Devart
Devart

มีคำตอบมากมายด้านล่าง แต่ไม่มีใครพูดถึงโปรไฟล์สองตัวของ Oracle สำหรับ PL / SQL: DBMS_PROFILER(พื้นฐานและ จำกัด แต่สะดวกสุด ๆ ) หรือDBMS_HPROF(แม่นยำกว่า แต่ต้องการการตั้งค่ามากกว่า) อย่างไรก็ตามฉันไม่รู้จัก SQL Server ดังนั้นจึงเป็นไปได้ว่ามันมีแนวคิดในการทำโปรไฟล์ที่แตกต่างจากแพ็คเกจ Oracle อย่างใดอย่างหนึ่งและสิ่งที่คุณต้องการก็เหมือนกับการติดตามใน Oracle
William Robertson

คำตอบ:


22

คุณสามารถใช้ Oracle Enterprise Manager เพื่อตรวจสอบเซสชันที่แอ็คทีฟด้วยคิวรีที่กำลังดำเนินการแผนการดำเนินการล็อกสถิติบางอย่างและแม้แต่แถบความคืบหน้าสำหรับงานที่ยาวขึ้น

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

ไปที่อินสแตนซ์ -> เซสชันและดูแท็บ SQL ของแต่ละเซสชัน

ยังมีวิธีอื่น ๆ ผู้จัดการองค์กรเพียงแค่ใส่สีสวย ๆ ที่มีอยู่แล้วในมุมมองพิเศษเช่นเดียวกับที่มีการบันทึกไว้ที่นี่: http://www.oracle.com/pls/db92/db92.catalog_views?remark=homepage

และแน่นอนคุณยังสามารถใช้เครื่องมือ Explain PLAN FOR, TRACE และเครื่องมืออื่น ๆ อีกมากมาย มีรายงานบางอย่างในตัวจัดการองค์กรสำหรับแบบสอบถาม SQL ที่แพงที่สุด คุณยังสามารถค้นหาคำค้นหาล่าสุดที่เก็บไว้ในแคช


19

ฉันพบวิธีง่ายๆ

ขั้นตอนที่ 1. เชื่อมต่อกับ DB กับผู้ดูแลระบบโดยใช้ PLSQL หรือ sqldeveloper หรืออินเทอร์เฟซแบบสอบถามอื่น ๆ

ขั้นตอนที่ 2. เรียกใช้สคริปต์ร้อง; ในคอลัมน์ S.SQL_TEXT คุณจะเห็นการสืบค้นที่ดำเนินการ

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;

ปัญหาเดียวของเรื่องนี้คือฉันไม่สามารถหาวิธีแสดงค่าพารามิเตอร์อินพุตได้ (สำหรับการเรียกใช้ฟังก์ชัน) แต่อย่างน้อยเราก็สามารถเห็นสิ่งที่รันใน Oracle และลำดับของมันโดยไม่ต้องใช้เครื่องมือเฉพาะ


2
คุณสามารถเพิ่ม S.SQL_FULLTEXT ได้หากข้อความค้นหามีความยาวมากกว่า 1,000 อักขระเนื่องจาก SQL_TEXT จะถูกตัดออกเมื่อถึงจุดนั้น
Tridus

2
คุณไม่ควรสั่งซื้อภายใน LAST_ACTIVE_TIME เนื่องจากเป็น VARCHAR2 (19) ใช้สิ่งนี้แทน: ORDER BY TO_DATE (S.LAST_LOAD_TIME, 'YYYY-MM-DD / HH24: MI: SS') desc
Igor Krupitsky

1
ORA-00942: ไม่มีตารางหรือมุมมอง 00942. 00000 - "ไม่มีตารางหรือมุมมอง" * สาเหตุ: * การดำเนินการ: ข้อผิดพลาดที่บรรทัด: 11 คอลัมน์: 6 นั่นหมายความว่าฉันไม่มีผู้ดูแลระบบเหนือกว่า?
toha

นี่ไม่รวมค่าพารามิเตอร์ ถ้าอยากได้แบบนั้นลองดูที่: stackoverflow.com/a/14217618/6339469
HamedH

16
alter system set timed_statistics=true

--หรือ

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

- ต้องใหญ่พอ:

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

- ค้นหา sid และ serial # ของเซสชันที่คุณสนใจ:

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

- คุณสามารถเริ่มการติดตามด้วยเหตุการณ์ 10046 พารามิเตอร์ที่สี่ตั้งค่าระดับการติดตาม (12 คือค่าที่ใหญ่ที่สุด):

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

- ปิดการติดตามด้วยการตั้งค่าระดับศูนย์:

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

/ * ระดับที่เป็นไปได้: 0 - ปิด 1 - ระดับต่ำสุด เช่นเดียวกับ set sql_trace = true 4 - เพิ่มค่าตัวแปรการโยงในไฟล์การติดตาม 8 - รอเพิ่ม 12 - เพิ่มทั้งค่าตัวแปรการผูกและรอเหตุการณ์ * /

- เช่นเดียวกันหากคุณต้องการติดตามเซสชันของคุณเองด้วยระดับที่ใหญ่กว่า:

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

--ปิด:

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

- ไฟล์ที่มีข้อมูลการติดตามดิบจะอยู่:

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

- ชื่อไฟล์ (*. trc) จะมี spid:

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

- นอกจากนี้คุณสามารถตั้งชื่อด้วยตัวเอง:

alter session set tracefile_identifier='UniqueString'; 

- สุดท้ายใช้TKPROFเพื่อทำให้ไฟล์การติดตามอ่านง่ายขึ้น:

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>

- เพื่อดูสถานะของการใช้ไฟล์ติดตาม:

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;
/

เพียงแค่ชนิดของการแปลhttp://www.sql.ru/faq/faq_topic.aspx?fid=389เดิมคือฟูลเลอร์ แต่อย่างไรก็ตามนี้จะดีกว่าสิ่งที่คนอื่นโพสต์ IMHO


มีประโยชน์มากกว่าคำตอบอื่น ๆ !
Andomar

ซับซ้อนเกินไป. จะไม่มีใครใช้มัน
ADM-IT

7

GI Oracle Profiler v1.2.2

เป็นเครื่องมือสำหรับ Oracle ในการรวบรวมคำค้นหาที่ดำเนินการคล้ายกับ SQL Server Profiler เครื่องมือที่จำเป็นสำหรับการบำรุงรักษาแอปพลิเคชันที่ใช้เซิร์ฟเวอร์ฐานข้อมูลนี้

คุณสามารถดาวน์โหลดได้จากเว็บไซต์อย่างเป็นทางการ iacosoft.com


สวัสดีคุณต้องการใบอนุญาตพิเศษจาก ORACLE เพื่อใช้ซอฟต์แวร์นี้หรือไม่? ฉันรู้ว่า Oracle อนุญาตให้คุณทำงานร่วมกันในตาราง / มุมมองบางอย่างและถ้าคุณทำและไม่มีใบอนุญาตพวกเขาจะเรียกเก็บเงินจากคุณเพิ่มเติม
sergiu

2
สวัสดีคุณต้องจ่ายเพื่อสอบถาม v $ sqlarea? ฉันสามารถป้อนลิงค์ที่ระบุว่าอะไร?
pio

ขอบคุณมาก !!! คุณช่วยฉันทำงานได้มากมาย
Hernaldo Gonzalez

หากการสืบค้นของฉันล้มเหลวจะไม่แสดงโดย profiler
ADM-IT

6

ลองใช้ PL / SQL Developer ซึ่งมีอินเทอร์เฟซ GUI ที่เป็นมิตรกับผู้ใช้สำหรับโปรไฟล์ เป็นเรื่องที่ดีมากที่จะทดลองใช้ ฉันสาบานด้วยเครื่องมือนี้เมื่อทำงานกับฐานข้อมูล Oracle

http://www.allroundautomations.com/plsqldev.html?gclid=CM6pz8e04p0CFQjyDAodNXqPDw


5

เมื่อเห็นว่าฉันเพิ่งโหวตคำถามล่าสุดว่าซ้ำกันและชี้ไปในทิศทางนี้ . .

อีกสองสามคำ - ใน SQL * Plus - SET AUTOTRACE ON - จะอธิบายแผนและสถิติสำหรับแต่ละคำสั่งที่ดำเนินการ

TOAD ยังช่วยในการทำโปรไฟล์ฝั่งไคลเอ็นต์

ข้อเสียของทั้งสองอย่างนี้คือพวกเขาบอกคุณเฉพาะแผนการดำเนินการสำหรับคำสั่งเท่านั้น แต่ไม่ใช่ว่าเครื่องมือเพิ่มประสิทธิภาพมาถึงแผนนั้นได้อย่างไรเพราะคุณจะต้องมีการติดตามฝั่งเซิร์ฟเวอร์ระดับล่าง

สิ่งสำคัญอีกประการหนึ่งที่ต้องทำความเข้าใจคือสแน็ปช็อตของ Statspack ซึ่งเป็นวิธีที่ดีในการดูประสิทธิภาพของฐานข้อมูลโดยรวม อธิบายแผน ฯลฯ เป็นสิ่งที่ดีในการค้นหาคำสั่ง SQL แต่ละรายการที่เป็นปัญหาคอขวด Statspack สามารถระบุได้ดีว่าปัญหาของคุณคือคำสั่งง่ายๆที่มีแผนการดำเนินการที่ดีถูกเรียก 1 ล้านครั้งในหนึ่งนาที


3

Catch คือจับ SQL ทั้งหมดที่ทำงานระหว่างสองจุดในเวลา เช่นเดียวกับวิธีที่ SQL Server ทำเช่นกัน

มีสถานการณ์ที่เป็นประโยชน์ในการดักจับ SQL ที่ผู้ใช้รายหนึ่งกำลังเรียกใช้ในฐานข้อมูล โดยปกติคุณจะเปิดใช้งานการติดตามเซสชันสำหรับผู้ใช้รายนั้น แต่มีปัญหาที่อาจเกิดขึ้นสองประการในแนวทางดังกล่าว

  1. ประการแรกคือแอปพลิเคชันบนเว็บจำนวนมากมีการเชื่อมต่อฐานข้อมูลแบบถาวรซึ่งใช้ร่วมกันระหว่างผู้ใช้หลายคน
  2. ประการที่สองคือแอปพลิเคชันบางตัวเชื่อมต่อเรียกใช้ SQL และยกเลิกการเชื่อมต่ออย่างรวดเร็วทำให้การเปิดใช้งานการติดตามเซสชันเป็นเรื่องยาก (แน่นอนคุณสามารถใช้ทริกเกอร์การเข้าสู่ระบบเพื่อเปิดใช้งานการติดตามเซสชันในกรณีนี้)

วิธีแก้ปัญหาที่รวดเร็วและสกปรกคือการรวบรวมคำสั่ง SQL ทั้งหมดที่ทำงานระหว่างจุดสองจุดในเวลา

ขั้นตอนต่อไปนี้จะสร้างตารางสองตารางแต่ละตารางมีสแนปชอตของฐานข้อมูล ณ จุดใดจุดหนึ่ง จากนั้นตารางจะถูกสอบถามเพื่อสร้างรายการ SQL ทั้งหมดที่รันในช่วงเวลานั้น

หากเป็นไปได้คุณควรทำในระบบการพัฒนาที่เงียบ ๆ มิฉะนั้นคุณจะเสี่ยงต่อการได้รับข้อมูลกลับคืนมามากเกินไป

  1. ใช้ snapshot แรกเรียกใช้ sql ต่อไปนี้เพื่อสร้าง snapshot แรก:

    create table sql_exec_before as
    select executions,hash_value
    from v$sqlarea
    /
    
  2. ให้ผู้ใช้ดำเนินการภายในแอปพลิเคชัน

  3. ถ่ายภาพที่สอง

    create table sql_exec_after as
    select executions, hash_value
    from v$sqlarea
    /
    
  4. ตรวจสอบผลลัพธ์เมื่อคุณได้บันทึก SQL แล้วก็ถึงเวลาสืบค้นผลลัพธ์

แบบสอบถามแรกนี้จะแสดงรายการแฮชแบบสอบถามทั้งหมดที่ดำเนินการแล้ว:

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;
/

อันนี้จะแสดงแฮชและ SQL เอง: ตั้งค่าเพจ 999 บรรทัดแบ่ง 100 ใน 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. จัดระเบียบอย่าลืมลบตารางภาพรวมเมื่อคุณทำเสร็จแล้ว:

drop table sql_exec_before
/

drop table sql_exec_after
/

ขอบคุณสำหรับสคริปต์ทั้งหมดที่แสดงให้เห็นถึงเทคนิค
Roman Pokrovskij

2

Oracle พร้อมกับฐานข้อมูลอื่น ๆ วิเคราะห์แบบสอบถามที่กำหนดเพื่อสร้างแผนการดำเนินการ แผนนี้เป็นวิธีที่มีประสิทธิภาพสูงสุดในการดึงข้อมูล

Oracle จัดเตรียมexplain planคำสั่ง '' ซึ่งวิเคราะห์แบบสอบถาม แต่ไม่ได้เรียกใช้แทนการเติมข้อมูลในตารางพิเศษที่คุณสามารถสืบค้นได้ (ตารางแผน)

ไวยากรณ์ (เวอร์ชันธรรมดามีตัวเลือกอื่น ๆ เช่นการทำเครื่องหมายแถวในตารางแผนด้วยรหัสพิเศษหรือใช้ตารางแผนอื่น) คือ:

explain plan for <sql query>

การวิเคราะห์ข้อมูลนั้นเหลือไว้สำหรับคำถามอื่นหรือการค้นคว้าเพิ่มเติมของคุณ




1

เห็นได้ชัดว่าไม่มียูทิลิตี้ราคาถูกขนาดเล็กที่จะช่วยทำงานนี้ได้ อย่างไรก็ตามมี 101 วิธีในการทำในลักษณะที่ซับซ้อนและไม่สะดวก

บทความต่อไปนี้อธิบายถึงหลาย ๆ คงมีอีกหลายสิบ ... http://www.petefinnigan.com/ramblings/how_to_set_trace.htm

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.