AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 312507
Accepted
Aleksey Vitsko
Aleksey Vitsko
Asked: 2022-05-25 02:58:40 +0800 CST2022-05-25 02:58:40 +0800 CST 2022-05-25 02:58:40 +0800 CST

用于 NULL 值的存储空间

  • 772

根据以下链接,NULL值会占用一些存储空间:

https://stackoverflow.com/questions/3731172/how-much-size-null-value-takes-in-sql-server
https://www.sqlservercentral.com/forums/topic/null-storage-2

如果列具有固定宽度数据类型 -NULL占用列的长度

char(10) NULL takes 10 bytes
INT NULL takes 4 bytes

如果列具有可变宽度 -NULL占用 0 个字节

varchar(1000) NULL takes 0 bytes (+ 2 bytes of varchar column overhead ?)

此外,还有一个可以为空的列的开销。链接中的信息有点矛盾。
任何人都可以对此有所了解吗?

以下是我的问题:

  1. 有人说具有可空列的开销是每行 1 位,有些人说它是每行 1 字节
    哪一个是真的?我假设每行 1 位(所以 8 行占 1 个字节),对吗?

  2. 对于 varchar 中的 NULL 值,每行仍有 2 个字节的开销 - 真的是这样吗?

  3. 最重要的问题:
    我有一个包含约 2.5 亿行数据的表,总大小约为 115 GB
    我使用下面的代码添加了 7 列,在每个命令后使用 sp_spaceused 检查表的大小

添加的列:

alter table MyTable add TestVarchar10 varchar(10) NULL      
alter table MyTable add TestVarchar1000 varchar(1000) NULL  
alter table MyTable add TestVarchar10DefaultTest varchar(10) NULL default 'test'        
alter table MyTable add TestVarchar10DefaultTestWithValues varchar(10) NULL default 'test' with values  

alter table MyTable add TestINT int NULL
alter table MyTable add TestINTDefault99 int NULL default 99
alter table MyTable add TestINTDefault99WithValues int NULL default 99 with values

并且任何其他列,根本没有增加表的大小这
怎么可能?我希望表大小会随着NULL存储占用空间而改变

sql-server sql-server-2017
  • 1 1 个回答
  • 319 Views

1 个回答

  • Voted
  1. Best Answer
    Dan Guzman
    2022-05-25T04:10:34+08:002022-05-25T04:10:34+08:00

    有人说具有可空列的开销是每行 1 位,有些人说它是每行 1 字节哪一个是真的?我假设每行 1 位(所以 8 行占 1 个字节),对吗?

    空位图存储在行级别,因此每行的每 8 列需要 1 个字节。无论该列是否定义为可为空(自 SQL 2000 起),每一行都会产生开销。

    对于 varchar 中的 NULL 值,每行仍有 2 个字节的开销 - 真的是这样吗?

    列偏移量存储为 NULL 可变长度列(最后一个除外),因此可变长度中的 NULL 值可能会根据位置产生 2 字节的开销。

    最重要的问题:我有一个包含约 2.5 亿行数据的表,总大小约为 115 GB 我使用下面的代码添加了 7 列,在每个命令后使用 sp_spaceused 检查表的大小

    这就是有趣的地方。SQL Server 企业版(或开发人员版)包括一些优化,使得某些架构修改只是元数据操作。如果您在 Standard 或 Express 版本上运行相同的测试,空间将增加一倍。

    请参阅Paul Randal 的记录博客文章剖析。虽然旧,但大多数仍然适用于当前的 SQL Server 版本,包括 Azure SQL 数据库。

    • 5

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve