数据是否通过SSIS服务器流向目标数据库服务器?

时间:2014-08-01 17:53:56

标签: ssis

可能很傻但这对我来说相当混乱。我们有两个服务器盒,一个用于SSIS集成服务(IS),另一个用于SQL Engine来托管数据仓库。我们有一个在IS框上调用SSIS包的作业,用于将数据从另一个远程服务器加载到数据仓库服务器上。

那么,源数据首先通过Integration Service Server(在内存?ssis数据库中?)然后降落在目标数据库服务器上?或者Integration Service只是调用db服务器的进程直接加载源数据而无需通过IS服务器。如果是前者,将IS和数据仓库放在同一台服务器上应该有助于吞吐量?

跟进问题。那么什么/如何监控和排除数据流故障呢?例如,如果我正在加载一个巨大的表,它似乎有时挂起。作业正在运行,没有错误,但我很长时间没有在目标服务器上看到插入活动。我从哪里开始寻找。在IS服务器上观看网络活动?

1 个答案:

答案 0 :(得分:5)

在专用服务器上执行的程序包将要求将所有数据传送到该服务器并将其推送到远程服务器。

I made a picture

根据SQL Server主机的配置方式,这可能是一件好事。 SQL Server将使用X量的内存并保持它直到服务循环。 SSIS旋转,完成其工作并释放其资源。如果为操作系统分配了8 GB的RAM,而SQL Server获得了剩余的N GB,则集成服务只能使用6 GB的内存。 SSIS通过大量使用和滥用内存来获得变革的力量。拖动一对排序,将连接和其他一些内存碎片操作符合并到您的数据流中,然后您可以快速将内存降低到零。

如果您改为在ETL框上执行所有转换逻辑,则在开始插入目标表之前,不必担心影响SQL Server和主机操作系统。

只要将数据从A到B和B到C的序列化成本低于直接从A到C的两倍的流成本以及由此产生的内存争用的一些任意软糖因素,我就不会这样做。看到它的问题。一个更具体的例子说明这一点没有意义 - 光纤通道HBA从A到C但B通过10-BaseT连接。对于任何数据量,与B之间的连接将导致处理的相当大的拖累。

数据流卡住或无响应

首先,我希望它只是感觉它被卡住而你实际上并没有在VS中打开包裹并且正在观看""它运行。从Visual Studio中运行包会增加调试器的不小的负担。 Shift-F5,使用dtexec从命令行运行它,或者通过SQL Agent / Windows Scheduler / Tidal / ActiveBatch / etc安排作业以获得" true"性能。此外,请确保您使用的是64位版本的dtexec,除非您需要一个仅存在于32位空间的驱动程序。

此时,我假设您通过非繁琐的机制在ETL Server上执行了一个包。它正在运行,但你不知道发生了什么,只是它没有完成。我们可以将其视为黑盒子,我建议您打开本机SSIS日志记录。登录到SQL Server表(文件可以正常工作,但是您必须对该文件执行某些操作才能获得任何信息)。默认情况下,我在程序包部署模型/ SQL Server 2012之前的世界中记录OnPreExecute / OnPostExecute / OnWarning / OnError / OnInformation / OnTaskFailed。

记录这些事件后,我可以看到任务何时开始并完成。我将看到它使用的配置和可能错过的配置。什么坏了(任务Y失败),可以改进什么(数据流中不需要X列),可能是逻辑错误(Lookup Z在完全缓存模式下遇到重复键)等等。

这不会告诉我数据流中组件之间发生了什么。为此,我需要记录不同的事件。在2005年的环境中,我唯一的技巧是OnPipelineRowsSent事件。在2008年以后,我们可以获得一些新的事件(管道*),但我还没有完成研究,看看他们是否可以提供与OnPipelineRowsSent相同的信息。

因为我懒惰,所以我选择了OnPipelineRowsSent,因为我已经有了查询准备解析数据并找出减速的​​位置。这个事件可能很繁琐,所以只能根据需要转。

那是我的黑盒子路线。你不必这样做。您可以看到您的包正在做什么,并且您知道您的数据。

是否有LOB数据类型? SSIS在内存中做了一切。管道计算出理论上每行可以占用多少内存,并计算出它可以同时处理多少数据。大型对象类型(图像/文本/ varX(最大值))将计算投入地狱,所以在封面下,SSIS 可能创建一个微小的,或者不那么小的二进制文件来保存LOB数据并在数据流任务中携带指针。所有磁盘活动都会影响您的性能。

您的数据流中是否有asynchronous components?这可能会减慢你的转变速度。

您的数据源狗是否很慢(如网络服务)?也许你需要降低缓冲区大小。

或者,如果你有一个SQL Server源代码,你可能只需要尽快将一些数据放入管道中,这样fast 10000技巧可能有所帮助。

也许您的OLE DB目标使用Table或View的2005默认数据访问模式。那就是在您的目标系统上执行单例插入。

同样,您的数据流中是否有OLE DB Command?这也会扼杀单身人士的行动。

那些查找怎么样 - 你是否在查找中删除了比你需要的更多的列?这是在浪费记忆力。您是否需要提取所有年份的所有销售额,或者您是否也可以按当年/滚动N个月等来过滤这些查询?

目标系统有多忙? SSIS可以在目的地获得表锁吗?

您相对于当前大小加载到目标表的数据量是多少?该表上有多少个非聚簇索引。 SQLCAT有一个经验法则 - 1 NCI和100%的数据增加;删除并重新创建索引。超过1个NCI和~10个数据加载,丢弃和重新创建。切勿丢弃群集密钥。 (这些值是近似值,应根据您的系统进行验证)

最后,阻止sp_whoisactive并安装它从文件中剥离create / alter并运行它" in-line"如果是sql server,请查看您的目的地和源系统的情况,否则找到一个等效的工具来监控并确保您的连接仍然存在,没有被阻止等等。