在设计表格时,我应该使用varchar(255)还是varchar(256)?我听说一个字节用于列的长度,或者用来存储元数据。
在这一点上还重要吗?
我在互联网上看到了一些帖子,但它们适用于甲骨文和MySQL。
我们有MicrosoftSQLServer2016EnterpriseEdition,它如何应用于这个环境?
例如,如果我告诉我的客户端保留255个字符的文本描述,而不是256个字符,这有什么区别吗?我所读到的“最大长度为255个字符,DBMS可以选择使用一个字节来表示字段中数据的长度,如果限制为256或更大,则需要两个字节。”这是真的吗?
发布于 2017-08-11 18:39:01
其他人已经指出,存储长度所需的字节数是固定的。我想在你的问题中把重点放在这部分:
在这一点上还重要吗?
您的问题有企业版标记,这通常意味着您将拥有相当数量的数据。通常,每行一个字节的差异在实践中并不重要。例如,具有完全填充的VARCHAR(255)列的下表占用磁盘上143176 KB的空间:
DROP TABLE IF EXISTS dbo.V255_FULL;
CREATE TABLE dbo.V255_FULL (
ID1 BIGINT NOT NULL,
ID2 BIGINT NOT NULL,
V255 VARCHAR(255)
);
INSERT INTO dbo.V255_FULL WITH (TABLOCK)
SELECT TOP (500000) 0, 0, REPLICATE('A', 255)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
EXEC sp_spaceused 'V255_FULL';结果:
╔═══════════╦══════════════════════╦═══════════╦═══════════╦════════════╦════════╗
║ name ║ rows ║ reserved ║ data ║ index_size ║ unused ║
╠═══════════╬══════════════════════╬═══════════╬═══════════╬════════════╬════════╣
║ V255_FULL ║ 500000 ║ 143176 KB ║ 142888 KB ║ 8 KB ║ 280 KB ║
╚═══════════╩══════════════════════╩═══════════╩═══════════╩════════════╩════════╝让我们使用一个完全填充的VARCHAR(256)列创建第二个表。每行至少需要一个字节,对吧?
DROP TABLE IF EXISTS dbo.V256_FULL;
CREATE TABLE dbo.V256_FULL (
ID1 BIGINT NOT NULL,
ID2 BIGINT NOT NULL,
V256 VARCHAR(256)
);
INSERT INTO dbo.V256_FULL WITH (TABLOCK)
SELECT TOP (500000) 0, 0, REPLICATE('A', 256)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
EXEC sp_spaceused 'V256_FULL';结果:
╔═══════════╦══════════════════════╦═══════════╦═══════════╦════════════╦════════╗
║ name ║ rows ║ reserved ║ data ║ index_size ║ unused ║
╠═══════════╬══════════════════════╬═══════════╬═══════════╬════════════╬════════╣
║ V256_FULL ║ 500000 ║ 143176 KB ║ 142888 KB ║ 8 KB ║ 280 KB ║
╚═══════════╩══════════════════════╩═══════════╩═══════════╩════════════╩════════╝只是碰巧这两个表占用了相同的空间。每个8k页上的行数相同。您想花时间优化您的应用程序是很好的,但是我怀疑您最好关注不同的领域。
https://dba.stackexchange.com/questions/183275
复制相似问题