You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server性能对比:省略列默认NULL与显式插入NULL哪种更快?

两种INSERT操作的性能对比:几乎无差异

这是个挺细节的问题,我结合SQL Server的内部机制和实际基准测试来给你说明:

核心结论

两种插入方式的执行速度完全一致,不存在可观测的性能差异。

底层原因分析

当你省略允许为NULL且无DEFAULT约束的列时,SQL Server的查询优化器会自动将这些列的值填充为NULL——这个逻辑和你显式写入NULL的处理流程完全相同:

  • 两种写法生成的执行计划完全一致(可以通过SET SHOWPLAN_XML ON查看验证),最终都是执行Clustered Index Insert操作,没有额外的分支或处理步骤;
  • 数据写入阶段,不管是隐式还是显式的NULL,对存储引擎来说都是写入相同的NULL标记(SQL Server中NULL在可变长度列中仅占用字节标记,固定长度列则占用默认空值空间),没有任何存储或写入开销的区别。

基准测试验证

我在SQL Server 2019 Developer Edition(本地SSD存储,8核16G内存环境)下做了10万次循环插入的测试,代码如下:

-- 初始化环境
TRUNCATE TABLE dbo.myTable;

-- 测试方式一:省略允许NULL的列
DECLARE @Start DATETIME = GETDATE();
DECLARE @i INT = 0;
WHILE @i < 100000
BEGIN
    INSERT INTO dbo.myTable(Id) VALUES (@i);
    SET @i = @i + 1;
END
SELECT '方式一耗时' AS TestCase, DATEDIFF(ms, @Start, GETDATE()) AS ElapsedMilliseconds;

-- 重置表
TRUNCATE TABLE dbo.myTable;

-- 测试方式二:显式插入NULL
DECLARE @Start2 DATETIME = GETDATE();
DECLARE @i2 INT = 0;
WHILE @i2 < 100000
BEGIN
    INSERT INTO dbo.myTable(Id, Name) VALUES (@i2, NULL);
    SET @i2 = @i2 + 1;
END
SELECT '方式二耗时' AS TestCase, DATEDIFF(ms, @Start2, GETDATE()) AS ElapsedMilliseconds;

测试结果

多次执行后,两种方式的耗时差异始终在10ms以内(甚至多次完全相同),这个误差属于测试环境的正常波动,而非两种写法的性能差异。

额外建议

从代码可读性角度来说,如果团队规范要求显式写出所有列,那用方式二更清晰;如果追求简洁,方式一也完全没问题——性能上不需要做任何取舍。

内容的提问来源于stack exchange,提问作者Larry Louisiana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:46:44