복붙노트

[SQL] SSIS 가장 좋은 방법은 대상 서버에 소스에서 N 테이블을로드

SQL

SSIS 가장 좋은 방법은 대상 서버에 소스에서 N 테이블을로드

나는 대상 하나에 소스 DB에서 N (50) 테이블을로드해야합니다. 각각의 테이블은 다른 (따라서 다른 메타 데이터)와 다르다; 나는 각자가 간단한 구조를 가지고 어디에 내가 가져올 수있는 테이블을 매핑 같은 DFT로 차일를 호출하는 부모 PKG를 사용할 수 있다고 생각. 아이디어 1 아동 PKG -> 1 표 -> 1 도막 + 멋진 그런 식으로 같이 추측을 설계 할 것 N의 PKG를 호출하는 부모에 의해 사용되는 설정 테이블, 나는 modularibility에 도달 할 수와 나는 테이블을 추가 / 제거 할 수 easiliy. 나쁜 apporah는 bouch OD DFT ... ㅋ 하나 개 monolitic 패키지에 모든 것을 넣어하는 것입니다 당신은 이러한 시나리오를 해결하기 위해 어떤 생각 / 예 있나요? 마리오

해결법

  1. ==============================

    1.나는 이러한 종류의 문제점을 해결하기 위해 biml를 사용하는 팬이되었습니다.

    나는 이러한 종류의 문제점을 해결하기 위해 biml를 사용하는 팬이되었습니다.

    모든 가정하면 당신은 목적지까지의 소스에서 당겨 그들의 단일 데이터 흐름 작업이 29 개 패키지로 끝날 것, 줄 지어있다 (AN SSIS 변수에 따라).

    <#@ template language="C#" hostspecific="true" #>
    <#@ import namespace="System.Data" #>
    <#@ import namespace="System.Data.SqlClient" #>
    <#@ import namespace="System.IO" #>
    <Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <!--
    <#
        string connectionStringSource = @"Server=localhost\dev2012;Initial Catalog=AdventureWorksDW2012;Integrated Security=SSPI;Provider=SQLNCLI11.1";
        string connectionStringDestination = @"Server=localhost\dev2012;Initial Catalog=AdventureWorksDW2012_DEST;Integrated Security=SSPI;Provider=SQLNCLI11.1";
    
        string SrcTableQuery =     @"
    SELECT
        SCHEMA_NAME(t.schema_id) AS schemaName
    ,   T.name AS tableName
    FROM
        sys.tables AS T
    WHERE
        T.is_ms_shipped = 0
        AND T.name <> 'sysdiagrams';
    ";
    
        DataTable dt = null;
        dt = ExternalDataAccess.GetDataTable(connectionStringSource, SrcTableQuery);
    #>    
    -->
        <Connections>
            <OleDbConnection
                Name="SRC"
                CreateInProject="false"
                ConnectionString="<#=connectionStringSource#>"
                RetainSameConnection="false">
            </OleDbConnection>
            <OleDbConnection
                Name="DST"
                CreateInProject="false"
                ConnectionString="<#=connectionStringDestination#>"
                RetainSameConnection="false">
            </OleDbConnection>
        </Connections>
    
        <Packages>
            <# foreach (DataRow dr in dt.Rows) { #>
                <Package ConstraintMode="Linear"
                    Name="<#=dr[1].ToString()#>"
    
                >
                <Variables>
                    <Variable Name="SchemaName" DataType="String"><#=dr[0].ToString()#></Variable>
                    <Variable Name="TableName" DataType="String"><#=dr[1].ToString()#></Variable>
                    <Variable Name="QualifiedTableSchema"
                              DataType="String"
                              EvaluateAsExpression="true">"[" +  @[User::SchemaName] + "].[" +  @[User::TableName] + "]"</Variable>
                </Variables>
                <Tasks>
                    <Dataflow
                        Name="DFT"
                    >
                        <Transformations>
                            <OleDbSource
                                Name="OLE_SRC <#=dr[0].ToString()#>_<#=dr[1].ToString()#>"
                                ConnectionName="SRC"
                            >
                                <TableFromVariableInput VariableName="User.QualifiedTableSchema"/>
                            </OleDbSource>
                            <OleDbDestination
                                Name="OLE_DST <#=dr[0].ToString()#>_<#=dr[1].ToString()#>"
                                ConnectionName="DST"
                                KeepIdentity="true"
                                TableLock="true"
                                UseFastLoadIfAvailable="true"
                                KeepNulls="true"
                                >
                                <TableFromVariableOutput VariableName="User.QualifiedTableSchema" />                        
                            </OleDbDestination>
                        </Transformations>
                    </Dataflow>
    
                </Tasks>
                </Package>
            <# } #>
        </Packages>
    </Biml>
    

    이 시점에서, 당신은 단순히 당신이 패키지의 실행을 조정하는 방법을 알아낼 필요가있다.

  2. ==============================

    2.당신은이를 사용하여 복사하거나 SQL 에이전트에서 직접 실행하는 SSIS에서 SQL 실행 태스크를 사용할 수 있습니다. 이 스키마가 이미 대상 DB에 존재하는 것으로 가정합니다.

    당신은이를 사용하여 복사하거나 SQL 에이전트에서 직접 실행하는 SSIS에서 SQL 실행 태스크를 사용할 수 있습니다. 이 스키마가 이미 대상 DB에 존재하는 것으로 가정합니다.

    DECLARE @tblname as varchar(50);
    DECLARE @tblschema as varchar(50);
    DECLARE @srcdb as varchar(12);
    DECLARE @destdb as varchar(12);
    DECLARE @tablesql as nvarchar(255);
    
    SET @srcdb = 'MYSRCDB';
    SET @destdb = 'MYDESTDB';
    
    DECLARE tbl_cursor CURSOR FOR
    SELECT table_schema, table_name FROM information_schema.tables where table_type = 'BASE TABLE'
    
    OPEN tbl_cursor
    
    FETCH NEXT FROM tbl_cursor INTO @tblschema, @tblname
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
    SET @tablesql = N'SELECT * into '+@destdb+'.'+@tblschema+'.'+@tblname+' FROM '+@srcdb+'.'+@tblschema+'.'+@tblname;
    EXECUTE sp_executesql @tablesql
    
    FETCH NEXT FROM tbl_cursor INTO @tblschema, @tblname
    END
    
    CLOSE tbl_cursor
    DEALLOCATE tbl_cursor
    
  3. ==============================

    3.선택할 수있는 어떤 시나리오에 영향을 미치는 많은 요인이있다.

    선택할 수있는 어떤 시나리오에 영향을 미치는 많은 요인이있다.

    그러나 일반적으로는 :

    상대적으로 적은 행이 작은 테이블의 경우, 하나의 데이터 흐름에 여러 소스 / 목적지를 넣을 수 있습니다

    복잡한 ETL이있는 경우, 소스 / 대상에 대해, 더 나은 것보다 별도의 데이터가 명확성을 위해 작업 흐름에 그들을 넣어

    당신은 여러 데이터를 사용할 수있는 실행의 순서를 정의해야하는 경우 여러 소스의 실행 순서를 제어 할 수 없기 때문에, 작업 흐름 / 단일 데이터의 목적지 작업 흐름.

    당신이 다른 트랜잭션 격리 수준이나 행동을 필요로 할 때마다 별도의 데이터 흐름에 넣어해야합니다.

    당신이 나중에 쉽게 실행 순서를 최적화 할 수 있도록 당신이 소스 시스템의 ETL의 영향에 확실 할 때마다 별도의 데이터에 넣어 흐름.

    별도의 데이터로 넣어보다 큰 테이블이있는 경우이 다른 테이블에 대한 최적화 버퍼 크기에 수로, 작업 흐름 및 어떤 이유에 대한 ETL 프로세스를 최적화

    당신이 더 많은 소스를 가지고 문제가없는 것보다 상대적으로 작은 테이블, 똑바로 소스 / 대상 매핑이있는 경우 그래서에서가 위 / 단일 데이터의 목적지 흐른다.

    다른 경우는 별도의 데이터로 넣어 더 나은 또는 필요가 당신이보기의 세 가지 점에서 ETL 프로세스를 최적화 수로 흐름 :

    소스 시스템의 부하에 미치는 영향

    대상 시스템에 부하에 미치는 영향

    상기 ETL 프로세스가 실행되는 컴퓨터의 활용 (CPU 소모, 메모리 소모 및 전체 출력하지만).

  4. from https://stackoverflow.com/questions/20222388/ssis-best-practice-to-load-n-tables-from-source-to-target-server by cc-by-sa and MIT license