このブログを検索

ラベル DDL の投稿を表示しています。 すべての投稿を表示
ラベル DDL の投稿を表示しています。 すべての投稿を表示

2011年3月7日月曜日

オブジェクトの依存関係を確認する

ビューが参照しているテーブルをdropすると、そのビューはINVALIDになります。
Oracleはオブジェクト同士の依存関係を管理しているためです。
set pages 10000
set lines 120
col REFERENCED_NAME for a30
col TYPE for a20
col NAME for a30
select referenced_name,type,name from user_dependencies
where referenced_name in ('M01_DOWNLOADITEM','M01_MACHINE')
order by referenced_name,type,name;
実行結果は次の通り。
REFERENCED_NAMEが参照されているオブジェクト、NAMEが影響を受ける(INVALIDになりうる)オブジェクトです。
REFERENCED_NAME                TYPE                 NAME
------------------------------ -------------------- ------------------------------
M01_DOWNLOADITEM               FUNCTION             L_ITEMPUBLISHLOG
M01_DOWNLOADITEM               VIEW                 V_CATEGORYLIST
M01_MACHINE                    VIEW                 V_CATEGORYLIST

2011年2月7日月曜日

テーブルのカラム数を確認

カラム数が多すぎると共有プールのSQLキャッシュが増えすぎる恐れがあります。
新機能を実装するような場合に確認するといいでしょう。

一般的に、マスタ系のテーブルは属性がも多く、カラム数が多くてもやむを得ないことがあります。
ただし、トランザクション系のテーブルでカラムが多いのは設計そのものに問題がある可能性があります。
set time on
set pages 1000
set lines 100
col table_name for a30
col owner for a20
select owner,table_name,count(column_name) as columns
from dba_tab_columns
where owner<>'SYS'
group by owner,table_name
having count(column_name)>30
order by columns desc,owner,table_name;

実行例は次の通り。
この場合、上位4テーブルがゲームクエストのクリア件数をカラムごとに保持していたため、設計の見直しを検討しました。
OWNER                TABLE_NAME                        COLUMNS
-------------------- ------------------------------ ----------
APPLI001EUSER        TBL_USER_MISSION3                     105
APPLI001SUSER        TBL_USER_MISSION2                     105
APPLI002EUSER        TBL_USER_MISSION3                     105
APPLI002SUSER        TBL_USER_MISSION2                     105
HISTSSSUSER          MST_DOWNLOADITEM                       81
SSS01DBEUSER         TBL_USERMYROOM3                        51
SSS01DBSUSER         TBL_USERMYROOM2                        51
SSS01DBWUSER         TBL_USERMYROOM4                        51
SSS01DBEUSER         MST_USERPERSONAL3                      47
SSS01DBSUSER         MST_USERPERSONAL2                      47
SSS01DBWUSER         MST_USERPERSONAL4                      47
PERFSTAT             STATS$SQL_SUMMARY                      43
SYSTEM               LOGMNRC_GTLO                           40
APPLI001EUSER        TBL_APPLI_USER3                        37
APPLI001SUSER        TBL_APPLI_USER2                        37
APPLI002EUSER        TBL_APPLI_USER3                        37
APPLI002SUSER        TBL_APPLI_USER2                        37
PERFSTAT             STATS$SQL_PLAN                         34
SSS01DBSTEST         MST_APPITEM                            33
SSS01DBEUSER         TBL_AUTOUSE_STAT3                      32
SSS01DBSUSER         TBL_AUTOUSE_STAT2                      32
SSS01DBWUSER         TBL_AUTOUSE_STAT4                      32

2011年2月6日日曜日

インデックス情報の確認

テーブルとインデックスの関係だけならuser_indexesだけで十分です。
インデックスのカラムも知りたければこのクエリで確認できます。
set pages 10000
set lines 120
column table_name format a32
column index_name format a30
column column_name format a20
column tablespace_name format a20
select i.table_name,i.index_name,c.column_name,i.tablespace_name
 from dba_indexes i, dba_ind_columns c
 where i.index_name=c.index_name
  and i.owner=c.index_owner
  and i.table_name in ('TBL_USER1','TBL_PAGEACCESS1')
 order by i.table_name,i.index_name,c.COLUMN_POSITION;

実行例は次の通り。
TABLE_NAME        INDEX_NAME        COLUMN_NAME  TABLESPACE_NAME
----------------- ----------------- ------------ ---------------
TBL_PAGEACCESS1   IXT1_PAGEACCESS1  USER_ID      SSS_I_IDX
TBL_PAGEACCESS1   IXT1_PAGEACCESS1  PAGE_ID      SSS_I_IDX
TBL_PAGEACCESS1   IXT2_PAGEACCESS1  USER_ID      SSS_I_IDX
TBL_PAGEACCESS1   IXT3_PAGEACCESS1  PAGE_ID      SSS_I_IDX
TBL_USER1         IXT1_USER1        USER_ID      SSS_I_IDX

追記 2011/02/15
インデックスのowner(スキーマ)を条件に含めないと、別スキーマ同名インデックスが重複するので修正