[SQL] SSIS 가장 좋은 방법은 대상 서버에 소스에서 N 테이블을로드
SQLSSIS 가장 좋은 방법은 대상 서버에 소스에서 N 테이블을로드
나는 대상 하나에 소스 DB에서 N (50) 테이블을로드해야합니다. 각각의 테이블은 다른 (따라서 다른 메타 데이터)와 다르다; 나는 각자가 간단한 구조를 가지고 어디에 내가 가져올 수있는 테이블을 매핑 같은 DFT로 차일를 호출하는 부모 PKG를 사용할 수 있다고 생각. 아이디어 1 아동 PKG -> 1 표 -> 1 도막 + 멋진 그런 식으로 같이 추측을 설계 할 것 N의 PKG를 호출하는 부모에 의해 사용되는 설정 테이블, 나는 modularibility에 도달 할 수와 나는 테이블을 추가 / 제거 할 수 easiliy. 나쁜 apporah는 bouch OD DFT ... ㅋ 하나 개 monolitic 패키지에 모든 것을 넣어하는 것입니다 당신은 이러한 시나리오를 해결하기 위해 어떤 생각 / 예 있나요? 마리오
해결법
-
==============================
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.당신은이를 사용하여 복사하거나 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.선택할 수있는 어떤 시나리오에 영향을 미치는 많은 요인이있다.
선택할 수있는 어떤 시나리오에 영향을 미치는 많은 요인이있다.
그러나 일반적으로는 :
상대적으로 적은 행이 작은 테이블의 경우, 하나의 데이터 흐름에 여러 소스 / 목적지를 넣을 수 있습니다
복잡한 ETL이있는 경우, 소스 / 대상에 대해, 더 나은 것보다 별도의 데이터가 명확성을 위해 작업 흐름에 그들을 넣어
당신은 여러 데이터를 사용할 수있는 실행의 순서를 정의해야하는 경우 여러 소스의 실행 순서를 제어 할 수 없기 때문에, 작업 흐름 / 단일 데이터의 목적지 작업 흐름.
당신이 다른 트랜잭션 격리 수준이나 행동을 필요로 할 때마다 별도의 데이터 흐름에 넣어해야합니다.
당신이 나중에 쉽게 실행 순서를 최적화 할 수 있도록 당신이 소스 시스템의 ETL의 영향에 확실 할 때마다 별도의 데이터에 넣어 흐름.
별도의 데이터로 넣어보다 큰 테이블이있는 경우이 다른 테이블에 대한 최적화 버퍼 크기에 수로, 작업 흐름 및 어떤 이유에 대한 ETL 프로세스를 최적화
당신이 더 많은 소스를 가지고 문제가없는 것보다 상대적으로 작은 테이블, 똑바로 소스 / 대상 매핑이있는 경우 그래서에서가 위 / 단일 데이터의 목적지 흐른다.
다른 경우는 별도의 데이터로 넣어 더 나은 또는 필요가 당신이보기의 세 가지 점에서 ETL 프로세스를 최적화 수로 흐름 :
소스 시스템의 부하에 미치는 영향
대상 시스템에 부하에 미치는 영향
상기 ETL 프로세스가 실행되는 컴퓨터의 활용 (CPU 소모, 메모리 소모 및 전체 출력하지만).
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
'SQL' 카테고리의 다른 글
[SQL] 왜 30 CAST를 사용하는 경우 VARCHAR의 기본 길이 무엇입니까? (0) | 2020.06.14 |
---|---|
[SQL] MS SQL 예외 : '@ P0'근처의 구문이 잘못되었습니다 (0) | 2020.06.14 |
[SQL] Woocommerce의 일에 대한 주문 총 구매 금액을 받기 (0) | 2020.06.14 |
[SQL] PHP SQL 명령문을 준비 얼마나 코드의 반복을 피하기 위해? (0) | 2020.06.14 |
[SQL] PIVOT 동적에서 반환 된 결과는 두 개의 테이블을 조인 (0) | 2020.06.14 |