Oracle Tips
Oracle Tips
ただの覚書です。間違っていたらすみません。
オラクルのオンラインマニュアルは OTN ( から取得可能。
INDEX (検索は、ブラウザの CTRL+F 等を使用してください)
1. テーブルの構造を調べるには?
2. ロールバックセグメントが増えすぎて困ってます。
3. デフラグみたいなのは無い?(断片化の最適化)
4. テーブル一覧が見たい
5. 索引について
6. 接続しているユーザーを見たい。強制切断したい
7. 任意のソート順で、先頭n行だけをとりたい
8. SQL*Plus の初期設定をしたい
9. インポートをコマンドラインから行う
10. エクスポートをコマンドラインから行う
11. 表に項目を追加する、削除する
12. PL/SQL でファイルの入出力を行いたい
13. チューンしたい(アプリケーション編)
14. チューンしたい(オラクル設定編)
15. システムこけたんで、DB戻したいんですが(RECOVER編)
16. SQL*Loader を使う
17. 新しいインスタンスを作りたい
18. PL/SQL のデバッグする。
19. 表領域の中でユーザーごとの使用量を知りたい。
■ テーブルの構造を調べるには?
DESC テーブル名 /* 単純 */ SELECT /* 項目整理したバージョン */ |
データディクショナリ
項目 | 内容 |
user_catalog | ユーザが作成した表、ビュー、シノニム、順序の情報 |
user_constraints | ユーザが作成した表制約の情報 |
user_indexes | ユーザが作成した索引の情報 |
user_tab_columns | ユーザが作成した表の列情報 |
user_tables | ユーザが作成した表の情報 |
all_tables | ユーザがアクセス可能な表の情報 |
dba_tables | データベース内全ての表の情報 |
dba_tablespases | データベース内全ての表領域の情報 |
dba_users | データベース内全てのユーザの情報 |
■ ロールバックセグメントが増えすぎて困っています。
・ 標準では設定されていない optimal サイズを指定する。(DBA STUDIOから作成では未設定)
ALTER ROLLBACK SEGMENTロールバックセグメント名 STORAGE(OPTIMAL 最適サイズ); |
○縮小のタイミング 割り当ての解除はトランザクション終了後すぐには行われない。 |
・ shrink でサイズを強制的に縮小する
ALTER ROLLBACK SEGMENT ロールバックセグメント名 SHRINK TO サイズ; |
■ デフラグみたいなのは無い?(断片化の最適化)
・インデックス用
"どのようにパウダーコートへ"
ALTER INDEX 索引名 COALESCE; |
・テーブルスペース用
ALTER TABLESPACE テーブルスペース名 COALESCE; |
・断片化を調べる(テーブルスペース)
SELECT TABLESPACE_NAME,BLOCK_ID,BYTES,BLOCKS FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME=テーブルスペース名 ORDER BY BLOCK_ID; |
■ テーブル一覧が見たい
SELECT * FROM TAB; /* 接続ユーザーで見れるオブジェクト(表、ビュー) */ SELECT * FROM USER_TABLES; /* 接続ユーザーが作成した表 */ |
■ 索引について
・標準B*ツリー
多量データ検索(たとえば10万件のトランザクションデータを検索)には向いているが、数件しかないデータには不向き。
・ビットマップ索引(R7.3.2以降)
列値の種類が少ない列(フラグ、性別など)が多く、OR 条件で抽出することが多いデータに向く。
・逆キー索引(R8.0.x以降)
■ 接続しているユーザーを見たい。トランザクション制御情報が見たい。強制切断したい
SELECT * FROM V$TRANSACTION |
ALTER SYSTEM KILL SESSION 'セッションID(SID),シリアル番号(SERIAL#)'; |
■ 任意のソート順で、先頭10行だけをとりたい
副問合せとROWNUMを使う(大量データだと検索が遅いけど)
SELECT * FROM (SELECT * FROM 入荷F WHERE ほにゃらら ORDER BY 入荷) WHERE ROWNUM <= 10 |
「コストベース・オプティマイザの拡張:最初のN行の最適化」 (9i 以降) もある。
OPTIMIZERヒントを使ってSQLにヒントを含ませる。
ヒントが使用されると、すべてのセッションおよび初期化設定よりも優先されます。
SELECT /*+ FIRST_ROWS(N) */ .... |
■ SQL*Plus の初期設定をしたい
SQL*Plus 実行ファイルと同じフォルダ(たとえば、C:¥Oracle¥Ora81¥bin)に login.sql を作成し、実行スクリプトを作成する。
define_editor=c:¥progra‾1¥hidemaru¥hidemaru.exe ← 編集用のエディタを秀丸にする set line 2000 |
■ エクスポートをコマンドラインから行う
exp username/password@database file=expdat.dmp |
■ インポートをコマンドラインから行う
キャスター角は何ですか?
imp username/password@database fromuser=srcuser touser=destuser file=expdat.dmp |
■ 表に項目を追加する、削除する
ALTER TABLE テーブル名 ADD ( 追加する列名 タイプ ) |
ALTER TABLE 表名 DROP COLUMN 列名 ; /* 1列のみ */ ALTER TABLE 表名 DROP (列名, 列名…) ; /* 複数列可能 */ |
■ PL/SQL でファイルの入出力を行いたい
UTL_FILE を使用すると、テキストファイル入出力を PL/SQL で行える。
1.init.ora にファイルI/Oが行えるフォルダ指定をする
utl_file_dir=C:¥LOG,C:¥TEMP |
2.サンプルがここに
■ チューンしたい(アプリケーション編)
1. 索引の使用とSQLキャッシュ
LIKE を使って中間一致での検索、|| や、SUBSTR などで索引を加工しても索引が利用されない。
コストベースの場合のSQLを書く上での注意点
索引中にNull値が存在しないため全表走査となります !=, <> を指定すると全表走査になります 索引列に対して計算式を適用すると全表走査になります OR検索は、指定列全てに索引がないと全表走査になります 結合索引を使用する場合、順序に注意する Like句で、前に'%','_'を付けたり、Not Likeを指定すると全表走査されます。|| や、SUBSTR などで索引を加工しても索引が利用されない。 Order By句では、表にNot Null指定されてる場合に限り索引が使用されます。 Group By句を使用すると、常に全表走査されます。 |
SQL の意味としては、 ・SELECT * FROM F_ZAIKO; と Select * from f_zaiko; は、同意です。 しかしOracleの解析エンジンは一字一句同じでなければ、別物になる。名称のつけ方にルールを付ける! |
表Tの索引がIDX1,IDX2とすると。 T.IDX1 = 1 とか、T.IDX1 = 1 AND T.IDX2 = 2 は良い?、T.IDX2 = 2 は索引が使われない。 |
2. 使われていない索引があるかどうか、付与されている索引が妥当であるかをチェックする
・索引がある → SELECT 時に効果あり。
・索引がつく → INSERT 時に遅くなる。(大量のデータ追加の場合は一時的にキーをはずす)
・不要な索引は削除する。
・未使用索引の監視(9i以降)
→ USED 列が NO の個所は使われていないことになる。
SELECT * FROM V$OBJECT_USAGE; |
3. 索引が使われているかをチェックする(AUTOTRACE編)
Oracleがトレースモードで動いていなくても実行可能な解析方法である。
事前準備
SQL> connect sys/change_on_install@expserver 接続されました。 SQL> @K:¥oracle¥ora81¥sqlplus¥admin¥plustrce.sql /* plustrace ロールを作成 */ ... SQL>grant plustrace to scott; /* AUTOTRACEを取得するユーザにロールを付加する */ 権限付与が成功しました。 SQL>connect scott/tigee.ename, e.deptno, d.dname from dept d, emp e2 where 3 d.deptno = e.deptno 4 and e.deptno = 20; EMPNO ENAME DEPTNO DNAME 実行計画 統計 SQL> set autotrace off /* AUTO TRACE を使用しない */ 重い袋ショックスプリングコイル |
→ ここから何がわかるのか?
統計情報
項目 | 意味 |
recursive calls | |
db block gets | CURRENT ブロックが要求された回数 |
consistent gets | |
physical reads | |
redo size | 生成された REDO の合計バイト数 |
bytes sent via SQL*Net to client | |
bytes received via SQL*Net from client | Oracle Net |
SQL*Net roundtrips to/from client | クライアントに送られた Oracle Net メッセージとクライアントから受信した Oracle Net のメッセージの合計数 |
sorts (memory) | メモリー内で完全に実行され、ディスク書き込みを必要としなかったソート操作の数 |
sorts (disk) | 少なくとも1回のディスク書き込みを必要としたソート操作の数 |
rows processed | 操作中に処理された行数 |
4. 索引が使われているかをチェックする(SQL Trace編)
5. 索引を再作成する
レコードを削除してもインデックスの内容は更新されない。
レコード上削除されても、インデックスには残っている!
たとえば、年度更新で昨年のトランザクションデータを削除していても
インデックスには残っており、アクセス対象となっている!
データを削除してもパフォーマンスのためのインデックスが逆効果になる。
→頻繁に更新される場合はインデックスの再構築を行う
ALTER INDEX 索引名 REBUILD; /* 明示的に再構築を行う */ |
DROP INDEX 索引名; CREATE INDEX 〜 /* 索引を削除し、作成することで再構築と同意 */ |
6. 更新するときに、ROWID を使ってレコードを指定する
PL/SQL の場合は、CURRENT OF カーソル名 を使って高速化する。
そのときに SELECT は、FOR UPDATE を使用してロックする必要がある。
■ チューンしたい(オラクル設定編)
アプリケーションチューンを先に行う!(効果大)
それでもだめなら or とりあえずやるなら、メモリの使用が標準だとへぼいので色々とチューンしてやりましょう。
1. ANALYZE コマンド
Oracleのオプティマイザにはコストベースとルールベースがある。
・ルールベース(デフォルト)
OracleはSQL文のWhere句などの構文情報(Where句の順序には影響されない)と索引情報からアクセスパスを1〜15のランク付けを行い、一番高いランクのパスを選択することになります。
ルールベースでは、コストベースと違い、データ容量や分布率が変動しようとも、同じSQL文では毎回同じアクセスパスを選択し、例え全表走査の方が高速な場合でも索引が使用できる状態であれば、索引を使ったアクセス・パスが選択されます。
・コストベース
ANALYZEコマンドにより採取した統計情報を基に実行計画を立てる。
→ データ量が大幅に変動した際に手動で ANALYZE 等を行う必要がある。
コストベースオプティマイザを使用するためには、INIT.ORAの初期化パラメータのOPTIMIZER_MODEをCHOOSE(デフォルト)にセットし
、対象となる表に対してANALYZEを実行する。
ANALYZEには、すべてのデータを読み取る方法と一部のデータをサンプリングする方法がある。
データサイズが大きく全データを調べていたのでは時間がかかりすぎる場合には、10%程度でサンプリングしてみる。
表の全データを読み取り統計情報を収集する
ANALYZE TABLE 表名 COMPUTE STATISTICS; |
10%のデータをサンプリングし統計情報を収集する
ANALYZE TABLE 表名 ESTIMATE STATISTICS SAMPLE 10 PERCENT; |
表の統計情報を削除する(コストベースからルールベースに戻す)
ANALYZE TABLE 表名 DELETE STATISTICS; |
コストベースの情報を確認する。
SELECT TABLE_NAME, NUM_ROWS, AVG_ROW_LEN, BLOCKS FROM USER_TABLES; |
2. メモリ設定
1.状況確認
SQL*Plus に system/manager でログインします。
事前に設定情報を確認するのに show parameters/parameters buffer/sga コマンドで表示します。
SQL> connect system/manageの設定 init.oraファイル中のtimes_statisticsをTRUEに設定する. 3. Shared Pool Size の決定 ■ バックアップをとりたい(バックアップ編) Oracle のマニュアルの 1.OSレベルでバックアップをとる(構造を同じにして、ファイル自体をコピーし、退避する) ■ システムこけたんで、DB戻したいんですが(リカバリ編) Oracle のマニュアルの ARCHIVELOG運用かNOARCHIVELOG運用かでリカバリ方法が異なる。 ■ SQL*Loader を使う ■ 新しいインスタンスを作る DB Assistant で作成する(簡単) コマンドをたたいて手動で作成する(面倒) netstat start で確認 Create DATABASE CREATE ROLLBACK SEGMENT RB1 CREATE TABLESPACE TP1 CREATE TABLESPACE USER1 データディクショナリ作成 catalog.sql ... 一般ユーザ作成 ■ PL/SQL のデバッグ DBMS_OUTPUT パッケージの PUT_LINE メソッドを使うことで、スタックに追加される。
■ 表領域の中でユーザーごとの使用量を知りたい。
■ キャッシュのヒット率
■ 重複する行を調べる 集合演算子 INTERSECT を使用する。
■ 片方に存在する行を調べる 集合演算子 MINUS を使用する。(table1 にあって table2 にはない行が返される)
■ ノートPCに Oracle 8i を入れましたがメモリがいっぱいです。 java_pool_size ■ SQL*Loader の使い方 カンマ区切りデータ用の制御ファイル例 カンマ区切りでも基本は同じです。今度の例ではREPLACEの代わりにAPPENDを使っているので、既存の行は削除せず追加しようとします。「PRESERVE BLANKS」はカンマの前後の空白も削除せずに、データの一部とみなす指令です。 LOAD DATA 最後に固定長の場合です。下のように、 LOAD DATA 数値はZONED、文字列はCHARなどを使います。日時型は上のように、書式を添えて指定することになるでしょう。定数はCONSTANT句で定義できます。 SQL*Loaderのデータファイルの文字コードは、環境変数NLS_LANGで制御できます。ですから、内部コードが日本語EUCのOracleデータベースに、シフトJISのデータファイルからデータを投入することも可能です。 UNIX上のOracleで注意が必要なのは改行コードです。データファイルの改行コードがCR+LF(Win32形式)だと、うまくいきません。FTPの際に必ず改行コードをLF(UNIX形式) に変換しておく必要があります。 These are our most popular posts:データベース管理スタート・ガイドデータベース・システムにシステム記憶域を割り当て、将来の記憶域要件を計画します。 .... データベースを作成するには、Database Configuration Assistant(DBCA)を使用し てインストール時に作成する方法と、データベースを作成するためのスクリプトを用意 ... read moreパート II ZFS、ブート、Solaris ゾーン - Oracle DocumentationOracle Solaris 10 9/10 インストールガイド (インストールとアップグレードの計画) .... ミラー化された ZFS ルートプールは、インストールのあとで追加のディスクを接続または 追加して作成することもできます。 .... ブートローダーは、システムの電源を入れたあと 最初に実行されるソフトウェアプログラムです。x86 ベースのシステムの電源を入れると 、BIOS (Basic Input/Output System) により、CPU、メモリー、および .... 現在稼働して いるブート環境から新しいブート環境を作成する方法は同じままですが、例外が 1 つ あります。 read moreH8マイコンボードで動作する組み込みOSを自作してみよう!(3):OSの ...2011年6月14日 ... また、開発環境の構築方法は連載第1回で説明してありますので、興味のある方はぜひ ソースコードをビルドし、実機での ... 注1:「ブートローダー」はOSの"本質"ではないため 、一般的に軽く見られがちですが、マイコンの動作を理解する上では ... read moreSQL Developerの概要および使用方法新しいデータベース接続を作成するには、「Connections」ナビゲータの「Connections」 ノードを右クリックして、「New ..... 使用できない索引を再度使用できるようにするには、 再構築するか、または削除してから再作成する必要があります。 .... 統計は、分析する オブジェクトにアクセスするSQL文の実行計画を選択するために、Oracle Database オプティマイザによって使用されます。 ... 列識別子用のヘッダー行を含むカンマ区切り 値)、SQL挿入(INSERT文)またはSQL*Loader(SQL*Loader制御ファイル)のいずれ かです。 read more
登録:
コメントの投稿 (Atom)
|
0 コメント:
コメントを投稿