ラベル 技術メモ(Oracle) の投稿を表示しています。 すべての投稿を表示
ラベル 技術メモ(Oracle) の投稿を表示しています。 すべての投稿を表示

2012年8月27日月曜日

ORACLE速度劣化の確認事項

備忘録です。間違いがあるかもしれません。

1.インデックス情報などが抜けているもしくは削除されていないか確認する。
 (全インデックスを確認)

2.ハードディスク容量は圧迫されていないか確認する。

3.メモリの使用量を確認する。
 (メモリをORACLEで使いすぎると、OSの動作で遅くなる)

4.CPUの使用量は安定しているか確認する。
 (SQLに問題がある可能性がある)

5.統計情報を以下コマンドで取り直す。

 例)表ごとの統計情報を取得する場合
 EXECUTE DBMS_STATS.GATHER_TABLE_STATS('SCOTT','EMP');
 例)スキーマごとの統計情報を取得する場合
 EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT');

 例)8i以下の場合
 ANALYZE TABLE tablename COMPUTE STATISTICS

以上です。

2012年5月16日水曜日

Oracle11g パスワード設定

Oracle10gまでパスワードのデフォルト有効期限は無期限でした。
11gからは180日がデフォルトになります。

変更が必要な場合・・・・
以下に関連するコマンドを記載します。

・プロファイルのパスワード有効期限を無期限にする
alter profile default limit password_life_time unlimited;

・ユーザーのパスワードを再設定する
alter user ユーザ名 identified by 新パスワード;

・ロックされているアカウントのロックを解除する
alter user ユーザ名 account unlock;

<手順>

1 oracle管理者アカウントにてログイン

2 sysdbaにてOracleログイン

3 現在のパスワード有効期限を確認

3.1 該当アカウントのユーザプロファイルを確認

SQL> select username,profile from dba_users
      where username like 'XXX';

3.2 ユーザプロファイルのパスワード有効期限を確認

SQL> select *  from dba_profiles
      where profile = 'DEFAULT'
       and resource_name = 'PASSWORD_LIFE_TIME';

4 パスワード有効期限の変更

4.1 新規にユーザプロファイルを作成し、有効期限を新たに設定

create profile XXX_PROFILE limit PASSWORD_LIFE_TIME 360;
※無期限にするなら360→UNLIMITEDを指定

4.2 作成プロファイルのパスワード有効期限を確認

SQL> select *  from dba_profiles
     where profile = 'XXX_PROF'
     and resource_name = 'PASSWORD_LIFE_TIME';

4.3 作成したプロファイルを該当アカウントに割り当て

alter user XXX profile XXX_PROFILE;

4.4 該当アカウントのユーザプロファイルを確認

SQL> select username,profile from dba_users
      where username like 'XXX';



以上。

2012年3月14日水曜日

Orcle11g ログ備忘録

前提:備忘録です。間違いがあるかもしれませんのでご注意ください。 

11gからログの管理が大幅に変更されている。
Automatic Diagnostic Repository(ADR)で管理されるようになっている。 

【ADR】
出力先が異なっていたログをADRで一括格納/管理できる。
 初期化パラメータの「BACKGROUND_DUMP_DEST」と「USER_DUMP_DEST」は11gでは廃止。 

<ADRのディレクトリ構造> 
ADR_BASE:ADRのルートディレクトリ。
初期化パラメータ「DIAGNOSTIC_DEST」で指定. ADR_BASE以下にdiagディレクトリが存在。 ADR_HOME:ADR_BASEの直下。トレースファイル、アラート・ログの保存ディレクトリ。
インスタンス用の保存場所は、<製品_id>と<instance_id>で識別。 

上記ディレクトリは、「V$DIAG_INFOビュー」で確認。
SQL>select * from v$diag_info;
【Oracle Database代表的なログ】
・アラート・ログ:データベース個別のイベントとダンプファイル情報 
・トレースファイル:エラー発生時の情報およびメモリダンプ
・リスナー・ログ:クライアントからの接続要求状況
 (リスナー・ログはリスナーへのアクセス情報が出力されるファイル。出力有無の設定は可能。  出力する設定にしているとファイルは増大し続ける定期的に移動・削除する必要がある。)
 【削除について】

<アラートログの削除>
起動中でも削除可能。ShutDownしてからがよい

<リスナーログの削除>
1./oracle/diag/tnslsnr/host名/listener/alert にxmlファイルが出力されている。

2./oracle/diag/tnslsnr/host名/listener/trace にlistener.logが出力されている。 

1.についてはADRで削除ルールを設定し、purgeコマンドで削除。
C:\> adrci
adrci> set homepath
adrci> purge -age 14400 -type alert 

2については設置当初からのログがそのまま残る。
Oracle停止後、OSより物理削除可能。(基本は移動、圧縮で対応) 

※Oracleサポートに確認するのが一番良い。
※テスト機にて検証してからが基本。

【補足①:アラートログの参照】
 C:\>adrci adrci>show home
adrci >  set editor notepad
adrci >  show alert
adrci >  show problem
adrci >  show incident 

【補足②:削除手順(案)】
※緊急性を要して、肥大化してしまったログの削除しなければならない場合についてですので、  
基本は削除ではなく退避、移動が基本と考えます。 

①データベースのバックアップ
②リスナーログのPURGE
③Oracleの停止
④アラートログの削除
⑤リスナーログの削除

2011年8月25日木曜日

Oracle11gメモリ簡易チューニングメモ

前置き:メモですので、間違いがあるかもしれません。


<初期値について>

MEMORY_TARGET = 0
10gのメモリ管理仕様になる。

MEMORY_TARGET > 0 AND SGA_TARGET > 0 AND PAG_AGGREGATE_TARGET > 0
SGA_TARGET + PAG_AGGREGATE_TARGET <= MEMORY_TARGET <= MEMORY_MAX_TARGET

MEMORY_TARGET > 0 AND SGA_TARGET > 0 AND PAG_AGGREGATE_TARGET = 0
PAG_AGGREGATE_TARGET = MEMORY_TARGET - SGA_TARGET

MEMORY_TARGET > 0 AND SGA_TARGET = 0 AND PAG_AGGREGATE_TARGET > 0
SGA_TARGET = min(MEMORY_TARGET - PAG_AGGREGATE_TARGET , SGA_MAX_SIZE)

MEMORY_TARGET > 0 AND SGA_TARGET = 0 AND PAG_AGGREGATE_TARGET = 0
SGA_TARGET = MEMORY_TARGET*60%
PAG_AGGREGATE_TARGET = MEMORY_TARGET*40%

以上のMEMORY_TARGET > 0 の場合は必要に応じてSGAおよびPGAを削減または増大する。

10g補足

SGA_TARGETを使用することによって、データベースで割り当てられる共有メモリー領域のサイズを正確に制御する。
起動時にSGA_TARGETをSGA_MAX_SIZEより大きい値に設定すると、そのSGA_TARGETに対応してSGA_MAX_SIZEが増加する。

PGA_AGGREGATE_TARGETを使用すると、すべての専用セッションの作業領域のサイズ設定が自動的に行われ、これらのセッションについてはすべての*_AREA_SIZEパラメータが無視される。ある時点での、インスタンスのアクティブな作業領域で使用可能なPGAメモリーの合計は、パラメータPGA_AGGREGATE_TARGETから自動的に導出される。

この量は、PGA_AGGREGATE_TARGETの値から、システムの他の構成要素により割り当てられたPGAメモリー(たとえば、セッションにより割り当てられたPGAメモリー)を差し引いた値に設定される。
結果として、PGAメモリーは、特定のメモリー要件に基づいて個々のアクティブな作業領域に割り当てられる。

初期化パラメータWORKAREA_SIZE_POLICYは、セッション・レベルおよびシステム・レベルのパラメータで、
設定できる値はMANUALまたはAUTOの2つのみです。デフォルトはAUTOです。
データベース管理者は、PGA_AGGREGATE_TARGETを設定して、次にメモリー管理モードを自動から手動に切り替えます。

SQLチューニングの備忘録


前置き:SQLチューニングをまとめてみました。メモですので、間違いがあるかもしれません。

SQLチューニングは、処理時間・アクセスする必要のあるデータ・ブロック数を減らすことを目的とします。
結果、データベース・バッファ・キャッシュがより効率的になり、キャッシュ・ミスの場合でも必要なデータ・ファイルへのI/Oは小さくなる。システム負荷を低減することが可能です。

用語:オプティマイザとは、表へどのような経路でアクセスし、どのような順番、方法で結合するか実行計画を効率的に決定するのがオプティマイザの役割。Oracle 10gからはコストベースのオプティマイザのみがサポート対象。
統計情報は、DBMS_STATSパッケージもしくはANALYZEコマンドで取得します。

<レコードアクセス方法>

1.全表スキャン
2.ROWIDスキャン
3.索引スキャン
がある。
索引スキャンでは、「索引ブロックの読み込み+データ・ブロック」の読込みとなる。
検索したいレコード件数が、レコード全体の5~15%程度までの場合は、索引スキャンの方が効率的といわれています。

<結合方法>

1.ネステッド・ループ結合
ネステッド・ループ結合を効率化するためには、レコード数がより少ない方を外部表とする。
レコード数に大差がない場合には、結合条件列の索引スキャンがより効率的な方を内部表とする。

2.ソート/マージ結合
結合対象が多く、なおかつ結合条件が等価条件ではない場合に使用する。

3.ハッシュ結合
結合条件に等価条件が指定され、大量のレコードなど表の大部分を結合する場合に有効な結合方法。

<SQLチューニングが必要なもの>

1.1実行当たりの実行時間が長いSQL
2.ディスク読み取りブロック数が多いSQL
3.バッファの読み取り数が極端に多いSQL
4.実行回数が極端に多いSQL

<対象SQLの取得方法>

動的パフォーマンスビューより、取得します。
主にV$SQL、V$SQL_TEXT、V$SQL_PLANの3つとなります。共有SQL領域に保持されているSQLの情報を表示します。
V$SQL_TEXTを参照することで完全なSQLを取得することが可能。

↓全文を取得するSQLの例

set pages 100 feed off timing off echo off lines 140
SELECT sql_text
FROM v$sqltext
WHERE hash_value=?
and address='?'
ORDER BY piece;

<SQLの記述を統一する>

実行されるたびに条件の値が異なるSQLを実行しているアプリケーションでは、
リテラル値部分を変数化し、SQLの記述を統一する。

<SQL対処例>

■NULL値の検索
‐列名 IS NULL ‐NULL値を別のデータに置き換える
‐ビットマップ索引を使用する

■暗黙の型変換
‐比較するデータ型を列のデータ型に合わせる

■索引列に対して、関数や算術を実施
‐関数索引を使用する(Oracle 9i以上で使用可能)

■LIKEの中間一致、後方一致
‐できるかぎり使用を控える

■!=、<>の使用
‐inで置き換える(可能な場合)

★複合索引の有効利用は、検索性能を向上させるうえで、利用できる機会が多い。

■件数の多い表同士を結合し、全レコード出力する場合
ネステッド・ループ結合→不向き
ソート/マージ結合→結果を結合列でソートして出力する場合に有効。
双方の結合列にNOT NULL制約が指定されており、索引が存在する場合、非常に効率的
ハッシュ結合→システム・リソースに余裕がある場合には最適

■一方の表に絞り込み条件を指定して表を結合し、少数のレコードを出力する場合
ネステッド・ループ結合→目安として索引を使用して表の15%以内の絞り込みであれば最適
ソート/マージ結合→不向き
ハッシュ結合→目安として索引を使用して表の15%以上の絞り込みで、なおかつ等価条件があれば使用を検討

★結合条件が等価条件でないためにハッシュ結合を行えない場合以外は、大量の結合処理では、まずハッシュ結合!

■更新系
‐MERGE文を利用する
‐ダイレクトロードインサートを利用する
‐パラレルDMLを利用する

★パラレルDMLを利用するには以下の手順で設定が必要

1.初期化パラメータ「PARALLEL_MAX_SERVERS」に適切な値を設定する

2.パラレルDMLを実行するセッションでパラレルDMLの利用を可能にする
SQL> alter session enable parallel dml;

3.パラレルDMLのSQLを実行する

SQL> DELETE FROM lineitem;


↓確認
SQL> SELECT table_name,degree

  2  FROM user_tables

  3  WHERE table_name='LINEITEM';



TABLE_NAME                     DEGREE

------------------------------ --------------------

LINEITEM                                1
DEGREEが「1」の場合、パラレル度が設定されていません。

4.パラレルDMLの実行を確認

SQL> SELECT * FROM v$pq_sesstat;


<その他>

・駆動表を意識してSQLを書く
・NOT IN ではなく NOT EXIST を使う
・where 条件には '%値%' はなるべく使わない
・EXPLAINやTRACEの使い方
・Where句の解析順序とインデックスの作成順
・Like文の使い方の注意
・Where句の左辺での関数使用の禁止
・ヒント文の使い方に注意
・外部結合しまくりのSELECT句はできるかぎり書かない。
・FROM句にテーブル名をいっぱい書かない。
・半角カタカナ使わない。
・GOTOは使わない。
・暗黙カーソルでの問合せは使わない。
・SQL構文は、すべて大文字で記述したほうがパフォーマンスがよくなる。
また、PL/SQLについてもすべて大文字で記述したほうがよい。

以上。

2011年8月9日火曜日

またまた、いまさらOracle9i

Oracle9i カーソル・エラーについて

■カーソル数不足によるエラー

【エラーの内容】

[エラー番号] ORA-01000
[エラーメッセージ] 最大オープン・カーソル数を超えました。
[エラー原因] ホスト言語プログラムがオープンしようとしているカーソルの数が多すぎます。1ユーザー当たりのカーソルの最大数は、初期化パラメータOPEN_CURSORSによって決定されています。
[エラー処置] プログラムを変更して、使用するカーソルの数を減らしてください。繰り返しエラーが発生する場合は、Oracleを停止して、OPEN_CURSORSの値を大きくしてから、Oracleを再起動してください。

PL/SQLストアド・プロシージャで使用するカーソルは、検索結果のみをクライアント側で取得できるので、非常に効率的です。
但し、プログラミング時にカーソルの使い方を正しく意識していないと、「ORA-01000」エラーとなるケースがあります。

OPEN_CURSORSの値を増やせば、確かに上記のエラーが発生する確率を減らすことはできます。しかしながら、逆にリソースを多く消費するようになり、Oracleのパフォーマンスが全体的に低下させてしまいます。

カーソルというもの自体リソースを多く消費するものなので、大量に使用するというのはアプリケーションの仕組み的にやはり好ましくありません。
上記のエラーを回避するにはOPEN_CURSORSの値を増やすよりも、むしろアプリケーションで必要以上にカーソルを使用するようなロジックになっていないかどうかをまず見直すことのほうが大事です。

ただ、現状長年動作しているプログラムですので、スレッドなどを使用しているマルチタスクのアプリケーションや、アプリケーション修正時の2次障害を考えると、アプリケーション側での対応は難しい状況と認識しています。ですので、初期化パラメータファイル(init.ora)の 「OPEN_CURSORS」の値を変更することになるかと思います。その際に変更値の指針が必要です。

初期化パラメータ「OPEN_ CURSORS」のデフォルト値はOracle8i以前では「50」、Oracle9iとOracle 10gでは「300」がデフォルトの値です。


<以下確認用>
SQL>SHOW PARAMETER OPEN_ CURSORS
リスト1 初期化パラメータ「OPEN_ CURSORS」を確認

変更に当たって、カーソルがどの程度開かれているかを確認

「V$OPEN_CURSOR」で確認できます。このビューは、各ユーザー・セッションが
現在すでにオープンして解析しているカーソルを示します。
SQL>DESC V$OPEN_CURSOR
列名 データ型 格納されているデータの内容
SADDR RAW(4 | 8) セッション・アドレス
SID NUMBER セッション識別子
USER_NAME VARCHAR2(30) セッションにログインしているユーザー
ADDRESS RAW(4 | 8) HASH_VALUE とともに使用され、セッションで実行されているSQL 文を一意に識別する
SQL_TEXT VARCHAR2(60) オープン・カーソルに解析されるSQL文の最初の60文字

V$OPEN_CURSOR動的パフォーマンスビュー
セッションごとに使用されるカーソルの数をユーザー名をキーにして検索します。
「OPEN_CURSORS」の値近くまで増大している場合、値を変更する必要があります。
SQL>
SELECT
  SID AS セッションID,
  USER_NAME AS ユーザ名,
  COUNT(SID) AS カーソル数
FROM V$OPEN_CURSOR
WHERE USER_NAME = '[ユーザ名]'
GROUP BY SID,USER_NAME;
    
SELECT s.sid,username,
 (SUM(DECODE(name,'opened cursors cumulative',value,0))) "OPENED CURSOR", --セッション開始以降のオープン・カーソル合計数
 (SUM(DECODE(name,'opened cursors current',value,0))) "CURRENT CURSOR" --現行オープン・カーソル数
FROM v$session s,v$sesstat se,v$statname sn
WHERE se.sid = s.sid
 AND se.statistic# = sn.statistic#
 AND name in ('opened cursors cumulative','opened cursors current')
 AND username is not null
 --and s.sid=142
GROUP BY s.sid,username
ORDER BY "OPENED CURSOR" desc,"CURRENT CURSOR" desc;
<カーソルクローズについての参考>

次のSQLを実行した場合,その時点で開いているカーソルはすべて閉じられます。
また,暗黙的ロールバックありのエラーが発生した場合にも,カーソルはすべて閉じられます。
・定義系SQL(クライアント環境定義PDCMMTBFDDLにYESを指定している場合)
・PURGE TABLE文
・COMMIT文
・DISCONNECT文
・ROLLBACK文
・PREPARE文(クライアント環境定義PDPRPCRCLSにYESを指定している場合)
・内部DISCONNECT(DISCONNECT文を実行しないでUAPを終了する)

ただし,ホールダブルカーソルは,COMMIT文を実行した場合は閉じられません。
PURGE TABLE文を実行し,ホールダブルカーソルで開いている表が検査保留状態に設定された場合,ホールダブルカーソルは閉じられます。
ALLOCATE CURSOR文 形式2で手続きが返却した結果集合の組に割り当てられたカーソルに対してCLOSE文を実行した場合,
現在参照している結果集合の次の結果集合が存在するときは,現在参照している結果集合は閉じられます。カーソルは次の結果集合を参照し,
次のリターンコードが設定されます。

SQL連絡領域のSQLCODE領域に121
SQLCODE変数に121
SQLSTATE変数に'0100D'
また,このときカーソルは開いた状態となります。

一方,次の結果集合が存在しない場合は,現在参照している結果集合は閉じられ,次のリターンコードが設定されます。
SQL連絡領域のSQLCODE領域に100
SQLCODE変数に100
SQLSTATE変数に'02001'
また,このとき拡張カーソル名はどのカーソルも識別しなくなります。

2011年8月5日金曜日

Oracle9i初期設定ファイルについて(いまさら)

ハード障害でOracle9iの設定をしました。いまさらですが・・・


初期設定ファイルについて

初期設定ファイルは二つもある。
優先順位や編集方法を記載します。

Oracle8までは、初期設定ファイル(init*.ora)を変更して再起動の手順でOK

初期設定ファイル=pfile pfileは、テキストで編集可能。

Oracle9iからは、「サーバーパラメータファイル」が追加されました。=spfile

spfileは、バイナリでテキストで編集不可です。
全部、sql*plusからの命令で編集

例:
SQL >alter system set sga_max_size = 300M scope = spfile;

<パラメータいろいろ>

db_block_size
db_cache_size
db_name
background_dump_dest
control_files
fixed_date
instance_name
java_pool_size
large_pool_size
service_names
sga_target
sga_max_size
shared_pool_size

pfileとspfileという二つの初期設定ファイルが存在します。

<優先順位>

指定したpfile:startup pfile='[ファイル]'→spfileSID.ora→spfile.ora→initSID.ora→init.ora

<spfileとpfileの格納場所>

SQL > select value from v$system_parameter where name ='spfile'

→表示されない場合pfileが有効。

ちなみにpfile格納場所
%ORACLE_HOME%\DATABASE\INIT%ORACLE_SID%.ORA


<spfileとpfileの切り替え>

pfile → spfile
SQL> create spfile='ファイル名' from pfile='ファイル名'


spfile → pfile
SQL> create pfile='ファイル名' from spfile

※フルパス記載

初期設定ファイルを変更してサーバーを再起動しないと設定変更が反映されないものと
再起動しなくても設定変更が反映するものがあります。

SQL> create pfile='ファイル名' from spfile
pfileで、その中身を確認。設定変更が反映されているかがわかります。

以上