blunders Asked: 2012-02-11 17:48:52 +0800 CST2012-02-11 17:48:52 +0800 CST 2012-02-11 17:48:52 +0800 CST 查找和更新少量记录的最佳实践? 772 似乎是一个简单的问题,但想知道如果您“点缀您的 i 并交叉您的 t”,那么执行此操作的“最佳”方法是什么。 best-practices select 1 个回答 Voted Best Answer Aaron Bertrand 2012-02-12T06:27:51+08:002012-02-12T06:27:51+08:00 没有更多细节,这就是我所能提供的: 不要使用视觉设计师。 您可能很想在 Management Studio 中使用“编辑前 200 行”(以前称为“打开表”)来“编辑”数据,例如电子表格。抵制诱惑。这些设计者充满了错误,在表上持有不必要的锁,任意选择 200 行,直到您修改 SQL 查询并不得不再次运行它,并且只是有彻头彻尾的意外行为。(例如,您是否知道要输入1或0输入一BIT列,您必须输入True或False?在 SQL Server 2012 版本的 Management Studio 之前输入1或0产生错误。)使用查询窗口并编写UPDATE带有WHERE子句的正确语句 -除了具有 DML 的全部功能(包括UPDATE基于连接,您不能与设计器一起做),您还可以保存查询,将它们放入源代码管理等。您可以在表格网格中完成的工作的唯一方法是拍摄视频你做了什么。 验证你的工作。我通常有这样的事情: UPDATE t SET x = REPLACE(x, 'foo', 'bar'), y = x + ' line 2' FROM dbo.table AS t WHERE ID = 1; 这样可以很容易地注释掉前两行并添加SELECT,以便我可以检查输出。所以在我运行更新之前,我可以这样检查: --UPDATE t --SET SELECT x = REPLACE(x, 'foo', 'bar'), y = x + ' line 2' FROM dbo.table AS t WHERE ID = 1; 这向我展示了两件事:(1)我的SET命令是否以正确的方式更改了列数据,以及(2)我的WHERE子句是否选择了正确的行和正确的行数。 保护自己免受肥胖指法。当我对关键数据执行临时更新时,我总是开始查询,BEGIN TRANSACTION;然后在下面有一个注释--ROLLBACK TRANSACTION;和语句,只有当我对受影响的正确行数感到满意时,我才会--COMMIT TRANSACTION;突出显示并运行该命令。在 SO 问题中,该人建议您应该运行一次,然后再运行一次 - 我认为这一步太多了,特别是如果操作需要很长时间,持有很多锁等。您应该能够验证在不执行操作的情况下是否工作,将其回滚,然后重新执行整个操作。对我来说COMMITUPDATEROLLBACKROLLBACK如果我在错误的时间按 F5,是否只突出显示了部分查询,等等。这样的事情: BEGIN TRANSACTION; /* query goes here */ -- COMMIT TRANSACTION; -- ROLLBACK TRANSACTION; 实际上,我使用 Mladen Prajdic 的SSMS 工具包和新查询的自定义模板,这样我就可以一直使用它。是的,当我只想对非生产实例运行一个快速的临时查询时,这很烦人,但是只需 Ctrl+A 就可以很容易地覆盖它。它还有其他一些简洁的功能,而且它是免费的,所以无论如何都值得一试。 研究表。您可能认为您只更新了一行或几行,但可能还有其他您不知道的副作用。触发器、索引视图等。根据您更新的行数,您可能会觉得需要手动更新统计信息(特别是如果您对过滤索引的结果进行了重大更改,这是最近出现的)。 保护自己不被解雇。我们都会犯错误,即使遵循这些规则,您仍然可能会因临时更新生产数据而导致意想不到的后果。因此,在执行此类操作时,请始终做两件事: 在执行更新之前备份数据。当您无法控制谁在更新数据(或备份计划/链)时,我见过的一个技巧是延迟使用日志传送。因此,您无需立即恢复副本上的日志,而是等待 8 小时。这样一来,如果有人在白天对数据进行了愚蠢的更新,那么至少会有一些不太旧的数据边缘副本,您可以毫不费力地取回受影响的行。在一家商店,我们称其为“再次向自己的脚开枪,嗯?” 保险政策。由于一次错误更新而不得不对整个数据库执行时间点恢复,这在大型系统中可能是相当灾难性的。 保持你的简历是最新的。如果您经营的UPDATE公司会削弱客户或破坏您的业务或给人们带来大量过度工作和压力,那么他们可能会开始寻找堕落的人。不要做一个堕落的家伙。
没有更多细节,这就是我所能提供的:
不要使用视觉设计师。 您可能很想在 Management Studio 中使用“编辑前 200 行”(以前称为“打开表”)来“编辑”数据,例如电子表格。抵制诱惑。这些设计者充满了错误,在表上持有不必要的锁,任意选择 200 行,直到您修改 SQL 查询并不得不再次运行它,并且只是有彻头彻尾的意外行为。(例如,您是否知道要输入
1
或0
输入一BIT
列,您必须输入True
或False
?在 SQL Server 2012 版本的 Management Studio 之前输入1
或0
产生错误。)使用查询窗口并编写UPDATE
带有WHERE
子句的正确语句 -除了具有 DML 的全部功能(包括UPDATE
基于连接,您不能与设计器一起做),您还可以保存查询,将它们放入源代码管理等。您可以在表格网格中完成的工作的唯一方法是拍摄视频你做了什么。验证你的工作。我通常有这样的事情:
这样可以很容易地注释掉前两行并添加
SELECT
,以便我可以检查输出。所以在我运行更新之前,我可以这样检查:这向我展示了两件事:(1)我的
SET
命令是否以正确的方式更改了列数据,以及(2)我的WHERE
子句是否选择了正确的行和正确的行数。保护自己免受肥胖指法。当我对关键数据执行临时更新时,我总是开始查询,
BEGIN TRANSACTION;
然后在下面有一个注释--ROLLBACK TRANSACTION;
和语句,只有当我对受影响的正确行数感到满意时,我才会--COMMIT TRANSACTION;
突出显示并运行该命令。在 SO 问题中,该人建议您应该运行一次,然后再运行一次 - 我认为这一步太多了,特别是如果操作需要很长时间,持有很多锁等。您应该能够验证在不执行操作的情况下是否工作,将其回滚,然后重新执行整个操作。对我来说COMMIT
UPDATE
ROLLBACK
ROLLBACK
如果我在错误的时间按 F5,是否只突出显示了部分查询,等等。这样的事情:实际上,我使用 Mladen Prajdic 的SSMS 工具包和新查询的自定义模板,这样我就可以一直使用它。是的,当我只想对非生产实例运行一个快速的临时查询时,这很烦人,但是只需 Ctrl+A 就可以很容易地覆盖它。它还有其他一些简洁的功能,而且它是免费的,所以无论如何都值得一试。
研究表。您可能认为您只更新了一行或几行,但可能还有其他您不知道的副作用。触发器、索引视图等。根据您更新的行数,您可能会觉得需要手动更新统计信息(特别是如果您对过滤索引的结果进行了重大更改,这是最近出现的)。
保护自己不被解雇。我们都会犯错误,即使遵循这些规则,您仍然可能会因临时更新生产数据而导致意想不到的后果。因此,在执行此类操作时,请始终做两件事:
UPDATE
公司会削弱客户或破坏您的业务或给人们带来大量过度工作和压力,那么他们可能会开始寻找堕落的人。不要做一个堕落的家伙。