sql - varchar(500) 比 varchar(8000) 有优势吗?

标签 sql sql-server tsql

我已经在 MSDN 论坛和此处阅读了此内容,但仍然不清楚。我认为这是正确的: Varchar(max) 将存储为文本数据类型,因此有缺点。假设您的字段可靠地少于 8000 个字符。就像我的数据库表中的 BusinessName 字段一样。事实上,企业名称可能总是在 500 个字符以下(从我的帽子里掏出一个数字)。我遇到的许多 varchar 字段似乎都远远低于 8k 字符数。

那么我应该将该字段设为 varchar(500) 而不是 varchar(8000) 吗?根据我对 SQL 的理解,这两者之间没有区别。因此,为了让生活变得简单,我想将所有 varchar 字段定义为 varchar(8000)。这有什么缺点吗?

相关:Size of varchar columns (我觉得这个人没有回答我的问题)。

最佳答案

这可以产生影响的一个例子是,它可以防止性能优化,避免将行版本控制信息添加到具有后触发器的表中。

This is covered by Paul White here

The actual size of the data stored is immaterial – it is the potential size that matters.

类似地,如果自 2016 年以来使用内存优化表,则可以使用 LOB 列或列宽组合,这些列或列宽组合可能会超出行内限制,但会带来损失。

(Max) columns are always stored off-row. For other columns, if the data row size in the table definition can exceed 8,060 bytes, SQL Server pushes largest variable-length column(s) off-row. Again, it does not depend on amount of the data you store there.

This can have a large negative effect on memory consumption and performance

过度声明列宽会产生很大影响的另一种情况是,表是否将使用 SSIS 进行处理。为可变长度(非 BLOB)列分配的内存对于执行树中的每一行都是固定的,并且是根据列声明的最大长度确定的,这可能导致内存缓冲区使用效率低下 (example) 。虽然 SSIS 包开发人员可以声明比源更小的列大小,但最好预先完成此分析并在那里强制执行。

回到 SQL Server 引擎本身,一个类似的情况是,在计算为 SORT 操作分配的内存授予时,SQL Server 假定 varchar(x) 列将打开平均消耗 x/2 字节。

如果您的大多数 varchar 列都比该值更满,则可能会导致 sort 操作溢出到 tempdb

在您的情况下,如果您的 varchar 列被声明为 8000 字节,但实际上内容远少于您的查询将分配的内存,它不需要哪个显然效率低下,并且可能导致等待内存授予。

这在 SQL 研讨会网络广播 1 downloadable from here 第 2 部分中有介绍。或见下文。

use tempdb;

CREATE TABLE T(
id INT IDENTITY(1,1) PRIMARY KEY,
number int,
name8000 VARCHAR(8000),
name500 VARCHAR(500))

INSERT INTO  T 
(number,name8000,name500)
SELECT number, name, name /*<--Same contents in both cols*/
FROM master..spt_values

SELECT id,name500
FROM T
ORDER BY number

Screenshot

SELECT id,name8000
FROM T
ORDER BY number

Screenshot

关于sql - varchar(500) 比 varchar(8000) 有优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2009694/

相关文章:

mysql - 向查询添加 COUNT 会导致查询卡住

php - 教义 : Multiple orWhere with LIKE condition

.net - 立即重新连接时出现 SQL 异常

SQL Server查询麻烦,多对多关系

sql - T-SQL 通过入站变量拉取特定月份的数据

php - 控制mysql第一条记录

php - Laravel PHP向数据库插入数据时出现无效字符串问题

c# - 如何在 Entity Framework 投影中有效地获取远距离关系

sql - 基于Count使用IF ELSE语句执行不同的Insert语句

sql - 将列默认值绑定(bind)到 SQL 2005 中的函数