Oracleの嫌いなところ・改善してほしいところ
人気ブログランキング
OracleDatabse の話。
高いとか、態度が悪いとかではなく、機能的なところの話で、普段思う嫌いなところ・改善してほしいところをリストアップします。
Oracle 以外では SQL Server、DB2、PostgreSQL、MySQL、Accessを少し使ったことがある。
(超マイナーなところでNonStop SQL/MXも。本件に関係ないのだが、HPEは、SAP HANA以外はSQL/MXを使っているという記事を見つけてびっくり。あんな、ファイルに毛が得たDBで良くやるよなって思った。)
それらと比較してダメだと思ったり、単に使っていてこれ面倒、何とかならないものか?っていうののどちらかです。
※もちろん、他のDBを使った時に、Oracleだと良いのにな~って思うことも多々あります。隣の芝生は青く見えるってことでしょうか。
昔は人ごとに Oracle のユーザを作って接続させ・権限によってselect出来る・更新できるなんて制御していたケースが良くあった。
SQL Server は USER と SCHEMA が別で、あ~、SQL Server だったら楽なのにな~と思ったことがある。
USER/SCHEMA の話にリンクするのだが、シノニムに足して出来ないことがあるので、イラッとします。
TRUNCATE、マテビューリフレッシュは、シノニム経由では出来ないのです。
脱線しますが、TRUNCATE の権限もムカつきます。
DROP TABLE 権限が無いと TRUNCATE が出来ないってどういうことよ。
TRUNCATE はしても良いけど、DROP はさせたくないって普通にありませんか?
PostgreSQL/MySQL のコマンドラインインターフェイスを使った時に感動しましたね。
・履歴機能(Oracle12cでなんちゃって履歴機能がついたが、上下キーで呼び出せないのでほぼ、役立たず)がある
・CSVへの保存/CSVからの登録が超楽ちん
脱線しますが、SQL Server の 「GO」はウザイですね。2文字入れさせるな!
ラージテキスト(CLOB)でJOIN出来ないのは理解できるが、登録する時の煩雑さ。
JavaなどのORMライブラリ使う時には勝手にやってくれるで良いが、素で使う時のやり難さ。
バージョンが上がるたびに、いろいろ実行計画まわり改善されるのだが、これどうにかならないかな。
1度ダメな実行計画で動き始めたら、それで最後まで動き続ける。
2回目に1回目の問題をフィードバックして別の実行計画を採用する機能はあるのだが、
1回は痛い思いをしなければならないのはどうにかしてほしい。
0.1秒のはずが3秒っていうのならまだ良いが、バッチで1秒のものが5時間とかなったらエライことになる。
1秒で終わると思って実行したけど、1分かかったら、こりゃまずいって途中で止めて(保留が良い)別の実行計画でやり直してほしい。
もちろん、呼び出し側にはエラーなしでシームレスに。
ユーザ定義FunctionをPL/SQLで作っても、結合句などで使うと切り替えが大量に入って重くなる。
SQLエンジンに組み込んで欲しい。もちろん、腐ったもがあった時には切り離す機能付きで。
以前、PL/SQLは暴走したらDBが止まるからという理由でストアドプロシージャ禁止令が出ていたプロジェクトがあったからね。
別に今の最新の開発言語の特徴を全て取り込めと言っているのではないのです。
動的・オブジェクト的なことがある程度出来ると良いのです。
リフレクション系の機能が無いので汎用的なことが出来ない。
APPENDヒントを付けてダイレクトパスインサートした時に、キー重複発生したらちゃんとロールバックして、キーも壊れないのだが、
SQL*Loaderだと重複した状態で入って制約が無効になるのは、どうにかしてほしい。
PGAをもっと使いたいから、MAXを増やすと、全体が増えて足りなくなるとか、
PARALLEL使いたいけど、オンライン中だと裏で動くのに影響出さないようにうまく出来ないってことがあります。
リソースに空きがある場合は、じゃんじゃん使って、他が使い始めたら減らしていくって出来ないの?
CPU/メモリ/ネットワーク/DISKのリソースを有効に使いたい。
日本語で検索できない、他のマニュアルとリンクされていないという不満がある。
機械翻訳で意味不明なのは仕方ないので英語マニュアル読んだりすることもある。
DB2のマニュアルは優秀です。あれを見習ってほしい。
あっても無くてもDROPでエラーにしたくない時、PL/SQLの無名ブロックでディクショナリ探して、動的SQLで実行するって面倒なことをしないといけない。
テーブル名の一部だけ変わる(月ごとにテーブル名が違うとか)などの時、動的SQLにしないといけない。
実在する代表のテーブル名でプリコンパイルしておくとか出来ないですかね?
動的SQLだと読みにくい・USER_DEPENDENCIESが使えないとか・バインド名前ではなく順番でやりにくい
など色々嫌なのだ。
高いとか、態度が悪いとかではなく、機能的なところの話で、普段思う嫌いなところ・改善してほしいところをリストアップします。
Oracle 以外では SQL Server、DB2、PostgreSQL、MySQL、Accessを少し使ったことがある。
(超マイナーなところでNonStop SQL/MXも。本件に関係ないのだが、HPEは、SAP HANA以外はSQL/MXを使っているという記事を見つけてびっくり。あんな、ファイルに毛が得たDBで良くやるよなって思った。)
それらと比較してダメだと思ったり、単に使っていてこれ面倒、何とかならないものか?っていうののどちらかです。
※もちろん、他のDBを使った時に、Oracleだと良いのにな~って思うことも多々あります。隣の芝生は青く見えるってことでしょうか。
USER と SCHEMA が同じ
昔は人ごとに Oracle のユーザを作って接続させ・権限によってselect出来る・更新できるなんて制御していたケースが良くあった。
SQL Server は USER と SCHEMA が別で、あ~、SQL Server だったら楽なのにな~と思ったことがある。
シノニム経由だと色々制限がある
USER/SCHEMA の話にリンクするのだが、シノニムに足して出来ないことがあるので、イラッとします。
TRUNCATE、マテビューリフレッシュは、シノニム経由では出来ないのです。
脱線しますが、TRUNCATE の権限もムカつきます。
DROP TABLE 権限が無いと TRUNCATE が出来ないってどういうことよ。
TRUNCATE はしても良いけど、DROP はさせたくないって普通にありませんか?
コマンドラインインターフェイスが貧弱
PostgreSQL/MySQL のコマンドラインインターフェイスを使った時に感動しましたね。
・履歴機能(Oracle12cでなんちゃって履歴機能がついたが、上下キーで呼び出せないのでほぼ、役立たず)がある
・CSVへの保存/CSVからの登録が超楽ちん
脱線しますが、SQL Server の 「GO」はウザイですね。2文字入れさせるな!
ラージテキストが使いにくい
ラージテキスト(CLOB)でJOIN出来ないのは理解できるが、登録する時の煩雑さ。
JavaなどのORMライブラリ使う時には勝手にやってくれるで良いが、素で使う時のやり難さ。
腐った実行計画だったを採用したら終わるまでそれで動き続ける
バージョンが上がるたびに、いろいろ実行計画まわり改善されるのだが、これどうにかならないかな。
1度ダメな実行計画で動き始めたら、それで最後まで動き続ける。
2回目に1回目の問題をフィードバックして別の実行計画を採用する機能はあるのだが、
1回は痛い思いをしなければならないのはどうにかしてほしい。
0.1秒のはずが3秒っていうのならまだ良いが、バッチで1秒のものが5時間とかなったらエライことになる。
1秒で終わると思って実行したけど、1分かかったら、こりゃまずいって途中で止めて(保留が良い)別の実行計画でやり直してほしい。
もちろん、呼び出し側にはエラーなしでシームレスに。
PL/SQL エンジンと SQLエンジンが分離されている
ユーザ定義FunctionをPL/SQLで作っても、結合句などで使うと切り替えが大量に入って重くなる。
SQLエンジンに組み込んで欲しい。もちろん、腐ったもがあった時には切り離す機能付きで。
以前、PL/SQLは暴走したらDBが止まるからという理由でストアドプロシージャ禁止令が出ていたプロジェクトがあったからね。
PL/SQL が貧弱
別に今の最新の開発言語の特徴を全て取り込めと言っているのではないのです。
動的・オブジェクト的なことがある程度出来ると良いのです。
リフレクション系の機能が無いので汎用的なことが出来ない。
SQL*Loader で ダイレクトパス使ってエラーになった時、制約が無効になる
APPENDヒントを付けてダイレクトパスインサートした時に、キー重複発生したらちゃんとロールバックして、キーも壊れないのだが、
SQL*Loaderだと重複した状態で入って制約が無効になるのは、どうにかしてほしい。
リソースをうまい具合に自動で最大限使ってくれない
PGAをもっと使いたいから、MAXを増やすと、全体が増えて足りなくなるとか、
PARALLEL使いたいけど、オンライン中だと裏で動くのに影響出さないようにうまく出来ないってことがあります。
リソースに空きがある場合は、じゃんじゃん使って、他が使い始めたら減らしていくって出来ないの?
CPU/メモリ/ネットワーク/DISKのリソースを有効に使いたい。
マニュアルが使いにくい
日本語で検索できない、他のマニュアルとリンクされていないという不満がある。
機械翻訳で意味不明なのは仕方ないので英語マニュアル読んだりすることもある。
DB2のマニュアルは優秀です。あれを見習ってほしい。
DROP TABLE IF EXISTSが無い
あっても無くてもDROPでエラーにしたくない時、PL/SQLの無名ブロックでディクショナリ探して、動的SQLで実行するって面倒なことをしないといけない。
半静的SQLって無いかな?
テーブル名の一部だけ変わる(月ごとにテーブル名が違うとか)などの時、動的SQLにしないといけない。
実在する代表のテーブル名でプリコンパイルしておくとか出来ないですかね?
動的SQLだと読みにくい・USER_DEPENDENCIESが使えないとか・バインド名前ではなく順番でやりにくい
など色々嫌なのだ。
この記事へのコメント