【问题标题】:T-SQL updates take longer than dropping and adding the columnT-SQL 更新比删除和添加列花费的时间更长
【发布时间】:2012-11-11 06:32:39
【问题描述】:

我需要添加一列,对于所有现有行,该值为 1,对于所有新行,该值默认为 0

很简单,我已经创建了一个脚本

ALTER TABLE Table ADD Column1 BIT NOT NULL DEFAULT 0
GO

UPDATE Table SET Column = 1
GO

在 400K 行数据集上更新查询需要 10 多分钟。 这里的开销在哪里

我怀疑我可以添加列,使默认值为 1,然后在不到 10 秒的计算时间内将默认值更改为 0(并且可能会更改脚本以在下一个测试阶段这样做)。

【问题讨论】:

  • 该死的开销在哪里,如果没有我建议的解决方法,如何优化。
  • 哪一部分需要 10 分钟?第一个查询还是第二个查询?
  • 更新语句需要 10 分钟,alter table 几乎是瞬时的。
  • 添加的列完全如图所示,因此它不会超出 SQL Server 执行的任何内部索引的索引。
  • @Oded 索引列是否会加快update 查询的速度,是否类似于++ii++,其中值是就地更新而不是读取然后更新?

标签: sql tsql sql-server-2005


【解决方案1】:

首先,使用"Print" 并在语句之间放置两个时间戳,以检查哪个具有开销。为了解决一个问题,你应该首先知道导致它的根源。根据我的经验,它添加的列需要很长时间才能完成。

其次,如果表中存储了大约 40 万条记录,那么添加新列当然会产生巨大的 IO 成本。因此,如果您让我知道您的需求,我会想到一个更好的解决方案。添加和删​​除列,更改表等在蓝月亮中发生一次,您不应该像通常的操作那样做这样的事情。这根本不正确。

毕竟,我知道您想在 10 秒内添加一列并更新值,但这取决于许多其他事情,而您的代码(因为它很简单)就是其中之一。所以我认为你应该更多地考虑这个想法而不是你的代码。

希望对你有帮助。

干杯

【讨论】:

  • 我分别运行了每个查询,UPDATE 查询耗时 10 分钟,ALTER 查询几乎立即发生。 :-/
  • @Sparksis 您想要做什么取决于许多其他参数。最重要的是IO操作的性能,简单来说就是硬盘的dist速度。我建议您使用 Profiler 查看成本,使用执行计划并查看查询中实际发生的情况以及成本在哪里。它将帮助您做出决定。
  • 我很想使用分析器,但我在开发服务器上没有适当的权限。 -.- 我们的 DBA 坚持认为他们可以完全控制这些事情,但通常太忙而无法在需要时提供帮助。
  • 啊,当您知道有问题并且您无权做某事时,这很糟糕。但好消息是您在 Management Studio 中仍有执行计划图标,因此请使用它。它会给你一些令人难以置信的信息配置文件永远不会。希望能帮助到你。如果您有任何问题,也请告诉我。
猜你喜欢
  • 2019-11-22
  • 2012-02-18
  • 2014-06-19
  • 2021-02-09
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多