《Set Autotrace》

摘要:《Set Autotrace》

因為公司的關係,最近在開發資料庫上提供同事們產出SQL執行計劃及相關統計資料的功能,

期望讓同事們更深入了解自己的SQL在資料庫上的反應。

希望藉此提升同事們的SQL語法及對資料庫的認識。

以下是在oracle 10g的環境下測試。據google大師的回覆,在Oracle 10g已預設有plan_table,

只是Table 名稱改成Plan_Table$,所以只要執行此測試的後半段,就是建立plustrace這個role。

因為公司是Oracle 9i,所以還是按表實作了一下。

------------------------------------------------------------------------------------------------

C:\oracle\product\10.2.0\db_A\RDBMS\ADMIN>dir utlx*.sql
 磁碟區 C 中的磁碟沒有標籤。
 磁碟區序號:  741A-1F28
 C:\oracle\product\10.2.0\db_A\RDBMS\ADMIN 的目錄
2004/07/27  上午 04:33             1,925 utlxaa.sql
2001/02/22  下午 04:42             5,335 utlxmv.sql
2004/06/06  上午 12:05             3,341 utlxplan.sql
2002/01/24  下午 11:13             1,571 utlxplp.sql
2002/02/27  下午 06:48             1,695 utlxpls.sql
2005/04/29  上午 09:16             2,420 utlxrw.sql
               6 個檔案          16,287 位元組
               0 個目錄  19,494,526,976 位元組可用
C:\oracle\product\10.2.0\db_A\RDBMS\ADMIN>sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 7月 23 22:34:41 2009
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
SQL> conn sys as sysdba
輸入密碼:
已連線.
------------------------------------------------------------------------------------------------
-- Oracle 9i 要建立,Oracle 10g 已預設Plan Table是 Plan_Table$
-- 就不需要執行utlxplan.sql
------------------------------------------------------------------------------------------------
SQL> @utlxplan.sql
已建立表格.
SQL> @c:\oracle\product\10.2.0\db_a\sqlplus\admin\plustrce.sql
SQL>
SQL> drop role plustrace;
drop role plustrace
          *
 ERROR 在行 1:
ORA-01919: 角色 'PLUSTRACE' 不存在

SQL> create role plustrace;
已建立角色.
SQL>
SQL> grant select on v_$sesstat to plustrace;
順利授權.
SQL> grant select on v_$statname to plustrace;
順利授權.
SQL> grant select on v_$mystat to plustrace;
順利授權.
SQL> grant plustrace to dba with admin option;
順利授權.
SQL>
SQL> set echo off
SQL> conn ting
輸入密碼:
已連線.
SQL> set autotrace on
SP2-0618: 找不到階段作業 ID. 請檢查是否啟用 PLUSTRACE 角色
SP2-0611: 啟動 STATISTICS 報表時發生錯誤
SQL> conn sys as sysdba
輸入密碼:
已連線.
------------------------------------------------------------------------------------------------
-- 為了開放給所有使用者使用,所以直接授權給public
-- plustrace、plan_table
-- 一定要記得建立plan_table的同義字
-- 如果是10g 記得plan_table要改成plan_table$
------------------------------------------------------------------------------------------------

SQL> grant plustrace to public;
順利授權.
SQL> grant all on plan_table to public;
順利授權.
SQL> create public synonym plan_table for sys.plan_table;
已建立同義字.
SQL> conn ting
輸入密碼:
已連線.
SQL> set autotrace on
SQL> select count(*) from user_tables;
  COUNT(*)
----------
         0

執行計畫
----------------------------------------------------------
ERROR:
ORA-01039: 權限不足, 無法存取構成視觀表的基底物件
SP2-0612: 產生 AUTOTRACE EXPLAIN 報表時發生錯誤
統計值
----------------------------------------------------------
         27  recursive calls
          0  db block gets
        853  consistent gets
        634  physical reads
          0  redo size
        407  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed
------------------------------------------------------------------------------------------------
-- 一開始以為是少了什麼授權,為什麼會出現權限不足
-- 原來是平常太習慣查些資料庫相關的表,user_tables沒有權限讀取
-- 但是還是可以取到統計值唷。
------------------------------------------------------------------------------------------------

SQL> select *from t;
F1
----------
1
2
3
4
5
6
7
8
9
已選取 9 個資料列.

執行計畫
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     9 |    63 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T    |     9 |    63 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement

統計值
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
        495  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          9  rows processed