跟蹤文件中包含了大量而詳細的診斷和調試信息。經過對跟蹤文件的解讀和分析,咱們能夠定位問題、分析問題和解決問題。從跟蹤文件的產生的來源來看,跟蹤文件又能夠分爲兩類:一類是數據庫的操做人員有意生成的;另外一類則是因爲出現了異常錯誤,由數據庫自動生成的。對於後一類,只對Oracle內部的技術支持人員是有用的,但對於咱們,則多半看不懂。前一類,則是咱們常常用到的,幫助咱們分析、調整和優化應用性能,處理並解決問題。sql
那麼在哪裏能夠找到跟蹤文件呢?經過查詢數據字典v$diag_info能夠肯定跟蹤文件的存儲路徑,以下所示。數據庫
select * from v$diag_info;
進入目錄/u01/app/oracle/diag/rdbms/orcl/orcl/trace能夠看到以trc爲後綴的跟蹤文件,以下圖所示。
服務器
一個跟蹤文件的名字通常由如下幾部分組成:session
例如:orcl_mmon_12210.trc,其中:「orcl" 是本環境下數據庫的SID,"12210"爲產生該跟蹤文件會話所使用的服務器進程ID號。如何知道個人ORACLE_SID和會話所使用的服務器進程ID呢?oracle
爲了演示的方便,咱們給一個普通用戶scott授予dba的角色。app
[oracle@oracle12c ~]$ sqlplus / as sysdba SQL> grant dba to scott; Grant succeeded. SQL>
SQL> select instance_name from V$instance; INSTANCE_NAME ---------------- orcl SQL>
SQL> conn scott/tiger Connected. SQL> select sid from v$mystat where rownum=1; SID ---------- 70 SQL>
SQL> select paddr from v$session where sid=70; PADDR ---------------- 000000006DAB6588 SQL>
SQL> select spid from v$process where addr='000000006DAB6588'; SPID ------------------------ 54685 SQL>
進入目錄/u01/app/oracle/diag/rdbms/orcl/orcl/trace會發現,此時並不存在包含54685的跟蹤文件,緣由是要使用跟蹤文件須要手動開啓會話的跟蹤。工具
SQL> alter session set sql_trace=true; Session altered. SQL>
[oracle@oracle12c trace]$ pwd /u01/app/oracle/diag/rdbms/orcl/orcl/trace [oracle@oracle12c trace]$ ls *54685.trc orcl_ora_54685.trc [oracle@oracle12c trace]$
根據跟蹤對於診斷SQL語句是很是有用的,下面經過一個簡單的示例來講明。性能
select * from scott.emp where deptno=10; select * from scott.emp where deptno=20; select * from scott.emp where deptno=30;
這三條SQL分別查詢十、20和30號部門的員工。經過觀察發現,這三條SQL除了where的條件的參數值不同,其餘部分都是同樣的。這樣的SQL語句叫作「重複的SQL」。若是數據庫中存在大量的重複SQL,會使得每次在執行的時候都會進行SQL的解析,再生成執行計劃。從而影響數據庫的性能。優化
下面經過跟蹤文件來驗證上面的結論。操作系統
SQL> alter session set sql_trace=false; Session altered. SQL>
[oracle@oracle12c trace]$ tkprof orcl_ora_54685.trc /home/oracle/a.txt sys=no sort=fchela TKPROF: Release 12.2.0.1.0 - Development on Mon Jun 28 10:37:48 2021 Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved. [oracle@oracle12c trace]$
SQL ID: 1mvxd868z75nf Plan Hash: 3956160932 select * from scott.emp where deptno=30 SQL ID: 2nbac4n9hnzth Plan Hash: 3956160932 select * from scott.emp where deptno=20 SQL ID: 062r5atccuyv4 Plan Hash: 3956160932 select * from scott.emp where deptno=10
能夠當作儘管三條SQL對應的SQL ID不同,可是生成的Plan Hash是同樣的。這就說明這三條SQL的執行計劃是同樣的。既然如此,咱們可使用綁定變量的方式來改寫這三條SQL。讓這三條SQL語句在執行的時候,不用每次都生成執行計劃。只須要複用第一次生成的執行計劃便可。從而提升性能。