Dan*_*dio 55 postgresql performance datatypes varchar
根据PostgreSQL 的文档,VARCHAR
,VARCHAR(n)
和之间没有性能差异TEXT
。
我应该为名称或地址列添加任意长度限制吗?
编辑:不是欺骗:
我知道这种CHAR
类型是过去的遗物,我不仅对性能感兴趣,而且对其他优缺点感兴趣,例如 Erwin 在他惊人的回答中所述。
Erw*_*ter 78
答案是否定的。
varchar
如果不需要,请不要添加长度修饰符。(大多数情况下,您不需要。)仅text
用于所有字符数据。作出这样的varchar
(标准SQL类型),而长度修改,如果你需要留与不具备RDBMS兼容text
的通用字符串类型。
性能几乎是一样的,text
是在罕见的情况下,快一点,你保存周期对长度的检查。有关的:
如果您确实需要强制执行最大长度,这varchar(n)
是一个有效的选择,但我仍然会考虑text
使用以下CHECK
约束:
ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 51);
Run Code Online (Sandbox Code Playgroud)
您可以随时修改或删除此类约束,而不必弄乱表定义和依赖对象(视图、函数、外键等)。并且您可以在(相同)约束中强制执行其他要求。
PostgreSQL 9.1 引入了一个新特性来缓解一些痛苦。发行说明:
允许
ALTER TABLE ... SET DATA TYPE
在适当的情况下避免表重写(Noah Misch,Robert Haas)例如,将
varchar
列转换为文本不再需要重写表。但是,增加varchar
列的长度约束 仍然需要重写表。
更多问题varchar(n)
已在以后的版本中修复。
a_h*_*ame 13
如果您将长度限制视为一种检查约束以确保您验证数据,那么是添加一个。事实上,你可能想不使用长度定义,而是一个真正的检查约束代替,使改变的极限速度。
要更改(增加)长度限制,您需要运行一个ALTER TABLE
可能需要很长时间才能完成(由于可能会重写表),在此期间需要排他表锁。
更改(即删除和重新创建)检查约束是一个非常简短的操作,只需要读取表的数据,不会更改任何行。所以这会快很多(这反过来意味着排他表锁的持有时间要短得多)。
在操作期间,a text
、avarchar
或varchar(5000)
列之间没有任何区别。
归档时间: |
|
查看次数: |
46651 次 |
最近记录: |