SSIS存储过程使用临时表2008和2014

15
我正在编写一个SSIS包,通过OLE DB源从存储过程中检索数据。存储过程包含一个相当复杂的查询,我已经使用临时表改进了它。如果我将这些临时表切换到表变量,逻辑读取将从大约130万跳到大约5600万。尽管我对130万不太舒服,但我绝不能满足于5600万个逻辑读取。因此,我无法将临时表转换为表变量。
然而,SSIS(或者更确切地说是SQL Server)无法解析此查询的元数据,因此该程序包将无法运行。我在网上找到了一些不同的解决方案,但没有一个适用于SQL Server 2008和SQL Server 2014。我们目前正在升级所有服务器到2014年版,这个特定的包在DEV中针对2008运行,在QA中针对2014运行,在生产中目前针对2008运行。到秋天,PROD层将是2014年版本,DEV层将在此之后晋升。不幸的是,我无法等到这些升级发生才发布这个SSIS包。数据需要在下周开始移动。因此,我需要找出一种方法来解析两个环境的元数据。以下是我到目前为止尝试过的方法:
  1. IF 1=0块中添加一个虚拟的select语句,它返回正确的元数据。这在2008年版中有效,但在2014年版中无效。
  2. 在存储过程开头使用SET FMTONLY OFF。这在2008年版中有效,但在2014年版中无效。此外,它会导致存储过程针对每个返回的列(在此情况下超过30个)运行一次,即使它有效也是无法接受的。
  3. 使用EXEC ... WITH RESULT SETS ((...));。这在2014年版中有效,但在2008年版中无效。
  4. 部署一个返回正确元数据的存储过程,构建并部署SSIS包,然后将存储过程修改为正确版本。但无论在哪个环境下似乎都没有起作用,这会使我们ETL框架中开发的任何其他ETL应用变得复杂。

如果我找不到解决方案,我可以在不同的层次上部署不同的存储过程和包,但我非常不希望这样做。首先,这会使未来的发布变得更加复杂,而且一旦我们升级服务器,我还需要确保不要忘记更新存储过程和包。

我也可以在数据库中创建真实表格来代替这些临时表。我并不是很喜欢这个解决方案,但这是我能够容忍的。如果我最终采用这种方法,我可能会在将来切换到使用WITH RESULT SETS

然而,我个人并不太喜欢这两种解决方案,所以我想知道是否有任何我错过的解决方法,可能会更好些。


4
你的第一篇文章非常出色,清楚地表明你已经做了调查研究。关于“临时表和表变量”的区别,我为你提供了额外的研究资料,链接在这里:http://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server - billinkc
1
你对于2008年和2012年之间SSIS处理临时表的重大变化说得一点也没错。但是请帮我回忆一下,为什么SSIS包会发生变化呢?无论调用者是2008还是2014,它都会调用dbo.MyProc。只是底层过程需要根据环境进行更正,是这样吗? - billinkc
1
使用一个包装存储过程怎么样?在两个SSIS服务器上,相同的SSIS代码调用相同的存储过程名称。在2014年,该过程使用WITH RESULT SETS调用执行实际工作的子过程。在2008年,包装过程使用IF 1=0并调用相同的子过程(或相同的过程代码但在2008年)。 - Tab Alleman
1
你尝试过将包的延迟验证设置为true吗?这样它在运行该步骤之前就不会查找元数据了。 - Joseph Gagliardo
这是一个真正的临时表 "@Table" 还是一个普通的表,你只是暂时存储数据? - Jason Geiger
显示剩余8条评论
1个回答

2
尽管你不情愿,但我认为你做出了正确的选择,专门的暂存区是正确的方法。我使用过的大多数生产ETL都有专用的暂存数据库,更不用说表了。这样您就可以更明确地控制存储,使性能更可靠,整个过程更易于维护。例如,您可以为这些表创建一个专用的连续块的快速磁盘空间,具有自己的文件组等。我肯定宁愿看到两个依赖于几个物理表的单独SP,而不是一个非常复杂的单一SP。
话虽如此,在不知道任何具体信息的情况下,这只是我的经验,因此对于未来的读者,请注意:与所有数据库相关的事情一样,请确保测量实际情况的性能(之前和之后),而不是根据查询计划做任何假设 - 它可能会误导您。

我在这里同意Matt的观点。如果性能真的很差,那就尝试优化物理临时表。尝试发现您的表变量与临时表在各种大小和基数的数据集上的使用模式。从我的经验来看,每个环境都有一个“甜点”,在这个点上,将数据写入磁盘而不是内存更有意义。有趣的部分是随着时间的推移,这一点会发生变化。工作保障! - C B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接