同步表 - UPDATE INSERT DELETE的顺序是否重要?

时间:2013-10-02 18:46:44

标签: sql sql-server sql-server-2008 tsql sql-server-2005

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

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

感谢StackOverflow社区,你真棒!

3 个答案:

答案 0 :(得分:4)

我会说,首先你delete,然后update然后insert,所以你不必更新将被删除的行,你不会更新刚刚插入的行。

但实际上,您是否看过SQL Server merge语法?它可以为您节省大量代码。

更新我没有检查针对INSERT / UPDATE / DELETE的MERGE语句的性能,这里是Aaron Bertrand给出的相关link的详细信息。

答案 1 :(得分:0)

我认为罗曼的回答是你在当前情况下所寻找的:DELETE,UPDATE,INSERT(或MERGE。)

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

1。考虑将所有订单保存在您偶尔针对目标

运行的文件中

假设两个数据库完全相同,对于修改2008数据库的每个SQL顺序,将该顺序保存在稍后针对2005数据库执行的.sql文件中。您必须考虑在写入文件时锁定文件,并且可能具有某种冗余。但是,这意味着在完成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副本将在几秒钟内更新(取决于它是否是远程远程连接,工作量,每台服务器的设置,互联网连接等。)

显然,它会在数据库中添加一个正在进行的进程,但是如果你发现一个MSSQL工具就像PostgreSQL的流复制一样,它会使用一个日志副本,这意味着它快速死了(没有大量使用磁盘I / O.)

3。群集数据库(如Cassandra)

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

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

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

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

答案 2 :(得分:0)

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

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

  1. 更新您将立即删除的内容。
  2. 插入内容可能会立即尝试更新。
  3. 如果您只修改了必要的内容并正确使用了交易,那么您可以使用任何订单 附:有人建议使用MERGE - 我已尝试了几次,我的偏好是永远不会使用它。