3

我需要每天在 2 个数据库之间同步表,源是 MSSQL 2008,目标是 MSSQL 2005。如果我使用 UPDATE、INSERT 和 DELETE 语句(即 UPDATE 更改的行、INSERT 新行、DELETE 行不再存在),如果我先执行 DELETE 语句,会有性能改进吗?即这样 UPDATE 语句不会查看不需要更新的行,因为它们将被删除。

这是我需要考虑的其他一些事情。这些表有 1-3 百万+ 行,并且由于事务量和业务需求,源 DB 需要保持在线,并且查询需要尽可能高效。该作业将每天在目标数据库上的 SQL Server 代理作业中运行。最重要的是,我是一名 DB 菜鸟!

感谢 StackOverflow 社区,你太棒了!

4

3 回答 3

6

我想说,首先你做delete,然后updateinsert所以你不必更新无论如何都会被删除的行,你也不会更新刚刚插入的行。

但实际上,你见过 SQL Server合并语法吗?它可以为您节省大量代码。

更新我没有检查MERGE对 INSERT/UPDATE/DELETE 语句的性能,这里是Aaron Bertrand 提供的相关链接以获取更多详细信息。

于 2013-10-02T18:51:52.687 回答
1

经验法则: DELETE,然后UPDATE,然后INSERT

除了性能之外,我主要关心的是在以下情况下避免任何潜在的死锁

  1. 更新您将立即删除的内容。
  2. 插入您可能会立即尝试更新的内容。

如果您只修改必要的内容并正确使用交易,那么您可以使用任何订单。
PS有人建议使用MERGE- 我已经尝试了几次,我的偏好是永远不要使用它。

于 2015-12-04T11:49:59.727 回答
0

我认为 Roman 的答案是您在当前情况下正在寻找的内容:DELETE、UPDATE、INSERT(或 MERGE。)

现在还有其他可能的路线可以使事情变得更快,但过程却截然不同:

1. 考虑将所有订单保存在一个文件中,您偶尔会针对目标运行该文件

假设两个数据库完全相同,对于修改 2008 数据库的每个 SQL 顺序,将该顺序保存在 .sql 文件中,稍后您将针对 2005 数据库执行该文件。您必须考虑在写入文件时锁定文件,并且可能存在某种冗余。但是,这意味着您在处理 2005 数据库时根本不需要访问 2008 数据库。换句话说,对 2008 数据库速度没有副作用。

陷阱:您可能会错过一个声明,并且目的地不会是完全等价的......

2. 持续复制

我对 MSSQL 的了解不足以告诉你一个做自动复制的好工具(见这里:http ://technet.microsoft.com/en-us/library/ms151198.aspx ),但我敢打赌你可以找个好工具。MySQL ( http://dev.mysql.com/doc/refman/5.0/en/replication.html ) 和 PostgreSQL ( http://wiki.postgresql.org/wiki/Streaming_Replication ) 有这样的工具,而且都是免费的。

这将是我会选择的解决方案。根据您使用的工具,它可以得到很好的优化,这意味着对实时系统的影响将是最小的,并且 2005 副本将在几秒钟内更新(取决于它是否是长距离远程连接,工作量、每台服务器的设置、互联网连接等)

陷阱显然是它在数据库上添加了一个持续的进程,但是如果你找到一个像 PostgreSQL 的流复制一样工作的 MSSQL 工具,它会使用日志的副本,这意味着它非常快(没有大量使用磁盘 I/O。)

3.集群数据库(如Cassandra)

这将涉及更改数据库,我完全确定您还没有准备好这样做(尤其是因为这些系统中的大多数不提供 SQL),但我认为在您的情况下谈论这将是一件好事。

像 Cassandra ( http://cassandra.apache.org/ ) 这样的系统会自动在多台计算机上复制其数据。它实际上可以设置为每台计算机复制所有数据 100% 或 X% 的数据,并在出现故障(计算机发生故障)时具有冗余。这减少了对单独计算机上特定副本的需求,因为只需在系统中添加几个节点即可提高性能。(一台计算机不到 1,000 美元,这是值得的!坦率地说,您可以以 5 万美元或更少的价格创建一个 Peta Byte 系统,并最终得到比任何 SQL 数据库都快得多的东西......)

主要问题是这些集群的使用与 SQL 完全不同。但这对于拥有大型数据库的大型企业来说可能是一个解决方案,这些大型数据库需要非常快并且他们不想投资小型计算机(想想 Cobol 和价值 25 万美元的计算机,它们可以在几毫秒内管理 1 亿行...... .)

使用 Cassandra,您可以在不会影响前端系统的后端计算机上运行极其繁重的批处理!

于 2013-10-02T20:08:50.907 回答