アットウィキロゴ

DBA


表に対するオブジェクト権限を付与するSQLを既存環境からつくる


systemユーザでログインしてこのSQLを実行する

SELECT 'GRANT ' || Privilege || ' ON ' || Table_Name || ' TO ' || grantee || ';'
FROM DBA_TAB_PRIVS
WHERE grantor ='{付与元ユーザ}'
AND grantee = '{付与先ユーザ}'
ORDER BY grantee;

結果はこんな感じ。

GRANT ALTER ON emp TO {付与先ユーザ};
GRANT SELECT ON emp TO {付与先ユーザ};
GRANT INSERT ON emp TO {付与先ユーザ};
...

付与元ユーザでログインしてこのSQLを実行する


SQLトレースを取るための準備


autotraceに必要なロールを作成し、テーブルへの参照権限を与える
SQL> connect sys as sysdba
パスワードを入力してください:
接続されました。
SQL> @/oracle/product/9.2.0/sqlplus/admin/plustrce.sql

検索を実行するユーザでplan_tableを作成
SQL> connect user/pwd@sid
SQL> @/oracle/product/9.2.0/rdbms/admin/utlxplan.sql


データファイルをいじる

alter database datafile '/oracle/dbf/tbs_test_01.dbf' resize 40m;
alter tablespace tbs_md01 add datafile '/oracle/dbf/tbs_test_02.dbf' size 20m;

レコード長をざっくり計算

select
count(*) as column_cnt,
sum(DATA_LENGTH) as record_length
from
user_tab_columns
where
table_name = 'T_JYUTMISI'

date型は7byte、number型は一律22byteで計算してます。


コアレス(連続領域をくっつける)

alter tablespace tbs_goto_hell coalesce;

でも、領域のお尻しか消せない。真ん中に空いた穴はそのまま。


インポートとエクスポート

imp {usr}/{pwd}@{sid} file=t_uri.dmp tables=T_uri log=imp_uri2.log ignore=y
exp {usr}/{pwd}@{sid} file=t_uri.dmp tables=T_uri log=exp_uri.log direct=Y compress=Y

ignoreオプションをつけると、tableが存在していても無理やり詰め込む

パッケージやファンクションの定義をみる


パッケージに含まれる関数・プロシージャのパラメータを一覧表示
select *
from ALL_ARGUMENTS
where package_name='PK_TEST'
order by position;

パッケージ内の関数などを一覧表示
select PROCEDURE_NAME
from ALL_PROCEDURES
where object_name = 'PK_TEST';


PCTUSEDとPCTFREE


  • PCTUSED(維持するべき使用率)が大きい
    • ブロックが満杯の状態を常に維持できる   
→全件検索には有利
    • INSERTのパフォーマンスは劣化する可能性あり   
→もともとDELETEされることがないなら、関係ない

  • PCTFREE(データが増えた時のためにとる余裕%)が大きい
    • 更新によってレコード長が長くなる場合に向いている(移行行を防ぐことが
できる)
→UPDATEが行われない表には大きな値を設定する必要は無い。
    • ブロックに余裕がある(空いている領域が多い→レコードは多く格納されて
いない)
→全件検索が中心の表には不利(1ブロックあたりのレコード数が少ないという
ことは同じ件数でも多くのブロックが必要)



テーブルが実際に使っている領域サイズ

SELECT DISTINCT
    a.OWNER,
    a.SEGMENT_TYPE,
    a.SEGMENT_NAME,
    c.CREATED,
    a.TABLESPACE_NAME,
    NVL(F.BYTES, 0) AS NO_USE_SIZE,
    NVL(G.BYTES, 0) AS TOTAL_SIZE ,
    NVL(G.MAXBYTES,0) AS MAX_SIZE,
    (NVL(G.BYTES, 0) - NVL(F.BYTES, 0)) AS USE_SIZE ,
    b.FILE_NAME,
    b.BYTES
FROM
    dba_segments a,
    dba_data_files b,
    all_objects c,
   (SELECT
        TABLESPACE_NAME,
        SUM(BYTES) BYTES
    FROM
        DBA_FREE_SPACE
    GROUP BY
        TABLESPACE_NAME
   ) F,
   (SELECT
        TABLESPACE_NAME,
        SUM(BYTES) BYTES,
        SUM(MAXBYTES) MAXBYTES
    FROM
        DBA_DATA_FILES
    GROUP BY
        TABLESPACE_NAME
   ) G
WHERE
    a.TABLESPACE_NAME = b.TABLESPACE_NAME       AND
    a.SEGMENT_NAME = c.OBJECT_NAME       AND
    a.OWNER = c.OWNER       AND
    c.SUBOBJECT_NAME IS NULL       AND
    a.TABLESPACE_NAME = f.TABLESPACE_NAME       AND
    a.TABLESPACE_NAME = g.TABLESPACE_NAME 
    AND c.OBJECT_NAME LIKE 'T_JYUT%'
ORDER BY
    a.OWNER,
    a.SEGMENT_TYPE,
    a.SEGMENT_NAME

LOCK情報

col USERNAME heading ユーザ名 format a7
col to_char(LOGON_TIME,'yyyy/mm/dd_hh24:mi:ss') heading 接続開始時刻 format a19
col SID heading SID format 999
col SERIAL# heading SERIAL# format 999999
col MACHINE format a15
col PROGRAM format a27
col STATUS format a8
col SERVER format a10
col OSUSER format a14
col OBJECT_NAME heading LOCK対象TBL format a20
set pagesize 999
set lin 120
prompt
prompt === 接続ユーザ 一覧 ===
select USERNAME, SID, SERIAL#, to_char(LOGON_TIME,'yyyy/mm/dd_hh24:mi:ss'),
STATUS, SERVER, OSUSER, MACHINE, PROGRAM
from v$session where USERNAME is not null
order by LOGON_TIME;
prompt
prompt === LOCK 一覧 ===
select a.USERNAME, a.SID, a.SERIAL#, a.OSUSER, a.MACHINE, a.PROGRAM,
c.OBJECT_NAME
from v$session a, v$lock b, dba_objects c
where a.SID = b.SID
and b.ID1 = c.OBJECT_ID
and c.OBJECT_ID in ( select ID1 from v$lock where TYPE = 'TM' )
order by b.SID, c.OBJECT_NAME;

セッション情報

Oracleに接続中のセッション情報を表示する
セッションを切断する場合、systemユーザでログインして以下のコマンドを発行する
alter system kill session '<下記SQLで取得したSID_SERIAL>';

COLUMN SID_SERIAL FORMAT A15
COLUMN osuser     FORMAT A15
COLUMN username     FORMAT A10
Column status format a10
Column Program format a60
SET PAGES 33
SET LINE 4000
SELECT
  sid || ',' || serial#  AS SID_SERIAL,
  username       ,
  status         ,
  osuser,
  program,to_char(LOGON_TIME,'mm/dd hh24:mi')
FROM
  V$SESSION;


指定したテーブルに付与されたインデックスをみる

COLUMN TABLE_OWNER     FORMAT A10
COLUMN TABLE_NAME      FORMAT A15
COLUMN INDEX_NAME      FORMAT A20
COLUMN COLUMN_NAME     FORMAT A20
COLUMN COLUMN_POSITION FORMAT 99
set line 2000
SELECT
  TABLE_OWNER    ,
  TABLE_NAME     ,
  INDEX_NAME     ,
  COLUMN_NAME    ,
  COLUMN_POSITION
FROM
  ALL_IND_COLUMNS
WHERE
  TABLE_OWNER like UPPER('&TableOwner') AND
  TABLE_NAME  like UPPER('&TableName')
ORDER BY
  TABLE_NAME     ,
  INDEX_NAME     ,
  COLUMN_POSITION


現在実行されているSQL

set pagesize 999
set lin 120
col USERNAME format a9
col SID format 999
col SERIAL# format 999999
col OSUSER format a15
col SQL_TEXT format a70
SELECT S.USERNAME, S.OSUSER, S.SID, S.SERIAL#, T.ADDRESS, T.SQL_TEXT
FROM V$SQLTEXT T, V$SESSION S
WHERE S.SQL_ADDRESS = T.ADDRESS
AND S.SQL_HASH_VALUE = T.HASH_VALUE
AND S.USERNAME is not null
ORDER BY S.OSUSER, T.ADDRESS, T.PIECE;


コンパイルされているソースを見る

set line 4000
set pages 0
select
  lpad(to_char(line),5,'0') || ': ' ||  text
from
  all_source
where
  owner = upper('&uid') and
  name like upper('%&pk_name%') and
  line >= &line_from and
  line <= &line_to and
  type = 'PACKAGE BODY'
/


表領域を指定して格納されているオブジェクト、サイズを見る

set line 5000
col tablespace_name format a30
col SEGMENT_NAME format a30
select
       TABLESPACE_NAME
       ,SEGMENT_NAME
       ,FILE_ID
       ,BLOCK_ID
       ,BYTES/1024 AS SIZE_KB
       ,BLOCKS
from DBA_EXTENTS
where TABLESPACE_NAME = 'TBS_WK01_I'
union
select
       TABLESPACE_NAME
       ,'<free>'
       ,FILE_ID
       ,BLOCK_ID
       ,BYTES/1024 AS SIZE_KB
       ,BLOCKS
from DBA_FREE_SPACE
where TABLESPACE_NAME = 'TBS_WK01_I'
order by file_id,block_id

表領域ごとの空き容量

col tablespace_name format a30
col free_kb format 999,999,999,999,999
select
    TABLESPACE_NAME,
    SUM(FREE_KB) AS FREE_KB
from
(
    select
           A.TABLESPACE_NAME
           ,A.BYTES/1024 AS FREE_KB
    from DBA_FREE_SPACE A,
         (
           SELECT TABLESPACE_NAME,FILE_ID,MAX(BLOCK_ID) AS max_block
           FROM DBA_EXTENTS
           GROUP BY TABLESPACE_NAME,FILE_ID
         ) B
    where A.TABLESPACE_NAME = B.TABLESPACE_NAME
      and A.FILE_ID = B.FILE_ID
      and A.BLOCK_ID > B.max_block
)
GROUP BY
    TABLESPACE_NAME
/

表領域ごとの使用率

col TABLESPACE_NAME format a20
col USED format a20
set line 2000
select
    A.TABLESPACE_NAME,
    A.INITIAL_EXTENT,
    A.NEXT_EXTENT,
    B.USED_SIZE_KB,
    To_Char( Round( B.USED_SIZE_KB / A.INITIAL_EXTENT * 100 ) ) || '%' AS USED 
from
    dba_tablespaces A,
    (   /* tablespaceの使用サイズを計算 */
        select
            TABLESPACE_NAME,
            SUM(SIZE_KB) AS USED_SIZE_KB
        from
        (
            select
                   TABLESPACE_NAME
                   ,SEGMENT_NAME
                   ,FILE_ID
                   ,BLOCK_ID
                   ,BYTES/1024 AS SIZE_KB
                   ,BLOCKS
            from DBA_EXTENTS
            union
            select
                   TABLESPACE_NAME
                   ,'<free>'
                   ,FILE_ID
                   ,BLOCK_ID
                   ,BYTES/1024 AS SIZE_KB
                   ,BLOCKS
            from DBA_FREE_SPACE
        )
        GROUP BY
            TABLESPACE_NAME
    ) B
where
    A.TABLESPACE_NAME = B.TABLESPACE_NAME
/


表領域ごとの使用量、空き、無駄領域を計算する

set line 2000
col tablespace_name format a30
col data_kb format 999,999,999,999
col free_kb format 999,999,999,999
col lost_kb format 999,999,999,999
col used_pct format a10
select
    TABLESPACE_NAME,
    SUM(DATA_KB) AS DATA_KB,
    SUM(FREE_KB) AS FREE_KB,
    SUM(LOST_KB) AS LOST_KB,
    To_CHAR( 
      Round( (SUM(DATA_KB) + SUM(LOST_KB)) / 
             (SUM(DATA_KB) + SUM(FREE_KB) + SUM(LOST_KB)) *
              100) 
      ) || '%' AS USED_PCT
from
(
    select
           TABLESPACE_NAME
           ,SEGMENT_NAME
           ,FILE_ID
           ,BLOCK_ID
           ,BYTES/1024 AS DATA_KB
           ,0          AS FREE_KB
           ,0          AS LOST_KB
    from DBA_EXTENTS
    union
    select
           A.TABLESPACE_NAME
           ,'<free>'
           ,A.FILE_ID
           ,A.BLOCK_ID
           ,0            AS DATA_KB
           ,A.BYTES/1024 AS FREE_KB
           ,0            AS LOST_KB
    from DBA_FREE_SPACE A,
         (
           SELECT TABLESPACE_NAME,FILE_ID,MAX(BLOCK_ID) AS max_block
           FROM DBA_EXTENTS
           GROUP BY TABLESPACE_NAME,FILE_ID
         ) B
    where A.TABLESPACE_NAME = B.TABLESPACE_NAME
      and A.FILE_ID = B.FILE_ID
      and A.BLOCK_ID > B.max_block
    union
    select
           A.TABLESPACE_NAME
           ,'<free>'
           ,A.FILE_ID
           ,A.BLOCK_ID
           ,0            AS DATA_KB
           ,0            AS FREE_KB
           ,A.BYTES/1024 AS LOST_KB
    from DBA_FREE_SPACE A,
         (
           SELECT TABLESPACE_NAME,FILE_ID,MAX(BLOCK_ID) AS max_block
           FROM DBA_EXTENTS
           GROUP BY TABLESPACE_NAME,FILE_ID
         ) B
    where A.TABLESPACE_NAME = B.TABLESPACE_NAME
      and A.FILE_ID = B.FILE_ID
      and A.BLOCK_ID < B.max_block
)
GROUP BY
    TABLESPACE_NAME
/

タグ:

Oracle DBA
最終更新:2006年12月06日 19:55