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

时间:2008-10-28 13:18:31

标签: sql text varchar

我们为一个相当大的项目做了很多大而简单的表格(大约有600名用户全天使用它 - 至少对我来说很重要;-))。

这些表格有很多问题/答案类型的部分,因此某些人输入句子很自然,而其他人则输入一本小说。 中的某些字段设置字符限制有多大益处?

(请提供参考或引用,如有必要/可能 - 谢谢!)

5 个答案:

答案 0 :(得分:5)

如果您对数据大小没有限制,那么为什么要担心。这听起来不像一个关键任务项目,即使有600个用户和几千条记录。使用CLOB / BLOB并完成它。我怀疑你是否会在限制尺寸和冒数据丢失的风险方面看到任何重大进展。也就是说,你应该在实现之前布置这样的边界。

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

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

答案 1 :(得分:3)

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

我在墙上留下了一个很大的空洞的卡通片,上面写着“它不是软件所做的。它是用户所做的”。

答案 2 :(得分: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字节计数器。这有一些含义在本interesting article中讨论,它讨论了作为磁盘空间函数的性能和可变长度列的优点。

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

最后,在变量列上指定最大长度主要是为了约束数据库的增长大小。一旦使用可变长度列,就会失去固定大小行的优势,而varchar(max)在保存相同数量的数据时将执行与varchar(10)相同的操作。

答案 3 :(得分:2)

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

但是因为text / ntext没有与行数据一起存储,所以后退需要更长时间,并且这些字段不能用于任何比较语句。

答案 4 :(得分:0)

来自:http://www.making-the-web.com/2008/03/24/saving-bytes-efficient-data-storage-mysql-part-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