sql:DELETE + INSERT vs UPDATE + INSERT

时间:2010-06-03 15:53:00

标签: sql tsql sql-server-2008

有人问过类似的问题,但由于它总是取决于我,所以我会分别询问我的具体情况。

我有一个网站页面,显示来自数据库的一些数据,并且要从该数据库生成数据,我必须做一些相当复杂的多连接查询。

数据每天更新一次(每晚一次)。

我想预先生成所述视图的数据,以加快页面访问速度。

为此,我正在创建一个包含我需要的确切数据的表。

问题:对于我的情况,完成表格擦除然后插入是否合理?或者我应该更新,插入?

SQL明智的看起来像DELETE + INSERT会更容易(INSERT部分是单个SQL表达式)。

编辑: RDBMS:MS SQL Server 2008 Ent

7 个答案:

答案 0 :(得分:13)

TRUNCATE比删除更快,所以如果你需要清空一个表,那就改为

您没有指定您的RDBMS供应商,但其中一些也有 MERGE / UPSERT 命令这使您可以在数据存在时更新表,如果数据不存在则插入

答案 1 :(得分:1)

部分取决于数据的访问方式。如果你有一段时间没有(或很少)用户访问它,那么对数据消失(在DELETE和INSERT完成之间)的影响不会有太大的影响。

答案 2 :(得分:1)

您是否考虑使用物化视图(MSSQL将其称为索引视图)而不是手动执行?这也可能具有其他性能优势,因为索引优化器在为视图中引用表的其他查询构建执行计划时为查询优化器提供了更多选择。

答案 3 :(得分:0)

这取决于表的大小和数据库上的恢复模型。如果要删除数十万条记录并恢复它们而不是更新几百个小批量并插入数十行,则会在事务日志中添加不必要的大小。但是,您可以使用TRUNCATE来解决此问题,因为它不会影响事务日志。

您可以选择MERGE / UPSERT吗?如果您正在使用MS-SQL,则可以使用CROSS APPLY执行类似的操作。

答案 4 :(得分:0)

处理此类问题的一种方法是插入新表,然后执行表重命名。这将确保所有新数据同时出现。

答案 5 :(得分:0)

如果昨天出现的某些数据不再存在怎么办?删除可能更安全,或者您最终可能会删除某些记录。

最后,你走哪条路并不重要。 除非@kevinw提到

答案 6 :(得分:0)

虽然我完全赞同SQLMenace's answer,但我想指出MERGE NOT 删除不需要的记录!如果您确定新数据将是现有数据的超集,那么MERGE非常棒,否则您需要确保稍后删除任何多余的记录,或者使用TRUNCATE + INSERT方法... (我个人仍然是后者的粉丝,因为它通常非常快,只需确保提前删除所有索引/唯一约束并逐个重建它们。这有利于INSERT事务更小和索引 - 稍后再次在(较小的)交易中添加)。 (**)

(**:是的,这在现场系统上可能会很棘手,但是他再次提到这是在某种过夜期间完成的,我是外推没有用户访问权限那个时候)