大規模なアプリケーション(VB.Net、Framework 3.5)は、SQL ServerとSQL Serverの使用開始から多かれ少なかれ開発されています。もちろん、誰かがクライアントにそれを販売して、Oracle(10g以上)上で動作させることができると約束していましたが、現在はそうですが、かなりのパフォーマンス上の問題があります。パラメータ化されたクエリをSQL ServerとOracleの両方で使用する
これは、ほぼすべてのSQLは、(アプリケーションコードに含まれている)という事実から生じる。これは、パラメータの配列と一緒に我々のデータ・アクセス・レイヤーに渡され
SELECT Col1, Col2, Col3 FROM TableName WHERE IdCol = @EntityId
形態のパラメータ化クエリであります名前の配列、型の配列、値の配列を返し、実際の接続を処理するためにEnterprise Library 5を使用して実行されます。
このプロジェクトが始まったとき、誰かがOracleは、フォーム
:EntityId
のパラメータが必要であることを実現し、むしろ、SQLのすべてのビットを見つけ、再書き込みしようとしているよりも、(単独で、このアプリは、およそ百万LOCを持っていることを決定したがスイート内に他のものがある場合)、クエリとパラメータ名の配列の@を:で置き換えるクエリが実行される直前に呼び出される関数を追加します。また、 'WITH NOLOCK'、角括弧を削除し、SQL Serverが使用する連結文字やその他のアーチファクトを置き換えますが、Oracleはそうしません。当然の問題は、文字列の検索と置換が高価であり、アプリの簡単な操作の一時点で、2,000を超える簡単なクエリが順番に実行されることです。 SQL Serverに対してはこれはまったく時間がかかりませんが、Oracleプラットフォームに対しては20〜30秒かかります。
理想的には、貧弱な/非効率なコードとデザインを取り除き、ドッジーなアーキテクチャを修正し、そのロットをnHibernateまたはEntity Frameworkに置き換えるために、大量のコードを書き直したいと思います。しかし、商業的な圧力と仕事の大きさのおかげで、いつでもそれは起こることはありません。
私はORMや大量のコードを再設計するに切り替えるような巨大な根本的な変更を行うことが許されるのは非常にそうだということを考えると、私の質問は非常に単純です:
のいずれかにする方法はありますSQL ServerまたはOracleは、文字列の置換やIFの膨大な量を使わずに、一般化された方法でパラメータ化されたクエリを書くための、他のまたは賢明で簡単な方法のパラメータ識別子を理解しています。私はアプリケーションのほとんどすべてのSQLステートメントを編集する必要があるかもしれないことに気がついていますが、それがそうであれば私の上司にそのアイデアを売るだけです。乾杯
意味があります。私たちは既にEL5を使用していますので、キャッシングアプリケーションブロックを見て、それが役立つかどうかを報告します。乾杯。 –
クエリの変換がパフォーマンスのボトルネックであることを確認するために、まずアプリケーションのプロファイルを作成することをお勧めします。パフォーマンスのトラブルに対処するときは、プロファイリングから始める方が良いです。 – Nikolay
私たちは既に行っています。これが問題であることがわかっています!いくつかの点では、このアプリケーションの深刻な固有の設計上の欠陥を特定する(そして管理に強調する)のに役立ちますので、これは良いことです。開発者が「クールで何かをしたい」と思っているだけでなく、ハイテク '。 –