Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SSIS中高效地加载和筛选数据_Sql Server_Performance_Ssis_Etl - Fatal编程技术网

Sql server 如何在SSIS中高效地加载和筛选数据

Sql server 如何在SSIS中高效地加载和筛选数据,sql-server,performance,ssis,etl,Sql Server,Performance,Ssis,Etl,需要加载一个平面文件,其中包含在SQL Server 2016中的计划作业中执行的SSIS包,但仅在源中加载数据需要花费太多时间(如2/3小时),然后需要额外(2/3小时)的时间进行排序和筛选,然后需要类似的时间在目标中加载数据,该文件大约有一百万行,大约不少于3GB。这让我抓狂,因为这会影响服务器的性能 SSIS包:-我的包只是一个数据流任务,它有一个平面文件源和一个OLE DB目标,仅此而已-数据访问模式设置为快速加载-表中只有1个索引。我的目标表有32列 输入文件: 输入文本文件有32列以

需要加载一个平面文件,其中包含在SQL Server 2016中的计划作业中执行的SSIS包,但仅在源中加载数据需要花费太多时间(如2/3小时),然后需要额外(2/3小时)的时间进行排序和筛选,然后需要类似的时间在目标中加载数据,该文件大约有一百万行,大约不少于3GB。这让我抓狂,因为这会影响服务器的性能

SSIS包:-我的包只是一个数据流任务,它有一个平面文件源和一个OLE DB目标,仅此而已-数据访问模式设置为快速加载-表中只有1个索引。我的目标表有32列

输入文件: 输入文本文件有32列以上,代理键数据可能不唯一,引用的列日期可能不唯一,需要对其进行筛选

面临两个问题一个是SSIS平面文件源需要花费大量时间加载数据另一个是排序和筛选。怎么办

一些建议 1。删除并重新创建索引

添加2个执行SQL任务的
;在执行
数据流任务之前和之后,第一个删除索引,第二个在成功执行
数据流任务之后重新创建索引

2。调整缓冲区大小

您可以在以下内容中阅读有关缓冲区大小的更多信息

3。删除SQL server中的重复项,而不是对组件进行排序

尝试删除排序组件,并在运行类似查询的
数据流任务
之后添加
执行SQL任务

;WITH x AS 
(
  SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
      (PARTITION BY col1, col2, col3 ORDER BY id)
  FROM dbo.tbl
)
DELETE x WHERE rn > 1;
4。使用脚本组件而不是排序

您必须实现与以下答案类似的逻辑:

一些有用的链接

如果您想让它快速运行,请使用以下模式:

  • 按原样将数据加载到暂存表中
  • (可选)随后向临时表添加索引
  • 使用SQL执行您需要的任何处理(即,选择DISTINCT、GROUP BY进入最终表)

  • 您可以在SSIS中执行这类操作,但需要对其进行适当的调整等。在已经为此进行了充分优化的数据库中执行这类操作更容易

    使用SSIS的服务器上有多少内存?感谢您的描述回复,这非常有帮助。需要您关注一个问题,在执行1和2任务后,我需要数据流任务中的唯一/不同记录,根据源信息的唯一记录需要在目标中执行插入或更新。按照你的任务顺序是不可能实现的。请您澄清这个问题,如何基于源不同记录对目标表执行插入或更新。我提供的任务彼此不相关,我试图给出一些建议。编号不是顺序第三个建议是使用delete station和公共表表达式删除重复项。您可以将数据导入暂存表并删除重复项,然后将数据导入目标。或者在目标中添加一列,用于标识每个导入操作行。问题是数据太大,如果要导入整个数据,需要花费时间,而且会显著增加数据库大小。你认为它对性能有什么影响?@shamim我和Nick答案中的所有建议都需要测试。因为您是唯一一个拥有关于您尝试执行的操作的所有信息的人:资源、文件结构、文件大小、目的地、目标、限制等等。。。。所以你必须做一些实验来实现你的目标。有时为了获得更好的性能,您必须消耗更多的磁盘空间。问题是数据太大,如果我要导入整个数据,这将需要时间,而且会显著增加数据库大小。您尝试过吗?是否值得花费另一个磁盘驱动器将负载提高100%?似乎您已经给出了答案。这些选项中的哪一个(众多选项中的哪一个)帮助您解决了问题?@Nick.McDermaid我认为在SQL server中可以对数据进行排序和筛选时,不建议使用
    排序组件。另外,您是对的,在暂存表中排序比从目标表中删除重复项(如我所建议的)要好,因此我认为您的答案比我的答案更强大,即使我的建议也可以提供比OP方法更好的性能+1我希望这确实有所帮助。如果您有一个3Gb的文件、一个3Gb的暂存表和一个2Gb的最终表(我假设删除重复项将减少其大小),那么最大磁盘空间为8Gb。我认为我的iPhone有足够的空间来实现这一点。