我们正在从两个不同的来源将数据传输到Oracle数据库,而且速度极慢。
请参阅下面的注释和图片。有什么建议吗?
注意:
图片:
答案 0 :(得分:2)
在Oracle方面,您可以检查v $ session以查看花费的时间(如果AWR在Oracle实例上获得许可,则可以使用DBA_HIST_ACTIVE_SESS_HISTORY或v $ active_session_history)。
我每天都在研究Oracle性能问题(超过300个生产Oracle实例),所以我觉得有资格说我无法给你一个特定的问题答案,但我可以指出你正确的方向
使插入变慢的典型过程错误:
不使用数组插入
为每个插页连接数据库(听起来很奇怪?相信我 我已经看到DataStage和其他ETL工具以这种方式设置了)
应用服务器/客户端与Oracle实例不在同一局域网
正在插入的表上的索引(特别是有问题的 位映射索引);需要索引更新和表更新 声明
在Oracle实例上重做日志文件太小(开机了 重做日志文件切换)
DB侧的log_buffer参数太小
没有足够的db编写器(请参阅db_writer_processes初始化 参数)
经常提交
答案 1 :(得分:1)
不是答案,只是一堆观察和问题......
数据管道中的任何一个组件都可能成为瓶颈。
首先需要在SSIS中以交互方式运行时观察行计数,看看是否有任何明显的堵塞 - 即您在数据转换转换之前是否有一个大的行数,而在数据转换之后有一个较低的行数?或者它是在Oracle目的地?或者只是花了很长时间才能走出SQL?检查SQL端的一种快速方法是将其转储到本地文件 - 这主要是测量SQL选择性能而不会阻止Oracle。
在SQL Server中运行源查询时,返回所有行需要多长时间?
您的数据转换转换可以在源查询中执行。每次转换都需要设置缓冲区,内存等,并且可能会减慢并阻止数据流。避免这些并在源查询中执行
Oracle驱动程序中存在的各种缓冲区和配置。已经由@RogerCornejo详细解决了。对于Oracle的读取性能,我发现改变FetchBufferSize会产生巨大的差异,但是你在这里做的是写,所以情况并非如此。
最后,两个数据库服务器和SSIS客户端工具在哪里?如果您在三个不同的服务器上运行它,那么您需要考虑网络吞吐量。
如果您按照建议使用链接服务器,请注意SSIS根本不进行任何处理,因此您可以将整个部分从等式中删除
如果您只是寻找传输数据的最快方式,您可能会发现转储到文件并批量插入是最快的
答案 2 :(得分:0)
谢谢大家的建议。对于那些可能在未来遇到类似问题的人,我发布了最终为我工作的内容。 答案是......转换提供商。 ODBC或Attunity提供程序要快得多,几乎是800倍。
请记住,我的目标是将数据从SQL Server数据库移动到Oracle数据库。我最初使用OLE DB提供程序来源和目标。如果要将数据从SQL Server移动到SQL Server ,此提供程序可以正常工作,因为它允许您使用目标上的“快速加载”选项,从而允许您使用批处理。
但是,OLE DB提供程序不允许使用Oracle DB作为目标的“快速加载”选项(无法使其工作并在别处读取它不起作用)。因为我无法使用“快速加载”选项,所以我无法批处理,而是逐行插入记录,这非常慢。
一位同事建议尝试使用ODBC,其他人建议尝试使用Microsoft的Attunity Connectors for Oracle。我不认为差别会那么大,因为根据我的经验,ODBC的性能与OLE DB相似(有时甚至更低)(没有尝试过Attunity)。但是......那时将数据从SQL Server数据库移动到或停留在Microsoft世界中。
将数据从SQL Server数据库移动到Oracle数据库时,存在巨大差异! ODBC和Attunity都显着地执行了OLE DB。
以下是我汇总的性能测试结果,它将5.4M记录从SQL Server数据库插入Oracle数据库。
在一台本地计算机上完成所有工作时。
将数据从一台网络/远程计算机移动到另一台网络/远程计算机时。
差异很大!
现在为什么在本地工作时只用了30秒而远程需要花费5分钟是另一天的另一个问题,但是现在我有一些可行的东西(在网络上它应该更慢,但是它会慢得多)。
再次感谢大家!
额外说明: