zoukankan      html  css  js  c++  java
  • Package设计1:选择数据类型、暂存数据和并发

    SSIS 设计系列:

     

    一,数据类型的选择

    对于SSIS的数据类型,容易遗漏精度的是DateTime,不正确的使用DateTime,time,decimal 等数据类型,可能导致溢出或数据丢失。

    1,变量和参数的时间类型(DateTime)

    Variable 和 Parameter的DateTime对应 DT_DBTIMESTAMP (对应SQL Server的Datatime),格式是:yyyy-MM-dd hh:mm:ss XM,例如 “2016-05-19 5:41:32 PM”,只精确到秒。

    2,转换组件

    由于转换组件不能丢失精度,因此有以下三种方式:DT_DBTIMESTAMP,DT_DBTIMESTAMP,DT_DBTIMESTAMPOFFSET.

    • DT_DBTIMESTAMP 对应 SQL Server的 Datetime,格式是 "yyyy-MM-dd hh:mm:ss",精确到秒
    • DT_DBTIMESTAMP2 对应 SQL Server的 Datetime2(N),有precision,可以精确到ss.nnnnnnn
    • DT_DBTIMESTAMPOFFSET 对应 SQL Server的datetimeoffset(N),有precision,可以精确到ss.nnnnnnn

    3,类型转换对性能的影响

    只在必要时,进行数据类型的转换,因为每次转换,SSIS Engine都需要付出一定的代价。

    如果将值转换为一个不支持的数据类型,那么将会在SSIS内部产生一个到映射数据的额外转换,最好将数据类型转换为与目标最接近的数据类型。

    4,数据类型的选择

    SSIS的 Data Flow需要在内存中完成大量的工作,消除了最费时的IO操作,使数据的读取,转换和加载性能飞快。由于SSIS使用内存缓存区来完成相关操作,被加载到缓冲区的行数直接和row的宽度相关,row的宽度越窄,缓冲区容纳的行数越多,被处理的数据量越大,性能越好。如果要定义大型输入源的数据类型,必须慎重挑选数据类型,使用最接近的大小和精度存储和转换数据,既能使row的宽度不至于太宽,也能避免过多的数据类型转换。

    二,利用数据流

    数据流利用内存来缓冲数据,并在内存中处理数据转换,由于内存的访问速度是非常快的,所以SSIS数据流转换性能是非常高效的。SSIS Engine将数据分批加载到内存中,当Data Flow将一批新的数据加载到内存时,下游转换组件会对已经加载到内存中数据进行处理,同时,目的组件会将处理完成的数据加载到Target Table中,数据的读取,转换和加载同时进行,这就是数据流的优势。

    1,利用数据流,能够减少暂存和昂贵的disk IO 操作

    在大量数据的ETL系统中,Disk IO是系统性能的bottlenect。相比内存 RAM,Disk IO的读取和写入速度非常慢,将内存缓冲区中的数据写入暂存表,再从暂存表中读取数据到内存中,不仅成倍增加了Disk IO,而且限制了数据流的并发处理能力。请记住,使用暂存表的场景是:ETL系统中存在大量数据的更新操作。这是由于Data Flow 没有基于集合的更新转换组件,OLEDB Command 转换组件是逐行对数据进行更新操作,使用暂存表,能够充分利用RDBMS对数据进行基于集合的更新操作的优势。如果ETL系统不存在大量数据的更新操作,请选择使用数据流来处理数据。

    2,利用数据流,减少对RDBMS的依赖

    使用Data Flow转换组件来联接和清洗数据是十分高效的,这是因为,数据的读取,转换和加载同时进行。RDBMS对数据的处理是原子性的,在数据被处理完成之前,是不能被其他SQL语句处理的,相反,数据流可以并行地处理数据的提取,清洗,联接和写入,因此,充分利用数据流的并发处理优势,会使数据整体的处理时间大幅减少。

    3,利用RDBMS处理数据源

    在使用Source适配器获取数据时,利用数据库的order by 子句进行排序,将会比Sort 转换更有效率;对于源是多表联接的查询语句,使用RDBMS获取数据将会更快。

    三,并发设计

    最大的并发程度,是由服务器的CPU数量确定的,在同一时间执行的线程的最大数量是CPU的个数,一个CPU在某一时刻,只有一个Process处于Running状态,所以最大并发度不要超过CPU的个数。

    通过以下两个属性控制ETL执行的并发度:

    • MaxConcurrentExecutalbes :Package的属性,用于指定Package中可以并发执行的可执行文件的最大数量;
    • EngineThreads :数据流Task的属性,用以确定数据流Task中各个转换组件同时运行的最大线程数,每一个转换组件最多使用一个Thread

    1,利用优先约束来并发处理数据

    Data Flow Task 和 Data Flow Task 1 是并发执行的,而 Data Flow Task2 必须等到 Data Flow Task 和 Data Flow Task 1 执行完成之后,才开始执行。

     2,从同一个表中并发获取数据

    如何从一个数据表中并发处理数据,设计思路是把一个表中的数据平均分成N份,各个数据流之间并发处理。

    例如分为3份,可以使用%3,将数据分为三个子数据流并发处理数据。

    select *
    from dbo.SourceTable
    where checksum(table_column)%3=0
    
    select *
    from dbo.SourceTable
    where checksum(table_column)%3=1
    
    select *
    from dbo.SourceTable
    where checksum(table_column)%3=2

     

  • 相关阅读:
    ASC2 做题记录
    ASC1 做题记录
    Codeforces #676 (div 2) 做题记录
    Codeforces #639 (div 1) 做题记录
    Atcoder Beginner Contest 160 做题记录
    CodeCraft-20 (div 2) 做题记录
    Codeforces 1242C
    Codeforces 1102F
    codeforces 732F
    codeforces 405E
  • 原文地址:https://www.cnblogs.com/ljhdo/p/4629407.html
Copyright © 2011-2022 走看看