Oracle学習1

私はSQLに関しては、SQLServerでの開発をしてきましたが、いただく案件にOracleでの開発という文言をよく見かけます。

そのため、自分の学習を兼ねて気になった記事について学習を深めていこうと思いました。

1. そもそもSQLとは

SQLとはデータベースを検索したり更新したりするデータベース言語です。

OracleもMySQLもSQLServerも採用しています。

調べていく中で私が勘違いしていたことはSQLとは略語でなくそれ自体が一つの単語になっていることです。


SQLの前進となったSEQELという言語がありますが、読み方がシーケル、そこからSQLとなったようです。

アルファベット3文字だと何かの略のように感じますが、SQLはSQLです。

1-1. SQLのまとめ

SQLとはデータベースを検索したり更新したりするデータベース言語のこと。

2. Oracleホーム(ORACLE_HOME)とは

Oracleの解説書などでパスの表記に「%ORACLE_HOME%」とあります。

これはORACLE_HOME(Oracleホーム)といいます。

このOracleホームとはOracleのプログラムがインストールされる場所です。

WindowsエクスプローラーからORACLE_HOME(Oracleホーム)をみるとこれほど多くのフォルダがあります。

SQLserverでは、C:\Program Files\Microsoft SQL Server内にインストールされています。

ORACLE_HOMEはユーザーがインストール先を自由に変更できるので、「C:app」のように絶対パスでは表記できません。

よってOracleホームのパスは、「%ORACLE_HOME%」として表記されます。

相対パスで表記しているわけですね。


自由にカスタマイズできる分、バージョンアップによってデフォルトのパスが変わってしまうため、注意が必要になります。

また記事にはこの現象に関しては謎な仕様と書かれています。

開発者は、バージョンによる違いについて理解しておくことで後々役に立つと思われます。

2-1. Oracleホームのまとめ

・ORACLE_HOME(Oracleホーム)はOracleプログラムがたくさん入っているディレクトリ

・バージョンにより場所(パス)は変わる

3. Oracleの3つのサービス

Oracleには3つの代表的なサービスがあります。


1.OracleService

Oracleのサービスエンジンです。


2.TNSListener

TNSListenerはクライアントから要求を受けるサービスです。

TNSListenerが起動していないクライアントから接続できません。


3.OracleDBConsole

OracleDBConsoleはEnterprise Managerを使用するためのサービスです。

※EMを使う方は必須です。

(※EMはコマンドを使わなくてもブラウザからOracleの操作ができるツールです)

これらのサービスは「コントロールパネル」→「管理ツール」→「サービス」から確認することができます。

4. Oracleのサービスの活用方法

これらのサービスは普段の開発中に活用する場面としては、通常の開発中は特に意識をせずに開発を行ってよいが、Oracleにつながらない等の問題発生の際に確認することになる。

4-1. Oracleサーバーにつながらないケース

まれに起こる現象でその際は、OracleServiceとTNSListenerの二つのサービスが正常に起動しているかを確認する必要があります。

Oracleの本体は、OracleServiceであり、TNSListenerはクライアントを受け付けるサービスになります。

この二つがまず正常に起動してない限りOracleにつながることはありません。

再起動等し、正常稼働を確認する必要があります。

4-2. Enterprise Managerにつながらないケース

OracleDBConsoleが起動しているかを確認します。

(OracleDBConsoleはEnterprise Managerのサービスになります。) 起動しているのか、停止しているのか、それを確認する場合は、emctl status dbconsole を実行し確認することができます。

起動していない場合はサービスを起動させます。

4-3. Oracleサービスのまとめ

「Oracleにつながらない」という問題は、「サービスが起動しているか」を最初に疑います。

Oracleの3つのサービスの意味を理解し、原因の解明をしていくことが必要です。

以上、Oracleの3つのサービス、OracleService、TNSListener、OracleDBConsole の解説でした。

5. Oracleの行連鎖・行移行とは


5-1. Oracleの行連鎖とは

複数のブロックにまたがることを行連鎖といいます。


Oracleはデータをブロックという入れ物にいれます。

通常は1つのブロックの中にいれますが、大きなデータの場合はブロック内に納めることが出来ません。

その場合は1つ目のブロック、2つ目のブロックにまたがってデータを入れることになります。


2つのブロックにまたがってしまった状態ではデータを抽出する際にパフォーマンスが遅くなります。

1つのブロックだけであればそのブロック内だけで完結しますが、2つのブロックにまたがっているためどちらのブロックも参照の対象になるからです。

参照先が増えるとその分処理に負荷がかかります。

行連鎖はいくつかのブロックにまたがっている状態をいいます。

5-2. Oracleの行移行とは

行移行は文字通り、行が移動してしまった状態のことをいいます。


例えば、あるブロックにはデータが2つ入っています。データ1、データ2とします。

このデータ2を更新(UPDATE)した結果、サイズが大きくてブロックの空きには入りきらない場合、更新データがブロックに入ることはありません。


この場合は、データ2をこのブロックから移動して別のブロックへいれます。

そして元のブロックには新しいブロックへの目印がつけられます。

この状態でデータ2を検索する場合は、元のブロックを探し、目印をみつけたらさらに新しいブロックへ探しにいきます。

2つのブロックを探すため、その分負荷がかかります。

行移行はこのように入りきらなくなったデータが移動されたことをいいます。

5-3. Oracleの行連鎖と行移行のまとめ

行連鎖は複数ブロックにまたがった状態をいいます。

行移行は別のブロックに移動してしまった状態をいいます。

どちらも複数のブロックにまたがってしまうのでOracleのパフォーマンス低下の恐れがあります。

6. OracleのROWID



Oracleのテーブルには疑似列「ROWID」があります。

これはテーブルを作成時に、内部的に作られる疑似列です。


Oracleの「ROWID」は疑似列という名前のとおり、仮の列・隠し列になっており、通常は表示されません。

「ROWID」とは行のアドレスになります。

7. ROWIDについて


7-1. ROWIDの特徴

OracleのROWIDの特徴はこのようになっております。

・検索が速い
・更新できない

Oracleは索引でも内部的にROWIDを使っています。

ROWIDは検索が速いのが特徴です。


そして、ROWIDは18桁の1意な文字列です。

18桁の中には、データオブジェクト番号、相対ファイル番号、ブロック番号、行番号などを含んでいます。

またROWIDはORACLE内部で処理されるため、SELECTはできますがINSERTやUPDAETはできません。

7-2. ROWIDの注意点

ROWIDは変わることがあるので注意が必要です。

例えば、行を削除してバックアップから戻す場合などはROWIDが変わる可能性があります。

なのでROWIDを元にした処理には注意が必要です。


注意点を読んだ後にID検索として活用できると思いましたが、復元等で変わることがあるので検索には向かずにいるということがわかりました。

7-3. ROWIDを取得する

SELECT * FROM DB では、取得することができず、 SELECT rowid FROM DB と明示的に記入することで初めて取得することができます。

7-4. ROWIDまとめ

類似列は開発者側が開発に盛り込むにはリスキーなものだと思います。

DBの復元等により可変するため、検索の対象として盛り込むには難しいものだと思います。

もし活用するのであれば、ROWIDを使うたびにDB以外のIDを持たせ、変更を感知しROWIDの更新をアプリに反映させる必要があります。