■実行計画確認
●コストベースかルールベースかの判断方法
set linesize 1000
set pagesize 100
column table_name format a20
SELECT table_name, num_rows, blocks, avg_row_len,
to_char(last_analyzed, 'MM/DD/YYYY HH24:MI:SS')
FROM dba_tables;
→情報が空のテーブルはルールベースである。
→last_analyzedにて前回実行時の時間が確認可能。
【カラム】
NUM_ROWS:
行数
BLOCKS:
最高水位標(HWM)までのブロックの数
EMPTY_BLOCKS:
表に割当てられているが未使用の(HWMよりも上にある)ブロックの数
AVG_SPACE:
各データ・ブロックにおける使用可能な空き領域サイズの平均(バイト単位)
CHAIN_CNT:
行連鎖または行移行が発生している行数
AVG_ROW_LEN:
行の平均サイズ(バイト単位)
AVG_SPACE_FREELIST_BLOCKS:
空きリスト(フリーリスト)につながっているブロックの空き領域サイズの平均(バイト単位)
NUM_FREELIST_BLOCKS:
空きリスト(フリーリスト)につながっているブロックの数
SAMPLE_SIZE:
統計の収集をESTIMATE指定で行った時のサンプル・サイズ
LAST_ANALYZED:
最新の統計収集日時
●ルールベースに戻す
ANALYZE TABLE 表名 DELETE STATISTICS;
●初期設定値確認
show parameter optimizer_mode;
・RULE:
オプティマイザはルールベースを採用する
・CHOOSE(デフォルト値):
統計情報が使用可能か(ANALYZEが実行されているか)どうかを判断し、
統計情報が使用できればコストベース、そうでない場合はルールベースを採用する
・ALL_ROWS:
サーバ内リソースの最小使用とスループットの最小化を行う
・FIRST_ROWS:
応答時間が最短となるよう検索を行う。検索結果の1行目に対する応答時間を最適化する
■Analyzeの実行
ANALYZE TABLE <対象テーブル名> <オプション>;
◎オプション
・COMPUTE STATISTICS
表全体を対象にアナライズを実行する。
1回のresadコールで読み込まれるデータ量は
「db_block_size×db_file_multiblock_read_count」
・ESTIMATE STATISTICS
対象となる表の中からアナライズに使用する行をサンプリング。
行抽出動作はシングルブロック単位。
サンプリング率の指定が必要。
→50%以上だとCOMPUTE STATISTICSと同じ動作。
■インポート、エクスポート時の統計情報の扱い
→STATISTICSオプションにて統計情報の移行方法が変更可能。
<デフォルト>
EXP:ESTIMATE
IMP:ALWAYS
→コピーしたくない場合は「NONE」に設定。
2007年7月25日水曜日
2007年7月24日火曜日
Oracleフルインポートによる性能への影響
■エクスポート/インポートの使用目的
1.表データを再編する
- ある表領域のデータを別の表領域に移動すると、競合が減ったり、空き領域の断片化が低減したり、バックアップの取得が効果的になる時
- 表に行移行が多数存在する時
- 表にデータが僅かしか入っていないのに、そのデータが多数のブロックに分散して入っている時
2.あるユーザーが所有するデータを別のユーザーに移動する
オブジェクトの所有ユーザーをデータベースから削除したり、オブジェクトの所有者を別のユーザーに変更する時に利用。
あるユーザーがエクスポートしたデータを別のユーザーにインポート。
3.データベース間でデータを移動する
定義のみを抽出して、データを無視することによって、オブジェクト定義を開発環境から本番環境へ移動。
4.別のプラットフォームまたは別のOracleリリースへ移行する
あるマシンでエクスポートされたデータは、異なるキャラクタ・セットを使用する可能性があっても、別のマシンのデータベースにインポートできる。
また、Oracleの新しいリリースにアップグレードする時は、古いリリースからデータをエクスポートして、新しいリリースにインポートできる。
■行移行
→最初にinsertしたデータをupdateする際に、update後のデータサイズが元のデータより大きいため、別のブロックにデータが保存されてしまう。
■行連鎖
→insertしたデータ容量がブロックサイズを超えてしまい、複数のブロックへ1行のデータがまたがってしまう。
1.表データを再編する
- ある表領域のデータを別の表領域に移動すると、競合が減ったり、空き領域の断片化が低減したり、バックアップの取得が効果的になる時
- 表に行移行が多数存在する時
- 表にデータが僅かしか入っていないのに、そのデータが多数のブロックに分散して入っている時
2.あるユーザーが所有するデータを別のユーザーに移動する
オブジェクトの所有ユーザーをデータベースから削除したり、オブジェクトの所有者を別のユーザーに変更する時に利用。
あるユーザーがエクスポートしたデータを別のユーザーにインポート。
3.データベース間でデータを移動する
定義のみを抽出して、データを無視することによって、オブジェクト定義を開発環境から本番環境へ移動。
4.別のプラットフォームまたは別のOracleリリースへ移行する
あるマシンでエクスポートされたデータは、異なるキャラクタ・セットを使用する可能性があっても、別のマシンのデータベースにインポートできる。
また、Oracleの新しいリリースにアップグレードする時は、古いリリースからデータをエクスポートして、新しいリリースにインポートできる。
■行移行
→最初にinsertしたデータをupdateする際に、update後のデータサイズが元のデータより大きいため、別のブロックにデータが保存されてしまう。
■行連鎖
→insertしたデータ容量がブロックサイズを超えてしまい、複数のブロックへ1行のデータがまたがってしまう。
2007年7月23日月曜日
2007年7月20日金曜日
PL/SQL -カーソル操作-
-- DBMS_OUTPUTの出力を端末の標準出力へ表示
SET SERVEROUTPUT ON;
DECLARE
--カーソル定義
cursor c_adt is
select TNAME from tab where TNAME like '%ADT%';
--SELECTで取得したレコードを代入する変数の定義
adt_tname c_adt%rowtype;
BEGIN
open c_adt;
loop
-- フェッチ時に、取得項目を変数に代入
fetch c_adt into adt_tname;
-- レコードが無くなればループ終了
exit when c_adt%notfound;
--テーブル名を表示
--dbms_output.put_line('AUDITテーブル名:' || adt_tname.tname);
end loop;
close c_adt;
END;
/
SET SERVEROUTPUT ON;
DECLARE
--カーソル定義
cursor c_adt is
select TNAME from tab where TNAME like '%ADT%';
--SELECTで取得したレコードを代入する変数の定義
adt_tname c_adt%rowtype;
BEGIN
open c_adt;
loop
-- フェッチ時に、取得項目を変数に代入
fetch c_adt into adt_tname;
-- レコードが無くなればループ終了
exit when c_adt%notfound;
--テーブル名を表示
--dbms_output.put_line('AUDITテーブル名:' || adt_tname.tname);
end loop;
close c_adt;
END;
/
2007年7月13日金曜日
シェルコマンド
■paste file1 file2
→ file1とfile2を連結して表示。
■cut
・cut -f 1,3 -d' ' file1
→file1の半角スペース区切りで1番目と3番目のフィールドを表示
・cat file1 | cut -c48-
→file1の48文字目以降を表示
・cut file1 | cut -c3-5
→file1の3文字目から5文字目までを表示
■シェル内部で実行したコマンドについて
・シェルスクリプトから起動した外部コマンドは、 シェル変数 $! で直前に起動したプロセスIDを取得できる。
例)
(prstat -t > prstat.log ) & ←バックグラウンドで実行して
sleep 3 ←3秒間実行
kill $! ←PIDにてkill
■prstatのリダイレクト
→prstatでは出力行数が設定できて、リダイレクトを行う場合はデフォルトで15行になっている。
「-n」オプションいて変更可能。
例)
prstat -n 100,100 1 1 > prstat.log
■perl正規表現
例)
/(?:¥S+¥s+){8,8}([0-9]+)/
→文字の後にスペースが来るパターンを8回マッチした直後の数字を表示。
<パターングループ>
( ) グループ化
(?:...) パターンの非格納グループ化(グループ化のみで、文字列の格納をしません)
<メタ文字>
¥S スペース以外の文字
¥s スペース文字
<量指定子>
? 直前の文字を0又は1回にマッチ
+ 直前の文字を1以上にマッチ
{n,m} 直前の文字をn回以上、m回以下にマッチ
<文字クラス>
[ ] [ ]の中の任意の1文字にマッチ
[0-9] 数字1文字
[^...] 囲まれた文字以外とマッチ
→ file1とfile2を連結して表示。
■cut
・cut -f 1,3 -d' ' file1
→file1の半角スペース区切りで1番目と3番目のフィールドを表示
・cat file1 | cut -c48-
→file1の48文字目以降を表示
・cut file1 | cut -c3-5
→file1の3文字目から5文字目までを表示
■シェル内部で実行したコマンドについて
・シェルスクリプトから起動した外部コマンドは、 シェル変数 $! で直前に起動したプロセスIDを取得できる。
例)
(prstat -t > prstat.log ) & ←バックグラウンドで実行して
sleep 3 ←3秒間実行
kill $! ←PIDにてkill
■prstatのリダイレクト
→prstatでは出力行数が設定できて、リダイレクトを行う場合はデフォルトで15行になっている。
「-n」オプションいて変更可能。
例)
prstat -n 100,100 1 1 > prstat.log
■perl正規表現
例)
/(?:¥S+¥s+){8,8}([0-9]+)/
→文字の後にスペースが来るパターンを8回マッチした直後の数字を表示。
<パターングループ>
( ) グループ化
(?:...) パターンの非格納グループ化(グループ化のみで、文字列の格納をしません)
<メタ文字>
¥S スペース以外の文字
¥s スペース文字
<量指定子>
? 直前の文字を0又は1回にマッチ
+ 直前の文字を1以上にマッチ
{n,m} 直前の文字をn回以上、m回以下にマッチ
<文字クラス>
[ ] [ ]の中の任意の1文字にマッチ
[0-9] 数字1文字
[^...] 囲まれた文字以外とマッチ
2007年7月12日木曜日
solarisのバージョン確認
■solarisのバージョンを確認する方法
→/etc/releaseを確認する
cat /etc/release
Solaris 8 2/04 s28s_hw4wos_05a SPARC
Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
Assembled 08 January 2004
→/etc/releaseを確認する
cat /etc/release
Solaris 8 2/04 s28s_hw4wos_05a SPARC
Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
Assembled 08 January 2004
2007年7月8日日曜日
はじめまして。
はじめまして。
IT業界で仕事を始めて3年目に突入した25歳です。
20歳のころに自分の中で思い描いていた25歳とは程遠い・・・
もっと仕事できて
バリバリ稼いでて
充実した日々を送ってる
はずだったのに~。
とにかく勉強不足がすべての根源なので
ここでは日々の勉強や学んだ事をアウトプットできる場になればいいと思ってます。
業界違いの人はまったく意味不明なブログかもしれませんが
興味を持った方がいたら是非コメントいただけるとうれしいです。
同じ業界で、同じ歳で頑張ってる方を見るのが
一番の自分への刺激になるのでよろしくお願いします!!
さて・・・
明日から何書こうかな・・・
IT業界で仕事を始めて3年目に突入した25歳です。
20歳のころに自分の中で思い描いていた25歳とは程遠い・・・
もっと仕事できて
バリバリ稼いでて
充実した日々を送ってる
はずだったのに~。
とにかく勉強不足がすべての根源なので
ここでは日々の勉強や学んだ事をアウトプットできる場になればいいと思ってます。
業界違いの人はまったく意味不明なブログかもしれませんが
興味を持った方がいたら是非コメントいただけるとうれしいです。
同じ業界で、同じ歳で頑張ってる方を見るのが
一番の自分への刺激になるのでよろしくお願いします!!
さて・・・
明日から何書こうかな・・・
登録:
投稿 (Atom)