elb*_*laf 16 database-design sql-server varchar
我正在与其他人一起创建 SQL Server 数据库。其中一个表很小(6 行),其中的数据可能会保持不变。添加新行的可能性很小。该表看起来像这样:
CREATE TABLE someTable (
id int primary key identity(1,1) not null,
name varchar(128) not null unique
);
INSERT INTO someTable values ('alice', 'bob something', 'charles can dance', 'dugan was here');
Run Code Online (Sandbox Code Playgroud)
我正在查看该name
列的字符长度,我认为它的值可能永远不会大于 32 个字符,甚至可能不会大于 24。我将此列更改为,有什么好处,例如,varchar(32)
?
另外,将默认列大小保持为 4、8、32 等的倍数有什么好处吗?
Han*_*non 15
SQL Server 在为查询处理分配内存时使用列长度。所以,是的,简而言之,您应该始终为数据适当调整列大小。
内存分配基于查询返回的行数乘以列声明长度的一半。
话虽如此,在这种情况下,您有 6 行,您可能不想过早地过度优化。除非您将此表加入到另一个包含数百万行的表,否则 varchar(24) 和 varchar(32) 甚至 varchar(128) 之间不会有很大差异。
您的第二个问题询问关于在二进制倍数上对齐列长度。这根本不是必需的,因为 SQL Server 将所有数据存储在 8KB 页面中,而不管每列的长度如何。
Aar*_*and 14
有 6 行,不,不会有明显的好处。整个表格将适合单个页面,因此降低您将在该页面上使用的最大潜在空间同时仍占据整个页面在所有实际意义上确实没有什么不同。
然而,在较大的桌子上,大小合适是至关重要的。原因是内存估计将基于每个值将填充 50% 的假设。因此,如果您有 varchar(128),则无论实际数据如何,每个值都将占用 64 个字节,因此内存授予将为 64b * 行数。如果所有值都是 32 个字符或更少,则将其设为 varchar(64) 甚至 varchar(32) 可能是更好的选择。如果很大一部分值接近或处于上限,您甚至可以要求 char 消除波动性。
至于将字符串长度限制在 2 的幂的好处,我认为在今天的硬件上,没有人能证明任何明显的优势。
归档时间: |
|
查看次数: |
2144 次 |
最近记录: |