あなたのアドバイスは正しいです、すべてのデータベースタスクを一度に実行する方が良いでしょう。シナリオには2つの主要なパフォーマンスへの影響があります
- スレッドを複数回実行するためのSQLエンジンとPL/SQLエンジン間のpro*cのコンテキスト切り替え。通常、クライアントアプリケーションからの多くのPL/SQL呼び出しで最大の問題です。
- pro * cアプリとデータベースエンジン間の通信におけるネットワークスタックオーバーヘッド(TNS)-特にアプリが別の物理ホスト上にある場合。
そうは言っても、アプリケーション側で接続プールを作成している場合、TNSリスナーには、各ネットワーク接続を待機する遺棄されたサーバーシャドウプロセスのプールも必要です(これはlistener.oraで設定されます)。
シャドウプロセスがすでに接続を待機しているときのOCIログイン/ログオフは非常に高速で、遅延の大きな要因ではありません-サーバー上の新しいシャドウプロセスを起動する必要がない限り、これについて心配する必要はありません-それは可能性があります非常に高額な通話。クライアント側で接続プールを使用しているため、これは通常問題ではありませんが、呼び出しのスレッド化のために考慮すべきことです。サーバーシャドウプロセスのプールを使い果たすと、TNSリスナーがさらにサーバーシャドウプロセスを起動する必要がある場合、大幅な低下に気付くでしょう。
新しい質問に答えて編集する:
-
それは非常に関連しています。前に指摘したように、C++アプリ内のplsqlおよびsql呼び出しの量を最小限に抑える必要があります。 C ++アプリ呼び出し内の各PLSQL呼び出しは、SQLエンジンを呼び出し、SQLエンジンはプロシージャ呼び出しのPLSQLエンジンを呼び出します。したがって、プロシージャを2つに分割すると、SQLからPLSQLへのコンテキストスイッチが2倍になります。これは、Tom Kyteの記事と私自身の個人的な経験で概説されているように、より高価なスイッチです。
-
1で答えられます。しかし、前に述べたように、ホストが異なる物理ネットワーク上にあり、転送するデータのタイプがない限り、通信オーバーヘッドは2番目です。たとえば、大きなC ++オブジェクトパラメータと多くの呼び出しを伴う大きなOracle結果セットは、ラウンドトリップによる通信遅延に明らかに影響します。 PLSQL呼び出しが増えると、各接続と結果セットのセットアップ用にSQLNETトラフィックも追加されることに注意してください。
-
3.質問はありません
-
PLSQLエンジン内のPLSQLからSQLへの変換はごくわずかなので、それにこだわらないでください。パフォーマンスのスループットを最大化するには、すべてのSQL呼び出しを1つのPLSQL呼び出し内に配置します。パフォーマンスを犠牲にして雄弁にするためだけに通話を分割しないでください。