微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql-server – SSIS存储过程使用Temp Table 2008和2014

我正在编写一个SSIS包,通过OLE DB Source从存储过程检索数据.存储过程包含一个相当讨厌的查询,我已经能够使用临时表来改进.如果我将这些临时表转换为表变量,则逻辑读数从大约130万跳跃到大约5600万.我对130万人感到不舒服,但是没有办法可以满足5600万条逻辑读数.因此,我无法真正将临时表转换为表变量.

但是,SSIS(或sql Server)无法解析此查询的元数据,因此该程序包将不会运行.我已经在线找到了一些不同的解决方案,但是它们似乎都不适用于sql Server 2008和sql Server 2014.我们目前正在将所有服务器升级到2014,而这一特定的软件包运行于2008年DEV,2014年在质量检查和2008年在目前的生产.到秋天,PROD层将是2014年,DEV层将在此之后推出.不幸的是,我迫不及待地等到这些升级发生,才能发布这个SSIS包.数据需要在下周开始移动.因此,我需要找出一种方法来为两个环境解析元数据.这是我迄今为止所尝试过的

>在IF 1 = 0块中添加一个虚拟选择,返回正确的元数据.这在2008年工作,但不是2014年.
>在存储过程的开头使用SET FMTONLY OFF.这个工作在2008年,但不是2014年.此外,它导致存储过程对返回的每个列运行一次(在这种情况下超过30个),即使它是有效的,这是一个破产者.
>使用EXEC … WITH RESULT SETS((…));.这在2014年工作,但不是在2008年.
>部署存储过程,返回正确的元数据,构建和部署SSIS包,然后将存储过程修改为正确的版本.这在任何一个环境中似乎都不起作用,这将使我们在ETL框架内开发的任何其他ETL应用程序变得复杂.

如果我不明白什么,我可以将不同的存储过程和程序包部署到不同的层次中,但是我更愿意这样做.一方面,这将会使未来的版本变得复杂,我也需要确保在升级服务器之后,不要忘记更新存储过程和包.

我也可以在数据库中创建真正的表,这些表将取代这些临时表.我真的不喜欢这个解决方案,但这是我能忍受的.如果我最终这样做,我将来可能会切换到使用WITH RESULT SETS.

然而,我个人并不在乎这些解决方案之一,所以我想知道是否有任何解决方法,我错过了可能会更好一些.

解决方法

尽管你不情愿,我认为你做出了正确的选择,专门的分期区是正确的方式.我所工作的大多数生产ETL都有一个专门的分期数据库,不用考虑表.然后,您将受益于能够更明确地控制存储,这使得性能更可靠,整个事情通常更易于维护.例如,您可以使用自己的文件组为这些表创建一个专用的快速磁盘空间区块.我肯定会看到两个独立的SP依赖于几个物理表,而不是一个真正的单一的.

也就是说,没有任何细节,这只是我的经验,所以对未来的读者来说是一个警告:与所有的数据库一样,一定要衡量你的场景的实际性能(前后),而不是基于查询做出任何假设计划 – 这可能会误导你.

原文地址:https://www.jb51.cc/mssql/81959.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐