1

古いデータベースから新しい構造の新しいデータベースにデータを変換したい。古いデータベースには、新しいデータベースの添付テーブルに変換する必要がある添付テーブルがあります。

古いデータベース アタッチメント テーブルの構造は次のとおりです。

Attachment (ID int, Image Image, ...)

新しいデータベース アタッチメント テーブルの構造は次のとおりです。

Attachment (ID int, Image Image, OldID Int, ...)

convert package copy を実行するたびに、古いデータベースから新しいデータベースへのデータ (新しいデータ) が存在しません。

私はそれを行うために以下のフォーマットを使用します:

ここに画像の説明を入力

古いテーブルと新しいテーブルの間のルックアップ ( ID --> OldID) は、レコードの存在を確認します。

SSIS パッケージを実行すると、SSIS、最初にすべてのルックアップとソース コンポーネント データをメモリにキャッシュしてから、パッケージを実行します。このパッケージのソース データは非常に大きく、このパッケージを実行すると実行速度が非常に遅くなります。lookup for check existsコンポーネントの後の新しいレコードごとに、古いデータベースから Image 列のデータを取得したいと考えています。古いデータベースから画像列データを取得するために新しい検索コンポーネントを使用すると、SSIS はこの新しい検索データをキャッシュし、このパッケージを実行する実行時間は変わりません。どうすればいいですか?

前もって感謝します。

4

3 に答える 3

0

これを正しく考えていると思いますか?ロードするデータの量が膨大な場合でも、SSISが遅くなることはありません。

LOOKUPコンポーネントは、必要のないことを何もしていないことを確認する必要があります。新しいデータベースのテーブルをポイントしている場合は、すぐにSQLクエリに変更します。SELECT OldId FROM tblこのクエリでは、古いデータベースからの着信IDをこれにポイントするだけで済みます。データフローには、マップされた古いデータベースのIDと画像が含まれてID -> OldIdいる必要があります。OLEDB変換先の[画像]-> [画像]。ここで行っているように、[新しい行のみを挿入]操作にはこれ以上必要ありません。

このジョブでは、カスタムコードや動的SQLは必要ありません。データフローでソースシステムからIDとイメージを取得する必要があります(整理するための主要なネットワークボトルネックがない限り)-古いシステムからイメージデータを取得するためにRBARルックアップを実行することは、非常に逆の方法です。あなたのETLを考えています。

于 2012-09-23T16:09:59.540 に答える
0

2 つのデータ フローで行うこともできます。

一番に:

  1. ソース テーブルから ID のみを選択
  2. 変更なしで宛先データベースでルックアップを行います
  3. 次のような宛先ウィッチ コードとして Srcipt コンポーネントを使用して、新しいIds文字列変数をコンマ区切りのリストとして格納します。IdListToBeFetched

using System.Text;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    StringBuilder sb;
    public override void PreExecute()
    {
        base.PreExecute();
        sb = new StringBuilder();
    }

    public override void PostExecute()
    {
        base.PostExecute();
        Variables.IdListToBeFetched = sb.ToString().TrimEnd(',');
    }

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        if (!Row.ID_IsNull)
        {
            sb.AppendFormat("{0},", Row.ID);
        }
    }
}

"select ID, Image from Attachment where ID in (" + @[User::IdListToBeFetched] + ")"2 番目のデータ フローでは、ソースの sql コマンドをset DelayValidation=に似た式から動的に生成されたクエリに設定しTrueます。すべての画像を単一selectで取得するため、より高速になります。

またはSqlCommandのようなソースで動的に生成されたクエリを設定するには: ADO NET SourceODBC Source

  1. ソース Expressionを含むプロパティを選択Data Flow Task
  2. ここでプロパティを見つけ[your source name].[SqlCommand]て式を設定します

動的に生成されたクエリを sql コマンドとして設定するにはOLE DB Source( Jamie Thomson ブログから取得):

  1. SourceSQL という名前の新しい変数を作成します
  2. SourceSQL 変数のプロパティ ペインを開きます (F4 キーを押します)。
  3. EvaluateAsExpression=TRUE を設定します
  4. Expressionに設定"select ID, Image from Attachment where ID in (" + @[User::IdListToBeFetched] + ")"
  5. OLE DB ソース コンポーネントの場合は、エディターを開きます
  6. データ アクセス モードを「変数からの SQL コマンド」に設定します。
  7. VariableName = "SourceSQL" を設定します
于 2012-09-22T16:34:05.003 に答える
0
  1. IDソース テーブルから のみ選択
  2. 変更なしで宛先データベースでルックアップを行います
  3. フローに Image を追加する に設定してno match output、ソース テーブルでルックアップを実行します。Cache ModeNo cache

この場合、各画像は個別に取得されるため、パフォーマンスに影響する可能性があります。

于 2012-09-22T15:47:34.150 に答える