0

ユーザーに送信されるcsvファイルにデータをスプールする重いクエリがあります。手動で並列セッションを作成し、フィルタ条件を使用してクエリを実行しているため、最後にすべてのスプール ファイルを 1 つのファイルに結合できるため、データの生成にかかる時間が短縮されます (通常、並列セッションでは約 10 時間かかります)。 2.5〜3時間)。

私の質問は、スクリプトが max(agreementid) を検出し、それを X 個のスプール呼び出しに分散して、各ファイルが最大 100000 レコードを持つ X ファイルを生成するように、これを自動化するにはどうすればよいかということです。

追加の説明: 私の質問はあまり明確ではなかったと思います。もう一度説明してみます。

  1. 大量のデータを含むテーブル/ビューがあります。
  2. このデータを CSV ファイルにスプールする必要があります。
  3. CSV ファイルのスプールには膨大な時間がかかります。
  4. 以下を実行して、並列スプールを実行します。a) 選択 .... から ... ここで、1 から 1000000 までの Agreementid。b) 1000001 から 2000000 の間の Agreementid から .... を選択します。など、複数のセッションで個別にスプールします。
  5. これにより、複数のファイルを生成して、それらをつなぎ合わせてユーザーと共有できます。
  6. テーブルから AgreementID の最小値と最大値を見つけ、スプーリング スクリプトを自動的に作成し、SQL の個別のセッションでそれらを実行して、ファイルが自動的に生成されるようにするスクリプト (DOS ベースまたは AIX ベースだと思います) が必要です。

私が自分自身を十分に明確にすることができたかどうかはわかりません。私の以前の質問に返信してくれてありがとう。

4

2 に答える 2

1

もっと簡単な方法があるかもしれませんが、これは ID の 4 つの「バケット」を生成し、パラメーター化されたフィルター条件に最小値と最大値を差し込むことができます。

select bucket, min(agreementid) as min_id, max(agreementid) as max_id
from (
    select agreementid,
        case when rn between 1 and cn / 4 then 1
            when rn between (cn / 4) - 1 and 2 * (cn / 4) then 2
            when rn between (2 * cn / 4) - 1 and 3 * (cn / 4) then 3
            when rn between (3 * cn / 4) - 1 and cn then 4
        end as bucket
    from (
        select agreementid, rank() over (order by agreementid) as rn,
            count(*) over () as cn from agreements
    )
)
group by bucket;

固定数のバケットではなく、各バケットの上限が必要な場合は、次のようにすることができます。

select floor(rn / 100000), min(agreementid) as min_id, max(service_num) as max_id
from (
    select agreementid, rank() over (order by agreementid) as rn
    from agreements
)
group by floor(rn / 100000);

次に、各最小値/最大値を、たとえば SQL*Plus を呼び出すシェル スクリプトから SQL スクリプトに渡します。バケット番号も同様に渡され、位置パラメータを介してスプール ファイル名の一部として使用できます。

ただし、ボトルネックとして特定したものに興味があります。/*+ PARALLEL */ヒントを付けて、データベース内で並列クエリとして実行してみましたか?

于 2013-08-05T14:48:35.867 に答える