【问题标题】:In sql, is the length function O(1) or O(length)在sql中,长度函数是O(1)还是O(length)
【发布时间】:2014-05-14 13:33:42
【问题描述】:

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

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

我关心的实现是 sqlite 和 postgresql,但请随时为其他人回答。

【问题讨论】:

  • 这将是一个可能随版本或产品而变化的实现细节。

标签: sql sqlite postgresql


【解决方案1】:

根据 Postgres documentation:

短字符串(最多 126 个字节)的存储要求为 1 个字节 加上实际的字符串,其中包括案例中的空格填充 性格的。较长的字符串有 4 个字节的开销,而不是 1 个。

这强烈表明 Postgres 与许多其他数据库一样,对值使用长度编码。即第一个字节或四个字节存储字符串的长度。之后数据存储在数据库页面上。

使用这种存储结构,长度函数的任何合理实现都是 O(1)。

【讨论】:

  • 另见TOAST,它可能存储特别长的压缩字符串和/或主“页面”之外,重用这个长度标记来指示该字符串上使用的技术。跨度>
  • @IMSoP 。 . .谢谢你的参考。有趣的是,即使在 TOAST 的情况下,长度也是总基准大小,所以长度仍然是 O(1)。
【解决方案2】:

至少在 Oracle 中,它们不存储为空终止。数据库以存储在数据库中的字符串长度进行响应。

这将使它成为 O(1)。

【讨论】:

    【解决方案3】:

    Postgres 和 SQLite 都在内部存储带有长度前缀的字符串,但该值是为存储而设计的,并以 字节 为单位测量长度。

    length 函数返回字符数,它可以不同于任何多字节编码(如 UTF-8)中的字节长度。所以在实践中,length 很可能必须扫描字符串。

    (这在实践中可能无关紧要;如果您有足够的数据,最可能的瓶颈是磁盘 I/O。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-23
      • 2016-04-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多