【问题标题】:Faster SQL Server: insert the null, or skip it?更快的 SQL Server:插入空值,还是跳过它?
【发布时间】:2026-01-17 02:25:01
【问题描述】:

简单的 SQL Server 问题..哪个更快:

  1. 在您跳过列的位置插入(作为 NULL)
  2. 在显式插入 NULL 的位置插入?

.... 为什么?

CREATE TABLE dbo.myTable
(
     Id int CONSTRAINT PK_myTable_Id PRIMARY KEY,
     Name varchar(200) NULL
)
GO

INSERT INTO dbo.myTable(Id) VALUES (1);
INSERT INTO dbo.myTable(Id, Name) VALUES (2, NULL);
GO

请提供参考或基准(这样您的答案就不仅仅是一种意见)。

谢谢。

PS:我可以运行 2 个大型循环,并比较总时间,但它仍然无法告诉我原因..

【问题讨论】:

  • 如果您关心优化这些步骤,那么您显然专注于错误的事情。
  • 我从来没有考虑过这一点,但差异(如果有的话)太小了,根本不值得花任何精力。
  • race your horses,如果你真的关心这个。
  • “以及为什么”这个问题太宽泛了。我听说过“Sql Server Internals”一书的好消息。

标签: sql sql-server performance query-performance


【解决方案1】:

这对性能完全没有影响。语句的编译可能存在纳秒级的差异,但实际所做的工作是相同的:

  • 数据库引擎必须记录插入。
  • 需要找到数据页进行插入。
  • 它必须将整个记录的数据复制到数据页中。
  • 它必须为记录设置 NULL 位。

查找NULL 默认值是引擎确定记录格式的一部分。由于细微差别,性能可能存在极小的差异,例如:

  • 查找默认的NULL 值。这可能会有所不同,具体取决于是否实际定义了默认约束。
  • 解析更长的查询字符串。

如果查询被缓存,这些都不是问题。如果多次运行,查询将被缓存。在一次执行中,很难可靠地测量差异。

【讨论】: