oracle

表の断片化の解消

ALTER TABLEでMOVEを指定すると表の断片化を解消できる。本来は表領域を変更する際のコマンドだがこのように使うこともできる。 --テーブルのみ再構築 ALTER TABLE hoge_table MOVE; --パーティション表の場合 ALTER TABLE hoge_table MOVE PARTITION;

SEQUENCEの値を変更

データをインポートしたあとにシーケンスオブジェクトを テーブルの最大値に合わせて更新するプロシージャ。 DECLARE --スキーマ情報★都度書き換えること CONS_USERID CHAR(12):= 'HOGE_SCHEMA'; --変数 WK_SEQ_NO NUMBER; BEGIN --------------------------…

PARTITION TABLE

COL_LEYの値によってパーティションを分けるLISTパーティションの例 CREATE TABLE TBL_HOGE ( COL_LEY CHAR(6) NOT NULL, COL_VALUE VARCHAR2(12))PARTITION BY LIST (COL_LEY)( PARTITION PARNAME_1 VALUES ('福岡'), PARTITION PARNAME_2 VALUES ('熊本'),…

OracleとSQLServerのロック2

Oracle →別トランザクションの更新中データに対して、変更前のデータを読み取ることができる。optimistic(楽観的同時実行制御) MVCCと呼ばれる同時実行性向上の仕組みのため SQL Server →デフォルトでは更新中のデータはロックがかかるためアクセスできない …

OracleとSQLServerのロック

どちらも「READ COMMITTED」がデフォルトとなっている。ただ、SQL Serverには「READ_COMMITTED_SNAPSHOT」のオプションがあり、その値によってOracleと挙動が違う。※READ COMMITTED・・・コミットされてないデータは読み取れない 「READ_COMMITTED_SNAPSHOT…

SQL DeveloperからLoader作成

SQL Developerの機能でローダーのctlファイルをエクスポートできる。手順は以下の通り 1.作成したいテーブルを右クリック→「エクスポート」 2.データのエクスポート→フォーマット「loader」を選ぶ 3.別名保存を「個別のファイル」とし、出力先パスを選ぶ こ…

Oracleのデフォルト値

Oracle11gではNOT NULL列にDEFAULT句を指定すると、デフォルト値はメタデータとして格納される。 例えば、default "0"と設定した場合、データブロックに"0"という値は格納されておらず、 Nullの値を"0"に置き換えるようにDBエンジン上で動作している。 通常…

週の開始日を取得する

TRUNC関数の引数に'DAY'を指定すると引数の日付に対する 週の先頭日を取得することができる。 select TRUNC (TO_DATE('2015-12-28') ,'DAY' ) From DUAL ※NLS_TERITORY = Japan における週の初めは日曜日に定義されている。 動作確認環境:Oracle 12c

DDLのエクスポート

SQL Developerを使用するとDDL文を一括でエクスポートすることが可能。 手順は以下の通り 「ツール」→「データベースのアンロード」 なお、dbms_metadata.get_ddlでSQLの結果として取得することもできる SELECT dbms_metadata.get_ddl('TABLE','MBH_HKATRYU'…

テーブルの最小値、最大値の確認

テーブルの各カラムの最大値、最小値を確認するPL/SQL。 データ量増大で桁あふれが近々発生しないか監視するためなどに使用。 --★結果の出力先を指定 SPOOL P:\HOGE.TXT; SET linesize 2000 SET SERVEROUTPUT ON; DECLARE --カーソル定義 CURSOR CURCOLUMNS …

テーブルをCSV形式にエキスポート

Oracleの全テーブルをCSV形式のテキストに出力するvbs。 使うときは★の箇所を書き換えること。 また、データ量の多いテーブルにアクセスする場合は注意すること (テーブル名でのフィルタの機能などをうまく活用すること) Option Explicit '***************…

テーブルの件数を取得

現時点のテーブルの件数一覧を取得するSQL SELECT TABLE_NAME as テーブル名, TO_NUMBER( EXTRACTVALUE( XMLTYPE( DBMS_XMLGEN.GETXML('SELECT COUNT(*) C FROM '||TABLE_NAME)) ,'/ROWSET/ROW/C')) as 件数 FROM USER_TABLES WHERE TABLE_NAME NOT LIKE 'BI…

テーブルスペースの使用率を確認する

テーブルスペースのサイズ、空き領域はdba_data_files、dba_free_spaceで確認できる。 それらを利用した使用率を確認するSQLは以下の通り。 select tablespace_name, to_char(nvl(total_bytes / 1024,0),'999,999,999') as "全サイズ(KB)", to_char(nvl((tot…

統計情報取得の並列化

統計情報を取得する際に以下のようにDEGREEオプションを使用することでパラレルに 取得を行う事ができる。 BEGIN DBMS_STATS.GATHER_TABLE_STATS( OWNNAME => 'user_hoge' ,TABNAME => 'tab_hoge' ,DEGREE => 5 ); END; /なお、デフォルトのDEGREE値は1でテ…

ヒストグラム

列データの中身の分布のこと。 この中身の値の種類・数に応じてオプティマイザが実行計画を考える。 なお、データの種類に応じて以下のヒストグラムがある (Oarce 12cからはさらに増えているらしい) ・頻度分布ヒストグラム データの種類が少ない場合のヒス…

KEEPバッファキャッシュ

バッファキャッシュは通常のDEFAULTの他に優先してキャッシュするための領域として KEEPバッファキャッシュ領域がある。 よく使用するテーブル・インデックスについてはこちらに載せておくとレスポンスが向上する。 ※キャッシュ領域が別というだけでメモリが…

パラレルクエリ

処理の遅いSQLを拘束に処理したい場合は以下のようにパラレルで実行するように ヒント句を使用する方法がある。 SELECT /* + PARALLEL (tblhoge, 4) */ * FROM tblhoge; tblhoge⇒パラレルでアクセスするテーブル名 4→多重度 ただし、常に高速とは限らない。 …

DataPump

Oracle10gR2からexp/impがサポートされていない(使うことは可能)。 ということでDatapumpを使用してみたのでメモ。 DataPumpを使用するためには以下のように、バックアップファイルを扱うディレクトリオブジェクトを作成して権限を与えておく必要がある CREA…

実行計画を調べる

SQLの先頭にEXPLAIN PLAN FOR を付けると実行計画を調べることができる。 なお、実行計画を取得するだけでSQLは実際には実行されない。 EXPLAIN PLAN FOR SELECT * FROM HOGE WHERE HOGE_ID = '001'; 上記で取得した実行計画を表示するのは以下の通り SELECT…

バインド変数の値を確認する

実行されたSQLで使用されたバインド変数の値はV$SQL_BIND_CAPTUREで確認することができる。 使用例 SELECT V$SQL_BIND_CAPTURE.SQL_ID, V$SQL.SQL_TEXT, V$SQL_BIND_CAPTURE.NAME, TO_CHAR( LAST_CAPTURED, 'YYYY/MM/DD') LAST_CAPTURED_DATE, TO_CHAR( LAST…

統計情報の履歴

統計情報はデフォルトの設定で自動的に履歴が一定期間保存されている(たしかOracle10gくらいから) その履歴を使用すると統計情報を過去の状態に戻すことができる 現在の統計情報の履歴の保存期間を取得する SELECT DBMS_STATS.GET_STATS_HISTORY_RETENTION()…

デッドロックのタイムアウト

Oracleでデッドロックが発生した場合はDBMSがそれを検知した時点で例外を発生させる。 また、デッドロックまでの待ち時間を変更したるすることはないっぽい。 よく考えてみると2つのトランザクションが相互にロックし合っているためどちらかを終了しないと…

ORA-00060

ORA-00060: リソース待機の間にデッドロックが検出されました。デッドロックが発生したときのエラー。 調査方法は以下の通り。 1.初期化パラメータに指定された場所にトレースファイルが出力されるのでその場所を確認する(以下、出力先を確認するSQL) SELE…

LEADINGヒント

結合順序を指定するヒント。 ORDEREDヒントはFROM句に記述された順だが、このヒントでは結合順を指定することができる。 SELECT /*+ LEADING (tblB, tblA) */ tblA * FROM tbl_AA tblA tbl_BB tblB WHERE tblA.HOGECD = tblB.HOGECD(テーブル名に別名を使用…

ORDEREDヒント

結合順序を指定するヒント。 テーブルの結合順序と結合アルゴリズムを指定することができる。 以下、使用例 SELECT /*+ ORDERED */ tblA * FROM tbl_AA tblA tbl_BB tblB WHERE tblA.HOGECD = tblB.HOGECDORDEREDヒントを使うとFROM句に指定した順で表結合が…

ロックしているテーブルを探す

V$LOCKED_OBJECTを使うとロックしているテーブルを調べることができる SELECT V$SESSION.SID, DBA_OBJECTS.OBJECT_NAME, V$SESSION.OSUSER, V$SESSION.PROGRAM, V$SESSION.MACHINE , V$SESSION.CLIENT_IDENTIFIER FROM V$LOCKED_OBJECT LEFT JOIN DBA_OBJECT…

ORA-01000: 最大オープン・カーソル数を超えました。

1セッションでオープン可能な最大カーソル数を超過した場合に発生するエラー。 原因を調査する方法は以下の通り。 初期化パラメータに設定されている最大カーソル数を調べるSQL SELECT VALUE FROM V$PARAMETER WHERE NAME ='OPEN_CURSORS';開いているカーソ…

V$SQLSTATS

Oracle10g R2より容易されたビュー。 V$SQLよりパフォーマンスにすぐれ、共有プールから消えても参照でき保持期間も長い。 SELECT SQL_TEXT ,SQL_ID ,EXECUTIONS AS 実行回数 ,DISK_READS AS ディスクアクセスブロック数 ,BUFFER_GETS AS メモリアクセスブロ…

tnsnames.oraが上書き禁止

Windows 7でtnsnames.oraを書き換えようとすると以下のようなメッセージが表示されることがある 他のプロセスで使用しているため編集不可(上書き禁止) これはUACの設定レベルがデフォルトのままだと発生するので以下の手順でUACの設定レベルを低くすること…

テーブルの容量計算

テーブルの容量をを求めるには以下の手順で レコードサイズと1ブロックあたりのレコード格納数を求める必要がある。 手順は以下の通り ■レコードサイズの求め方 レコードサイズ=レコードヘッダ+列ヘッダ+列のサイズ - 1)レコードヘッダ →3バイト2)列ヘッ…