我正在更新数据库中各种实体的记录,并正在积极考虑创建定制的更新请求以延长 SSD 寿命是否有意义。
假设我有一个具有 20 个属性的对象和一个包含相应列的表。
如果我执行,而不是
,写入的字节数(重写的扇区)会有什么不同吗?UPDATE MyTable
SET
Filed1 = @Value1,
Filed2 = @Value2,
Filed3 = @Value3,
.....
Filed18 = @Value18,
Filed19 = @Value19,
Filed20 = @Value20
WHERE
ID = @ID
仅
UPDATE MyTable
SET
Filed3 = @Value3,
Filed17 = @Value17,
Filed20 = @Value20
WHERE
ID = @ID
如果仅更改值 3、17 和 20?
有什么好处吗?
它会有所作为,但不是你想象的那样。它主要影响读取而不是写入。而且 SSD 并不会真正受到大量读取的影响。
SQL Server 已经针对“非更新”更新进行了优化,方法是从现有行中读取值,并仅在需要的地方进行更新。如果行上没有任何更改(并且您没有使用 RCSI 隔离,并且没有
rowversion
或 GENERATED ALWAYS
列),则该行根本不会更新。
但是所有更新都会写入整页,并且一行不能超过一页,因此无论哪种方式,您都会写入整页。唯一不会发生这种情况的情况是当您有 LOB
max
类型时,如果数据太大,该类型会将其数据存储在行外。
因此写入几乎总是发生,但也需要考虑读取,因为 SQL Server 想知道值是否已更改。它要求它使用实际具有这些列的索引,这可能会对执行计划产生不利影响。
因此,如果您知道您不会更改这些列,请不要将它们添加到
UPDATE
。否则我不会担心它,因为它已经大部分优化了。