缩小VARCHAR列的大小有什么意义吗?


18

到处搜寻有关VARCHAR2Oracle 的列大小是否影响性能的报告似乎不一。

我想VARCHAR稍微谈谈大小问题,并希望对此有所了解:

给定要存储在(Oracle)数据库中的(多行)自由文本字段(不是名称之类的简短内容),在没有达到最大VARCHAR容量(VARCHAR2(4000)在Oracle上)的情况下(在性能或其他方面)有什么意义(选择Oracle)较小的值,例如1024或512,因为无论如何在98%的情况下,这可能就足够了。


Answers:


12

它确实会影响内存使用,特别是当客户端程序必须分配足够的内存来接收数据集时。

请记住,许多应用程序(尤其是Web应用程序)都使用UTF-8(这是一个多字节字符集)。因此,您应该真正考虑字符而不是字节。

如果我期望超过一千个字符,那么我会积极考虑CLOB。我会考虑是否将存储纯文本或某种形式的标记(wiki / html?),以及非欧洲语言的用法。例如,此处的问题和答案将为CLOB,但注释可适合VARCHAR。

如果将VARCHAR最大化,那么六个月后将有人希望再次增大它,并且您将因不使用CLOB而踢自己。


2
对于西方语言,UTF-8通常会对一个字符使用一个字节。在允许多字节“转义”序列表示非西方字符的意义上,它是多字节的。
Eric J.

9

尽管存在一些可能对您很重要的附带问题,但通常没有性能方面的考虑。对于限varchar应该被认为是像任何其他的限制-这是有强制执行业务规则。

IMO,您应该提出的问题是“我是否要防止存储在此字段中的自由文本数据的长度大于n个字节/字符,”-这是在varchar(512)和之间进行选择的唯一决定因素varchar(4000)

请注意,我假设您正在谈论的varchar是SQL类型-情况有所不同,pl/sql并且出于内存分配原因,选择长度可能至关重要


谢谢。就我的经验(非常有限)而言,任何规定“ 500-3999”之间限制的“业务规则”都是随意的,也就是说,有人只是喜欢这个数字。恕我直言,如果我要使用自由文本,并且没有实现的后果(此问题的上下文),那么它要么已用完(4000),要么不是自由文本。---我想在此评论中指出:我认为永远不会有帮助选择btw的业务规则。512和4000(除非是:“尽可能多的字符”)
马丁

如果确实是“尽可能多的字符”,那么正如@gary所说,您应该考虑一个clob,不是吗?
杰克·道格拉斯

4

如果较小的值适用于98%的案例,但是需要Varchar2(4000)才能适用于100%的案例,那么您别无选择,只能使用较大的值。为2%的值创建一个单独的表,然后协调插入/选择等操作会增加复杂性,这会消除不扩展字段所带来的任何内存或性能优势。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.