【问题标题】:What is the most efficient way to refresh a table in SQL Server having 15M records from Oracle on daily basis?每天从 Oracle 刷新具有 1500 万条记录的 SQL Server 表的最有效方法是什么?
【发布时间】:2020-04-17 16:57:15
【问题描述】:

我在 SQL 2012 中使用 LinkedServer,并每天使用以下过程从 Oracle 9G 刷新表。表中的当前记录为15M,每天增加2-3K新记录,旧记录也在随机删除和更新。一夜之间完成这项工作需要 7-8 小时。考虑到该表已经在 Oracle 端的索引级别上进行了优化,尝试此操作的最有效方法是什么? 我目前的流程如下:

Truncate table SQLTable
Select * into SQLTable from openquery (LinkedServerName,'Select * from OracleTable')

【问题讨论】:

    标签: sql sql-server oracle linked-server


    【解决方案1】:

    仅针对 3000-8000 行更改截断 15M 行是没有意义的。

    我会考虑使用像 https://sourceforge.net/projects/pentaho/ 这样的 ETL 工具。您可以从免费的社区版开始。

    这个工具提供了一个 Spoon 工具,它基本上提供了图形界面来创建工作流。使用平移工具,您可以执行使用勺子工具创建的文件。基本上使用 Pan 命令创建一个批处理文件并提供 .ktr 文件作为参数。现在,您可以使用 Windows 任务管理器或 Unix CRON 作业来安排这个批处理文件。

    这样,您可以创建一个工作流,该工作流可以查找更改并仅插入或更新更改。

    【讨论】:

    • 我理解并感谢您的回复。如果我们现在只是忽略我的用例,是否有更有效的方法通过链接服务器提取记录?我使用了正确的程序吗?
    • 我是Oracle 人,在SQLServer 工作不多。但似乎您可以以文本形式提供任何查询。因此,您可以使对 oracle 的查询更加健壮,并且只从 oracle 中提取更改。例如“从 oracletable 中选择 * lastupdated>:paramer 或 created>:parameter”。现在在 SQLServer 上,如果有可用的合并查询,则仅使用它来合并更改而不是截断。
    • oracle 表中必须有某种方式来识别更改,使其参数化并根据您在 SQL Server 数据库表中的数据在 SQLServer 存储过程中动态创建文本查询。
    • 似乎是个好主意,在 Openquery 中我只编写 Oracle 查询。那么我们如何在 Oracle 中使用 Merge 呢?
    • 抱歉回复晚了,这里是Oracle合并查询的好例子。 oracletutorial.com/oracle-basics/oracle-merge
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多