4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQL派がOracle11g(+ODP.NET)を触ってみた感想

Last updated at Posted at 2015-03-06

現行の最新は 12c なので、内容は古いかもしれないです。

環境を準備するのがめんどくさい

Oracle初心者がまず陥る罠。
実行環境、開発環境ともに準備するのが非常にめんどくさい。

開発環境を構築する為には、Oracle Client をインストールし、場合によっては TNSの設定も必要になる。
ネットの情報だけでは分かりにくいので、バージョンにあった入門本を購入したほうがよい。
あと、**Oracle Client アンインストールは茨の道。**なかなかきれいに消えてくれない。

なお、MySQLで開発環境を構築する場合、DLLを入れておけば完了。

バージョンに厳しい(ODP.NET)

Oracle Client と、DLLのバージョンが違うと全く動作しない。
その割には、結構バージョンが細かかったりする。

ツール

色々ツールは出ているのだけど、Oracle社の提供しているOracle Sql Developerが個人的にはよいと思う。
実行計画(Explain)を確認しながらのSQLチューニング作業の場合、こういったツールは必須。

phpMyAdmin 的なものもあるのだけど、あまり一般的ではないかも。
phpOraAdmin
http://sourceforge.net/projects/phporaadmin/

Edition

Standard One、Standard、Enterprise など幾つかのEditionがある。
Editionによっては使えない機能があるので注意が必要。

ただ、パラレルクエリー(SQLの実行を並列化する)ぐらいは Standard とかでも利用できたらいいのに、と思う。

SQLのチューニングについて

MySQLに比較してかなり複雑なSQLを記述できる。
ただ一方その複雑さ故に、パフォーマンス向上の為のSQLチューニングに結構な時間を割くことになる。

Oracle はあるタイミング(例えば大幅にデータが追加になった場合)で統計情報をとり、また、SQLの実行計画は統計情報に依存する。
つまり、SQLが変わらなくても実行計画は変わる可能性はある。
MySQLの場合、データ量などによって変わることはないので、それに比べると、賢いといえば賢い。
ただ、統計情報依存の為、適切なデータ量を元にしないSQLチューニングは意味がない。
DBであれば当然の話かもしれないが、Oracleの場合、その傾向がより強い。

テーブルのID自動連番

DBによってバラバラだけど、
Oracleはsequenceチーム、MySQLは自動連番チーム。

フィールド変更について(ALTER TABLE)

MySQLと違い、ALTER TABLE で途中にフィールドを追加、ということができない。
Oracle運用環境で、フィールド末尾に後から追加されたっぽいフィールドがあることが多いのはそのせい。

外部結合

その昔は LEFT JOIN とかがなくて、代わりに(+)というOracle独自の記法を利用していたようです。
標準SQLではないので、割とスルーしてます。

WITH句を利用した再帰SQL

まず、MySQLにはWITH句がない。
他のDBと比較しても、これはちょっと奇妙なことではあると思う。

mysql “with” clause
http://stackoverflow.com/questions/324935/mysql-with-clause

OracleにはWITH句があり、Oracle11gは再帰SQLとしてそれを利用できる。

-- HOGE.ID=10以下のツリー一覧を取得するサンプル
WITH T(ID) AS (
SELECT ID FROM HOGE WHERE ID=10
UNION ALL
SELECT HOGE.ID FROM HOGE WHERE HOGE.PARENT_ID=T.ID
)
SELECT T.ID FROM T;

fetchについて(ODP.NET)

厳密に調べたわけではないので、これは本当に感想。

MySQLと比較して、fetchなどデータ読取速度が少し遅いかもしれない。
というか、SELECT * FROM HOGE とかフィールド数を意識しないで書くと、速度に影響を与えるケースが多い。
パフォーマンスを考慮するなら、他のDBでもあまり変わらないのだろうけど、Oracleの場合、BLOBを使う機会が多いので**(通常の文字列型フィールドは2000文字ぐらいまでしか扱えない)**、尚更そうなのかもしれない。

パーティション分割

Oracle は1テーブルを複数のパーティションに分割することができる。
で、抽出対象が複数パーティションにまたがっている場合、インデックスがあっても読取速度が落ちる。
なお、データ条件によるパーティション振分けもできるので、パフォーマンス要アップ時はそういうことも考慮したりするらしい。

プロシージャ

Oracleのプロシージャは相当強力なんだけど、MySQL派からすると**「それアプリケーション側でやればいいんじゃね?」**的な感じで全く出番がない。
検証作業が大変そうだし、ORMが活用されることが多いので、今後ますます出番が減る予感。
まるっとROLLBACKできるのは素敵なんだけどね。

ネットの情報

当然なのかもしれないが、MySQLと比較して、ネットの情報が少ない
それから、「それぐらいの知識しかないならOracle触らないでください」という説教じみた回答に出くわす機会が多い気がする。

なので、拙い感想ながらも、投稿してみることにしました。

4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?