2016-01-15 60 views
8

我有一个Oracle数据库和一个SQL Server数据库。有一个表格说Inventory,它在两个数据库表中都包含数百万行,并且它不断增长。将Oracle的数百万条记录与SQL服务器进行比较

我想将Oracle表数据与SQL Server数据进行比较,以了解SQL Server表中每天缺少哪些记录。

这是最好的方法吗?

  1. 创建SSIS包。
  2. 创建Windows服务。

我想消耗更少的资源来实现这个功能,这需要更少的时间和更少的资源。

例如:在Oracle 18数点以百万计的记录和16/17数以百万计的SQL Server

两个不同的数据库中,这种情况的出现是因为在网上两个不同的应用和离线

编辑:有关连接SQL Server如何从Oracle通过Oracle网关到SQL服务器到

1)直接从Oracle查询到SQL服务器,第一次更新SQL服务器中缺失的记录。

2)在Oracle上创建一个触发器,当从Oracle删除记录时它将被执行,并将删除的记录插入到新的Oracle表中。

3)创建SSIS包,将新创建的oracle表映射到SQL服务器以更新SQL服务器记录。这样一来只有少数记录需要每天通过SSIS进行处理。

您如何看待这种方法?

+0

我认为一个好的长期战略是不将你的状态存储在不同的RDBMS中。你能否更新这个问题来解释你如何最终解决这个问题? –

+0

您能否向我们解释目前记录是如何重复的? – Giova

+0

Oracle数据库有所有的记录..有可能从oracle数据库中删除记录,我们必须更新从oracle数据库中删除的SQL服务器记录 – Mahajan344

回答

0

其他替代方案:

如果你可以使用Oracle网关用于SQL Server,那么你不需要传输数据,还可以直接进行查询。

如果您不能使用Oracle网关,则可以使用Pentaho数据集成或其他ETL工具来比较表并获取结果。易于使用。

+0

您的回答非常含糊,至少对我而言,因为它没有提供任何线索来说明如何实现这一点。还要考虑一个应用程序处于脱机状态的情况。 – hotzst

+0

嗨。我只提出了一个替代程序传输数据的方法。使用SQLServer的oracle网关,您可以直接进行比较。与ETL工具一样,但这种替代方法是不同的。 – JLC

1

我会创建一个SSIS包并使用数据流/ OLE DB数据源从Oracle表中加载数据。如果你有SQL企业版,Attunity连接器要快一点。

然后,我会从SQL Server表中加载密钥到Lookup转换中,在那里匹配键上的2个源,并将不匹配的行导入到单独的输出中。

最后,我会指示不匹配的行输出到OLE DB命令,以更新SQL Server表。

这个SSIS包需要大量的内存,但由于匹配是在内存中以最小的IO完成的,它可能会超越其他解决方案的速度。它将需要足够的空闲内存来缓存SQL Server表中的所有密钥。

如果您稍后需要SSIS,SSIS还具有很多其他可用的转换功能。

+0

感谢您的回复。因此,您建议使用SSIS包来比较18百万的Oracle记录和15/16万个SQL服务器记录与SSIS查找的最佳方法? – Mahajan344

+0

是的,由于最小的IO。 SSIS只需要从Oracle和SQL Server表中读取一次,然后在内存中匹配,其中大多数其他技术需要读取和写入(然后再读取)其中一个大型数据集。 –

+0

我不认为SSIS Lookup能够处理那个音量(尽管我很高兴能够纠正)。如果存在一定程度的复杂性(即不区分大小写或范围查找),则必须逐行执行查找,这对于1800万条记录来说将非常缓慢。 –

0

我认为最好的方法是使用oracle网关。只需按照以下步骤操作即可。我有类似的经验。

  1. 安装和配置SQL Server的Oracle数据库网关。 https://docs.oracle.com/cd/B28359_01/gateways.111/b31042/installsql.htm
  2. 现在你可以创建一个从oracle到sql server的dblink。
  3. 创建一个比较oracle数据库中缺失的记录并插入到sql server数据库的过程。

例如,您可以在您的过程中使用此语句。

INSERT INTO "dbo"."sql_server_table"@dblink_name("column1","column2"...."column5") 
VALUES 
(
    select column1,column2....column5 from oracle_table 
    minus 
    select "column1","column2"...."column5" from "dbo"."sql_server_table"@dblink_name 
) 
  • 创建其中每日执行该过程的调度器。
  • 当两个数据库联机时,丢失的记录将被插入到sql server中。否则,调度程序失败或者您可以手动执行该过程。 它需要最少的资源。

    1

    你基本上想要做的是从Oracle到SQL Server的复制。

    你可以在SSIS,Windows服务或甚至多种平台上做到这一点。 真正的诀窍是使用正确的设计模式。

    一般有两种设计模式

    1. 快照复制

    你拿从两个系统中的所有记录,并将其地方比较(到目前为止,我们已经建议在SSIS比较或比较上甲骨文,但还没有建议在SQL Server上比较,虽然这是有效的)

    您正在比较1800万条记录,所以这是很多工作

  • 差分复制
  • 您记录在发行者的改变(即Oracle),然后将这些更改应用于订阅者(即SQL Server)

    您可以通过在Oracle端实现触发器和日志表来手动执行此操作,然后使用常规ETL过程(SSIS,命令行工具,文本文件,等等),可能在SQL代理中安排将这些应用到SQL Server。

    或者你可以通过使用现成的复制能力的建立Oracle作为一个出版商和SQL为用户做到这一点:https://msdn.microsoft.com/en-us/library/ms151149(v=sql.105).aspx

    你将不得不尝试一些这些,看看什么适合你。

    鉴于这一目标:

    我要消耗更少的资源来实现这一功能,它需要更少的时间和更少的资源

    事务复制更为高效而复杂。出于维护目的,您最喜欢哪个平台(.Net,SSIS,Python等)?

    0

    我会建议有一个自制的ETL解决方案。

    1. 附表一oracle job导出源表数据(基于所述应用逻辑的每日 方式)to plain CSV格式。
    2. 安排a SQL-Server job(从第一个oracle作业可接受的延迟)读取此CSV文件,并使用BULK INSERT将其导入到sql-servter内的中型表中并将其导入 。
    3. SQL-Server作业的最后部分将读取中等表数据 并执行逻辑(插入,更新目标表)。我建议有另一个表来存储这个日常工作结果的报告。
    相关问题