代码之家  ›  专栏  ›  技术社区  ›  THX-1138

SQL:删除+插入vs更新+插入

  •  5
  • THX-1138  · 技术社区  · 15 年前

    有人问了一个类似的问题,但由于总是要看情况而定,所以我要单独问我的具体情况。

    我有一个网站页面,显示了一些来自数据库的数据,为了从该数据库生成数据,我必须执行一些相当复杂的多重连接查询。

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

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

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

    问题: 对于我的情况,在插入后进行完整的桌面擦除是否合理?还是应该更新,插入?

    SQL方面似乎删除+插入更容易(插入部分是单个SQL表达式)。

    编辑: RDBMS:MS SQL Server 2008 Ent

    7 回复  |  直到 15 年前
        1
  •  13
  •   SQLMenace    15 年前

    截断将比删除更快,因此如果需要清空表,请执行该操作。

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

        2
  •  1
  •   kevinw    15 年前

    这部分取决于如何访问数据。如果您有一段时间没有(或很少)用户访问它,那么短时间内不会对数据消失(在删除和插入完成之间)产生太大影响。

        3
  •  1
  •   Donnie    15 年前

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

        4
  •  0
  •   Joe Swan    15 年前

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

    您有合并/升级选项吗?如果您使用的是MS-SQL,则可以使用交叉应用来执行类似的操作(如果不使用)。

        5
  •  0
  •   Gary    15 年前

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

        6
  •  0
  •   Imre L    15 年前

    如果昨天的一些数据已经不复存在了呢?删除可能更安全,也可能最终删除一些记录。

    最后,你走哪条路并不重要。 除非在案件中提到

        7
  •  0
  •   Community CDub    8 年前

    尽管我完全同意 SQLMenace's answer 我想指出合并确实 不是 删除不需要的记录!如果您确定您的新数据将是现有数据的超级集,那么合并非常好,否则您将需要确保稍后删除任何多余的记录,或者使用truncate+insert方法… (就我个人而言,我仍然是后者的粉丝,因为它通常很快,只需确保预先除去所有索引/唯一约束,然后逐个重新构建它们。这样做的好处是插入事务更小,索引添加在(较小的)事务中稍后再次进行)。(**)

    (**:是的,这在实时系统上可能很棘手,但他再次提到这是在某个晚上完成的,无论如何,我是 外推 当时没有用户访问权限)