文本(blob)比 varchar/nvarchar 的效率低多少?

问题描述 投票:0回答:5

我们正在为一个相当大的项目制作很多大型但简单的表单(大约 600 个用户全天使用它 - 至少对我来说很重要;-))。

表格有很多问答类型的部分,因此很自然地有些人会打一个句子,而另一些人会打一本小说。 对其中一些字段设置字符限制会有多大好处真的

(如有必要/可能,请附上参考文献或引文 - 谢谢!)

sql text varchar
5个回答
5
投票

如果您对数据大小没有限制,那为什么还要担心。即使有 600 个用户和数千条记录,这听起来也不像一个关键任务项目。使用 CLOB/BLOB 就可以了。我怀疑您是否会在限制大小和冒数据丢失风险方面看到任何重大收益。也就是说,您应该在实施之前布局这样的边界。

通常 varchar 最适合存储您希望逻辑使用并执行“整个值”比较的值。文本适用于非结构化数据。如果您的项目是非结构化文本的调查结果,请使用 CLOB/BLOB

半参考:我有时会处理数十万条呼叫中心记录,其中我们使用 CLOB 来存储员工和客户之间的对话。


5
投票

我说,关注用户的需求,只在数据库性能问题出现时才担心这些问题。问问自己“如果我限制用户可以输入的数据量,他们会受益吗”。

我在墙上挂了一幅巨大的卡通片,上面写着“这不是软件所做的,而是用户所做的”。


3
投票

你没有提到你正在使用哪个sql服务器

如果您使用 MySql,使用固定长度字段将表保持在静态模式在速度上有明显的优势,但是如果您有任何可变宽度字段,则表将切换到动态模式,并且您将失去指定字段长度的好处领域。

http://dev.mysql.com/doc/refman/5.0/en/static-format.html
http://dev.mysql.com/doc/refman/5.0/en/dynamic-format.html

当您使用固定长度列时,Microsoft SQL Server 也能获得类似的性能提升。 对于固定长度的列,服务器确切地知道行中数据的偏移量和长度。 对于可变长度列,服务器知道偏移量,但必须将数据的实际长度存储为前面的 2 字节计数器。 这有一些含义,在这篇有趣的文章中进行了讨论,该文章讨论了性能作为磁盘空间的函数以及可变长度列的优点。

如果您使用的是 SQL Server 2005 或更高版本,您可以利用 varchar(max)。 该列类型具有与 BLOB 相同的 2GB 存储容量,但数据与表数据页一起存储在 8K 块中,而不是单独存储。 因此,您可以获得大尺寸优势,一次仅在页面中使用 8K,数据库引擎的快速访问,以及与其他列类型一起使用的相同查询语义与 varchar(max) 一起使用。

最后指定变量列的最大长度主要是为了限制数据库的增长大小。 一旦使用可变长度列,您就失去了固定大小行的优势,并且在保存相同数量的数据时,varchar(max) 的执行效果与 varchar(10) 相同。


2
投票

blob 和 text / ntext 存储在行上下文之外,并且仅存储对对象的引用,从而导致更小的行大小,这将提高聚集索引的性能。

但是,由于text / ntext不与行数据一起存储,检索时间较长,并且这些字段不能在任何比较语句中使用。


1
投票

TEXT 和 BLOB 类型有一些变化会影响大小;他们是:

Type -                      Maximum Length -Storage
TINYBLOB, TINYTEXT          255             Length+1 bytes
BLOB, TEXT                  65535           Length+2 bytes
MEDIUMBLOB, MEDIUMTEXT      16777215        Length+3 bytes
LONGBLOB, LONGTEXT          4294967295      Length+4 bytes
© www.soinside.com 2019 - 2024. All rights reserved.