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 / 问题 / 90483
Accepted
richardtallent
richardtallent
Asked: 2015-01-29 15:22:36 +0800 CST2015-01-29 15:22:36 +0800 CST 2015-01-29 15:22:36 +0800 CST

我应该使用 varchar(max) 还是 varchar(4000) SPARSE?

  • 772

我有一个很少使用的“评论”类型的列——在 300 万条记录中大约有 6% 是非空的。平均长度(使用时)为 6 个字符,目前最大约为 3KB。此字段最多 4000 个字符是合理的。我有两个选择:

comments varchar(max) NULL -- this is the current column definition
comments varchar(4000) SPARSE NULL

我目前的理解是,在这两种情况下,一个NULL值都不需要存储——只需要列的位集和行元数据中NULL的长度。0

但是对于非空情况,一个比另一个有明显的优势吗?

带有值的稀疏列的额外 4 字节指针表明它们始终存储在行外text或非常大的varchar(max)字段中。是这样吗?

如果是这样,我倾向于使用varchar(max),因为如果总行长度超过 8KB,它只会在行外存储值,并且我的大多数值都很短,不太可能超过限制。

我还没有看到 BOL 中解决了这种特殊情况,所以我希望这里有人对 MSSQL 的内部有足够的了解,可以提供一些见解。

(如果重要的话,我目前正在使用 2008R2,但希望尽快升级到 2014。)

sql-server varchar
  • 2 2 个回答
  • 5211 Views

2 个回答

  • Voted
  1. Best Answer
    Solomon Rutzky
    2015-01-29T18:20:09+08:002015-01-29T18:20:09+08:00

    使用 时,非 NULL情况没有任何优势,SPARSE事实上,有两个缺点:

    • 每个非 NULL 值额外增加 4 个字节
    • 访问时间稍长

    正如您几乎已经收集到的那样,该SPARSE选项仅对固定长度的数据类型有意义;我想不出将它用于可变长度类型的单一理由。

    我不确定额外的 4 个字节是否意味着它被存储在行外,并且当MAX类型超过 8000 字节时,它们并不完全是行外的,因为行中有 16 字节指针指向该行-行位置。

    坚持VARCHAR(4000), no SPARSE,我什至会考虑制作它NOT NULL DEFAULT('')(空字符串仍然是 0 字节,但现在你不需要弄乱 NULL 指示符,并且评论真的可以是“未知”而不是“无评论”吗“?)。

    • 2
  2. Jun Sato
    2015-08-06T11:17:47+08:002015-08-06T11:17:47+08:00

    我第二 Srutzky。同意。

    现在,让我补充一点与您的决定有很大关系的运营观点。由于您目前使用 varchar(max) 显然对您来说没有问题,但摆脱它在性能和操作能力方面具有一定的优势。

    举个例子,有一个有用的功能叫做 Online Index Rebuild,它是企业版独有的功能。

    请允许我稍微偏离正题;长期使用后,索引变得碎片化,需要重建。但是,通常的构建会导致对基础表的严重锁定,并且在重建索引时,索引不可用,这使得查询在非常大的数据库上死气沉沉。这不仅仅是“嗯……有点慢”,而是“2 秒查询需要 25 分钟!” 一种紧急情况。因此,在 24/7 系统中,这不是一种选择。这就是在线索引重建发挥作用的地方;如果您支付 25,000 美元左右获得使用企业版特权的核心许可,您可以在 24/7 系统上神奇地重建索引,而不会影响用户。

    除非,如果某些开发人员投入 varchar(max) 它将无法工作。然而,它很乐意在 varchar(4000) 上。如果数据包含超过 8000 个字符,您将卡在 varchar(max) 中,无法进行在线重建,这将是上级肯定会注意到的操作问题。

    ..这只是一个例子。因此,我的建议是与您组织中的生产 DBA 交谈,并询问他们喜欢和不喜欢什么。由于您当前正在运行 varchar(max) 我认为这不是问题,但您可以通过删除它来应对未来的挑战。虽然,如果表用于不经常访问的存储而无需在线索引重建,那么使用 varchar(max) 会非常好。这是只有您的生产 DBA 才能进行的调用。

    如果您在没有专门 DBA 的较小商店,请提供有关表的使用和操作要求的更多详细信息(是否 24/7 有五个九的要求?是否集群?您的服务窗口多长时间?当前版本和未来的版本更改计划?),社区可以为您提供更好的建议。我可能会询问太多信息,但这是有经验的 DBA 依靠的那种细节来做出正确的决定。

    • 2

相关问题

  • 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