在sql中,是调用长度(VARCHAR列)O(1)还是O(长度)?
相关:VARCHAR字符串是以长度为前缀的字符串(也称为pascal字符串)存储,还是以空字符串结尾的字符串存储?
我关心的实现是sqlite和postgresql,但可以随意回答其他人。
答案 0 :(得分:2)
根据Postgres documentation:
短字符串(最多126个字节)的存储要求是1个字节 加上实际的字符串,包括案例中的空格填充 性格。较长的字符串有4个字节的开销而不是1个。
这强烈暗示Postgres与许多其他数据库一样,对值使用长度编码。这是第一个字节或四个字节存储字符串的长度。之后将数据存储在数据库页面上。
使用这种存储结构,长度函数的任何合理实现都是O(1)。
答案 1 :(得分:1)
至少在Oracle中,它们不会存储为以null结尾。数据库以存储在数据库中的字符串长度进行响应。
这将使它成为O(1)。
答案 2 :(得分:1)
Postgres和SQLite都在内部存储带有长度前缀的字符串,但该值是为存储而设计的,并以字节来衡量长度。
length
函数返回字符的数量,它可以与任何多字节编码(如UTF-8)中的字节长度不同。所以在实践中,length
很可能必须扫描字符串。
(这在实践中可能无关紧要;如果您有足够的数据,最可能的瓶颈是磁盘I / O.)