2007年11月30日金曜日

■Oracle_STATSPACKについて

●参考サイト
http://otn.oracle.co.jp/skillup/stats_diag/2/index.html
http://www9.plala.or.jp/okuman/oracle/statspack.html

0.事前準備
(1)STATSPACK取得用表領域作成
SQL> create tablespace STATSPACK datafile '/u01/oradata/ORACLE/STATSPACK.dbf' size 200M;

1.インストール手順

(1) SQL*PLUSにて、SYS 又は INTERNAL USERとしてDBに接続する。
SQL> conn as sydba

(2) 以下のスクリプトを実行する。
  SQL> @$ORACLE_HOME/rdbms/admin/spcreate.sql

(3) PERFSTAT ユーザのPASSWDを指定する。
***************************************************
Specify PERFSTAT password
perfstat_passwordに値を入力してください:
***************************************************

(4) STATS PACKの使用する表と索引を格納する表領域を指定する。→(自動作成)
***************************************************
Specify PERFSTAT user's default tablespace
default_tablespace に値を入力してください: STATSPACK
***************************************************

(5) STATS PACKの使用する一時表領域を指定する。→(自動作成)
***************************************************
Specify PERFSTAT user's temporary tablespace.
temporary_tablespace に値を入力してください: TEMP
***************************************************

※インストール後、エラーが発生していないかどうか以下のログを確認。
(カレントディレクトリに出力される)
・spcpkg.lis
・spctab.lis
・spcusr.lis

2.統計情報の採取方法

(1)STATS PACK用のユーザー(デフォルトならperfstat)でDBに接続する。
 % sqlplus perfstat/*******

(2)「スナップショット」を採取する。
 SQL> execute statspack.snap (i_snap_level => 7)

 統計情報を取得したい間隔にて再度実行する。

●cronによるスナップショット自動取得
 11月26日7時45分に実行する。
******************************************************************************************
%contab -l
45 7 11 26 * /usr/bin/csh statspack.sh
%cat statspack.sh
setenv ORACLE_BASE /opt/oracle
setenv ORACLE_HOME ${ORACLE_BASE}/product/9.2.0
setenv ORACLE_SID ORACLE
setenv ORACLE_DOC ${ORACLE_HOME}/doc
setenv PATH ${ORACLE_HOME}/bin:/usr/ccs/bin:/usr/bin:/etc:/usr/openwin/bin:${PATH}
setenv NLS_LANG Japanese_Japan.JA16SJIS

/usr/bin/echo 'execute statspack.snap (i_snap_level => 7)' | /opt/oracle/product/9.2.0/bin/sqlplus perfstat/orapasswd
******************************************************************************************
※cronで実行する場合、環境変数が設定されていないので、コマンドはフルパスで定義する。
※実行結果はmailにて送信される。
 <エラーのみ送信したい場合>
 * * * * * command 1> /dev/null
 <何が起ころうとも送信しない場合>
 * * * * * command >/dev/null 2>&1

3.統計情報の出力方法

(1)STATS PACK用のユーザーでDBに接続する。
  % sqlplus perfstat/******

(2)以下のスクリプトを実行する。
  SQL> @$ORACLE_HOME/rdbms/admin/spreport.sql
******************************************************************************
Snap Snap
Instance DB Name Id Snap Started Level Comment
------------ ------------ ----- ----------------- ----- ----------------------
ORACLE ORACLE 1 05 Nov 2007 17:28 7
2 05 Nov 2007 17:40 7
******************************************************************************
(3) 開始スナップショットIDを入力する。
  Enter beginning Snap Id: 1

(4) 終了スナップショットIDを入力する。
  Enter ending Snap Id: 2

(5) レポートのファイル名を指定する。 デフォルトは st_{beginning Snap Id}_{ending Snap Id}.log となる。

(6) カレントディレクトリに指定したファイル名でレポートが出力される。


4.古い統計情報を削除する方法

(1)STATS PACK用のユーザーでDBに接続する。
  % sqlplus perfstat/******

(2)以下のスクリプトを実行する。
  SQL> @$ORACLE_HOME/rdbms/admin/sppurge.sql

(3)削除開始SNAPIDを指定
***********************************************
losnapidに値を入力してください: 1
Using 1 for lower bound.
***********************************************

(4)削除終了SnapIDを指定
***********************************************
hisnapidに値を入力してください: 2
Using 2 for upper bound.
***********************************************

(5)削除が実行される。
******************************************************************************
Deleting snapshots 1 - 2.

Purge of specified Snapshot range complete. If you wish to ROLLBACK
the purge, it is still possible to do so. Exitting from SQL*Plus will
automatically commit the purge.
******************************************************************************


3.実行計画の取得
STATSPACKにて取得したSQL文のhash_value値より、同SQL文の自行計画を取得する。

(1)STATS PACK用のユーザーでDBに接続する。
  % sqlplus perfstat/******

(2)以下のスクリプトを実行する。
SQL> @$ORACLE_HOME/rdbms/admin/sprepsql.sql

(3)STATSPACK取得情報が表示される。
******************************************************************************
Snap Snap
Instance DB Name Id Snap Started Level Comment
------------ ------------ ----- ----------------- ----- ----------------------
NTTETF NTTETF 3 06 Nov 2007 10:02 6
4 06 Nov 2007 10:04 6
5 06 Nov 2007 10:17 6
6 06 Nov 2007 10:20 6
7 06 Nov 2007 10:23 6
8 07 Nov 2007 12:16 7
9 07 Nov 2007 12:17 7
******************************************************************************

(4)実行計画を取得したいSQLが含まれるスナップショットを選択する。
******************************************************************************
begin_snapに値を入力してください: 8
Begin Snapshot Id specified: 8
******************************************************************************
******************************************************************************
end_snapに値を入力してください: 9
End Snapshot Id specified: 9
******************************************************************************

(4)実行計画を取得したいSQLのHash Value値を入力する。
******************************************************************************
hash_valueに値を入力してください: 4242159307
Hash Value specified is: 4242159307
******************************************************************************

(5)出力するレポートの名前を入力する。
******************************************************************************
The default report file name is sp_8_9_4242159307. To use this name,
press to continue, otherwise enter an alternative.
report_nameに値を入力してください: sql
******************************************************************************

2007年7月25日水曜日

oracleのアナライズ

■実行計画確認

●コストベースかルールベースかの判断方法
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月24日火曜日

Oracleフルインポートによる性能への影響

■エクスポート/インポートの使用目的
1.表データを再編する
- ある表領域のデータを別の表領域に移動すると、競合が減ったり、空き領域の断片化が低減したり、バックアップの取得が効果的になる時
- 表に行移行が多数存在する時
- 表にデータが僅かしか入っていないのに、そのデータが多数のブロックに分散して入っている時

2.あるユーザーが所有するデータを別のユーザーに移動する
オブジェクトの所有ユーザーをデータベースから削除したり、オブジェクトの所有者を別のユーザーに変更する時に利用。
  あるユーザーがエクスポートしたデータを別のユーザーにインポート。

3.データベース間でデータを移動する
定義のみを抽出して、データを無視することによって、オブジェクト定義を開発環境から本番環境へ移動。

4.別のプラットフォームまたは別のOracleリリースへ移行する
あるマシンでエクスポートされたデータは、異なるキャラクタ・セットを使用する可能性があっても、別のマシンのデータベースにインポートできる。
また、Oracleの新しいリリースにアップグレードする時は、古いリリースからデータをエクスポートして、新しいリリースにインポートできる。

■行移行
→最初にinsertしたデータをupdateする際に、update後のデータサイズが元のデータより大きいため、別のブロックにデータが保存されてしまう。

■行連鎖
→insertしたデータ容量がブロックサイズを超えてしまい、複数のブロックへ1行のデータがまたがってしまう。

2007年7月23日月曜日

CPUのコア数

なぜ?
・CPUの性能向上のためにクロック数の向上を行ってきたが、従来のシングルコアでは動作クロックを上昇させると、それに比例して消費電力も上昇してしまう。
なので、コア数を増やす事により、シングルコアでの問題となる消費電力を抑えて、性能を向上させることができる。

■種類
デュアルコア・・・コア数が2つのCPU
クアッドコア・・・コア数が4つのCPU

■問題点
・コンピュータ内のジョブスケジューリングはOS側が行っており、コア数が増えるとスケジューリングが複雑化する。
・コア内にジョブを割り振る機能を追加すると、CPUが大型化してしまうのでOS側の性能向上が求められている。

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;
/

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文字
[^...]  囲まれた文字以外とマッチ

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

2007年7月8日日曜日

写真投稿テスト!!

箱根に行った際の撮った朝顔。
Posted by Picasa

はじめまして。

はじめまして。
IT業界で仕事を始めて3年目に突入した25歳です。

20歳のころに自分の中で思い描いていた25歳とは程遠い・・・

もっと仕事できて
バリバリ稼いでて
充実した日々を送ってる


はずだったのに~。

とにかく勉強不足がすべての根源なので
ここでは日々の勉強や学んだ事をアウトプットできる場になればいいと思ってます。

業界違いの人はまったく意味不明なブログかもしれませんが
興味を持った方がいたら是非コメントいただけるとうれしいです。

同じ業界で、同じ歳で頑張ってる方を見るのが
一番の自分への刺激になるのでよろしくお願いします!!

さて・・・
明日から何書こうかな・・・