在sql中,长度函数是O(1)还是O(长度)

时间:2014-05-14 13:33:43

标签: sql sqlite postgresql

在sql中,是调用长度(VARCHAR列)O(1)还是O(长度)?

相关:VARCHAR字符串是以长度为前缀的字符串(也称为pascal字符串)存储,还是以空字符串结尾的字符串存储?

我关心的实现是sqlite和postgresql,但可以随意回答其他人。

3 个答案:

答案 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.)