2017-02-24 2 views
1

私は100個のパーティションを持つ1つのテーブルを持っています。 そして私はデータパーティションを読みとる手順を持っています。 と仮定Oracleパーティション

P0は、私が手続き

exec xyz('P0'); 

を実行した場合、それは500K行に対して実行するために3分かかり1つのパーティションです。

しかし、私は100回のセッションを作成して、並列 を実行したときに別の異なるセッションのようなもの

exec xyz('P1'); 
exec xyz('P2'); 
exec xyz('P3'); 

それは、なぜその出来事誰もが説明できる 50M行に対して1時間かかります。

+0

あなたの実際のシナリオに関する具体的な情報はありませんので、答えを知ることは実際には不可能です。しかし、私はまだ一般的に修正されているように、実際の質問よりも広い範囲で真実を追求するという質問を好む。 –

答えて

1

私が理解する限り、100個のパーティションに必要な時間は、100 * 3分= 300分= 5時間という単一のパーティションに必要な時間が100 *になると予想されます。その代わりに、タスク全体はわずか1時間50分かかります。

最初の質問は、パーティションのサイズが等しいかどうかです。たぶんあなたが今説明した動作を説明できる小さなパーティションがあります。

また、特定のパーティションの実行時間は、ストアドプロシージャが実際に行っている処理に大きく依存します。たとえば、大量の選択が含まれていて、一部のパーティションで大量のデータをメモリに書き込む(多くの時間がかかる)一方、他のパーティションでは、レコードをフィルタリングしてからコンテンツを書き込む前に、メモリ。

また、ストアドプロシージャには書き込み操作(挿入、更新、削除)が含まれている可能性があります。特に多くのレコードに影響する場合は非常に時間がかかります。影響を受けるレコードのパーティション間での分布が不均一である可能性が高いため、異なるパーティションでの実行時間が異なる可能性があります。

たとえば、各パーティションにおよそ500kのレコードがあり、ストアード・プロシージャーが基準でレコードを選択し、その基準に一致する項目に対して所定の更新を実行すると、検出され、影響を受けるレコードは異なるパーティションで異なるでしょう。

また、パーティションが異なる遅延または異なるプロパティを持つサーバー間で分散されているため、合計時間に影響します。または、サーバーは他のいくつかのジョブも実行しています。これにより、実行時間が擬似ランダムに増加します。

+0

これは3分で完了する必要があります。1は1つのパーティションを完了するのに3分かかりますし、私は100をすべて別のセッションで実行します。そして、すべてのパーティションはほぼ同じサイズです。 – Sparsh

+0

@Sparsh 100スレッドを実行しているときにパフォーマンスが100倍向上することは期待できません。私は最終的な数字が何であるべきかはわかりませんが、XスレッドがX倍のパフォーマンスを提供するとは思っていません。どのように並列ジョブを実行していますか? DBMS_SCHEDULERを使用している場合は、JOB_QUEUE_PROCESSESパラメータによって制限されている可能性があります。また、負荷に応じてOracleが頻繁にスケジュール・ジョブを減らす方法もあります。パフォーマンスが最優先事項である場合は、通常、Oracleのパラレル・ステートメントを使用して、独自のジョブを作成するのではなく、Oracleに並列処理を実行させます。 –

+0

@Sparsh私は疑問を誤解しました。何らかの理由でストアドプロシージャを順番に実行していると思いました。順番に並行してジョブを実行している方がパフォーマンスが向上すると期待できますが、同時に実行されるスレッドの数が非常に多いため、サーバーの負担が大きくなります。これが100台の異なるコンピュータ上で実行されるなら、あなたの前提は多かれ少なかれ有効でしょう。あなたのケースは異なる可能性が高いので、あなたが経験した動作です。 –

関連する問題