【发布时间】:2014-05-14 13:33:42
【问题描述】:
在sql中,调用length(VARCHAR列)是O(1)还是O(length)?
相关:VARCHAR 字符串是存储为以长度为前缀的字符串(也称为帕斯卡字符串)还是以空字符结尾的字符串?
我关心的实现是 sqlite 和 postgresql,但请随时为其他人回答。
【问题讨论】:
-
这将是一个可能随版本或产品而变化的实现细节。
标签: sql sqlite postgresql
在sql中,调用length(VARCHAR列)是O(1)还是O(length)?
相关:VARCHAR 字符串是存储为以长度为前缀的字符串(也称为帕斯卡字符串)还是以空字符结尾的字符串?
我关心的实现是 sqlite 和 postgresql,但请随时为其他人回答。
【问题讨论】:
标签: sql sqlite postgresql
根据 Postgres documentation:
短字符串(最多 126 个字节)的存储要求为 1 个字节 加上实际的字符串,其中包括案例中的空格填充 性格的。较长的字符串有 4 个字节的开销,而不是 1 个。
这强烈表明 Postgres 与许多其他数据库一样,对值使用长度编码。即第一个字节或四个字节存储字符串的长度。之后数据存储在数据库页面上。
使用这种存储结构,长度函数的任何合理实现都是 O(1)。
【讨论】:
至少在 Oracle 中,它们不存储为空终止。数据库以存储在数据库中的字符串长度进行响应。
这将使它成为 O(1)。
【讨论】:
Postgres 和 SQLite 都在内部存储带有长度前缀的字符串,但该值是为存储而设计的,并以 字节 为单位测量长度。
length 函数返回字符数,它可以不同于任何多字节编码(如 UTF-8)中的字节长度。所以在实践中,length 很可能必须扫描字符串。
(这在实践中可能无关紧要;如果您有足够的数据,最可能的瓶颈是磁盘 I/O。)
【讨论】: