Oracle関係のメモ。

再起SQLでデータ複製

-- hogeテーブルのid = 1を1000件まで複製するSQL
insert into hoge (
select * from (
  with hoge_cal (id, name) as (
    select
      id, name
    from
      hoge
    where
      id = 1 -- 複製元を指定
    union all
    select
      id + 1
      , name || id + 1
    from
      hoge_cal
    where
      id <= 1000 -- 1000件まで
  )
  select
    id, name
  from
    hoge_cal
  where
    id <>  1 -- 複製元は除く
));

explain plan

# sqlplus内で以下を実行する
-- まずplan tableを作成する
@/apps/oracle/product/10.2.0/db_1/rdbms/admin/utlxplan.sql

-- explain planを取得する
set linesize 300
truncate table plan_table;
explain plan for select aaa,bbb from ccc where ddd = 'eee';
select operation || ' options= ' || options || ' object= '  || object_name || ' position= ' || position || ' cost= ' || cost from plan_table;

-- SQL実行時間計測
set timing on
select * from hoge;
Elapsed: 00:00:01.23

kill session

# sqlplus内で以下を実行する

-- sidとserial#を取得
select sid, serial#, username, program, status from v$session where username = 'hoge';
ID       SERIAL#  USERNAME  STATUS
1256  45167      hoge              XXXX

alter system kill session '1256,45167' immediate;

テーブル別の容量確認

select
  at.table_name
  , trunc(us.bytes/1024/1024,0) tablesize_m
  from
    all_tables 
    join user_segments us on us.segment_name = at.table_name
  where
    owner = 'hoge'
  order by
    tablesize_m desc

既存のテーブル属性を継承したまま、同一表領域上に新しいセグメントを確保

  • すべてのデータを再配置して現在使用中のセグメントは解放する
  • ただこれをやるとINDEXが壊れる模様。index再生成が必要
    alter table hoge move [ online ]

インデックスを再生成

alter index index_name rebuild

権限周り

-- オブジェクト権限付与
grant select, update, delete, insert, 
on hoge_schema.fuga_table
to sample_user;

-- オブジェクト権限確認
select *
from
  dba_tab_privs
where
  table_name = 'HOGE'
  and owner = 'FUGA'

sqlplus

-- 折返し表示を見やすくする
set linesize 1000
set pagesize1000