2011-12-03 3 views
3

Oracleはストアドプロシージャをコンパイルするのに時間がかかるが、PostgreSQLのPGSQLコンパイラよりもはるかに高速で動作することに気付きました。Oracle PL/SQLストアドプロシージャコンパイラとPostgreSQLのPGSQLストアドプロシージャコンパイラ

PostgreSQLでは、同じ手順(つまり、select節とwhere節にすべての関数がSQL-92形式で記述されています)をコンパイルするのに時間がかかりません。

ストアドプロシージャ、SQL解析、ビュー、およびref_cursorsに関するOracleとPostgreSQLのパフォーマンスメトリックを比較できるメトリクスWebサイトはありますか?

PostgreSQLのPGSQLコンパイラに最適化ルーチンがありませんか? Oracleがストアド・プロシージャを処理する方法と、PostgreSQLがストアド・プロシージャを処理する方法の主な違いは何ですか?

私は、PGSQLでPL/SQLコードをコンパイルして実行できるようにするPGSQL関数ライブラリを作成しようと考えています。 (つまり、DECODE、NVL、GREATEST、TO_CHAR、TO_NUMBER、すべて PL/SQL関数)、これが実行可能かどうかわかりません。

+1

iirc Oracleはよりコンパイル時の型チェックを実行しますが、PostgreSQLは実行時にさらにチェックする必要があります。しかし、完全なストーリーのためには、ドキュメンテーションをよく確認してください。 –

答えて

2

これはかなり深いところまで動くことができるので完全に答えが難しい質問ですが、私は2セントを答えに寄与するために追加します。まず、私はPostgreSQLが本当に好きです。私はOracleが本当に好きです。しかし、PL/SQLは、PL/PGSQLが提供する言語/環境よりもはるかに深い言語/環境です。 OracleはPL/SQL用に最適化コンパイラを少なくとも10G使用しているためあなたのユースケースでコンパイルが遅くなる理由は、もっともらしいでしょう。 PL/SQLにはネイティブ・コンパイルもあります。単純なコンパイラ・ディレクティブを使用してPL/SQLコードをマシン・コードにコンパイルできます。これは、SQLロジックではなく、計算集約的なロジックに適しています。この点に関する私の指摘は、OracleはPL/SQLを機能的観点とパフォーマンスの観点から実用的に扱うための多くのリソースを費やしており、多くの例のうちの2つに触れただけです.PL/SQLはPG/SQL PG/SQLがすぐにオラクルに追いついているとは思えません。

私はこれが本当にいいと思いますが、あなたは並んで比較を見つけることはできません。そうする努力は、おそらくほとんどの人々の時間の価値があるとは限りません。 また、私はすでにそこにあるものを書き直しません。

http://www.pgsql.cz/index.php/Oracle_functionality_(en) 
+0

リンクありがとうございます。ホイールを再構築する必要はありません。 –

2

TPC for SQL(tpc.org参照)などのストアドプロシージャの公式ベンチマークはありません。また、ベンチマークとして使用できる特定のPL/SQLおよびpgSQL実装を持つデータベースアプリケーションも認識していません。

両方の言語がコンパイルされ、中間コードに最適化され、インタープリタによって実行されます。インタプリタが非常に効率的で一般的なアプリケーションがSQLエンジンで多くの時間を費やし、手続き型コード(see AskTom article)でないので、全体的なパフォーマンスを向上させないマシン・コードにコンパイルすることができます。PL/SQL

プロシージャコードがSQLを呼び出すときは、他のプログラムと同様に、ステートメントと入力および出力用のバインドパラメータを使用します。 OracleはこれらのSQLを「準備済み」にしておくことができます。つまり、追加のSQL「ソフト解析」なしでカーソルを再使用する準備ができています(通常、SQLの「ハード解析」は、それが始まった)。

selectまたはwhere句で関数を使用する場合、データベースはSQLエンジンと手続き型エンジンの間を行き来するように切り替える必要があります。これは、コード自体より多くの処理時間を消費する可能性があります。

2つのコンパイラの主な違いは、Oracleが依存関係ツリーを保持していることです。これにより、基礎となるオブジェクトが変更されたときにPL/SQLが自動的に再コンパイルされます。コンパイルエラーは、実際にはPostgresの場合ではありませんコードを実行せずに検出された(see Documentation

+0

いくつかのIDEにツールセットでこれが付属しているので、依存関係ツリーを視覚化する方法があるかどうか知っていますか?つまりMaven依存プラグインです。ステートマシンのコンパイラもうまくいくでしょう。すなわちhttp://www.complang.org/ragel/ –

0

は、私は、ストアドプロシージャに PostgreSQLのパフォーマンスメトリック対側のOracleによるサイドを見つけることができるメトリクスのWebサイトには、SQLありますパッシング、 ビューとref_cursors?

Oracleのパフォーマンスを公開することは、おそらくライセンス条項に違反している可能性があります。企業ユーザーの場合は、そのようなことをする前に合法的にチェックしてください。

PL/SQLコードをコンパイルしてPGSQLで実行できるようにするPGSQL関数ライブラリを作成したいと考えています。 (つまり、DECODE、NVL、 大文字、TO_CHAR、TO_NUMBER、すべてのPL/SQL関数)、これが実現可能であれば は分かりません。

マニュアルの内容を確認してください。一部は既に組み込み関数として実装されているため、これらのすべてが必要なのは確認してください。また、私は、Oracleの互換性を向上させるための機能のアドオンパックを思い出しているようです。

最後に、PostgreSQLが機能の記述方法を選択できることを忘れないでください。単純なものは純粋なSQLで書かれていて(場合によっては自動的にインライン化されます)、重い荷物のために、私はPerl(PythonやJavaが好きかもしれません)を使う方が好きです。

関連する問題