在PostgreSQL中,有关citext性能的奇怪问题?

Joh*_*ohn 1 sql postgresql

PostgreSQL手册中,它说它citext只是一个TEXT通过调用实现数据类型的模块LOWER():

citext模块提供不区分大小写的字符串类型citext.从本质上讲,它在比较值时内部调用较低.否则,它的行为几乎与文本完全相同.

另一方面,在文件结束时,它说:

citext不如文本有效,因为运算符函数和B树比较函数必须复制数据并将其转换为小写以进行比较.但是,使用lower来获得不区分大小写的匹配稍微有效一点.

所以我很困惑,如果它使用它LOWER()怎么能"比使用更低的效率略高"?

Nic*_*nes 5

它不会调用SQL函数lower.正如文档所说,它基本上是 内部调用lower.

调用发生在实现citext比较操作的C函数内.而不是实际调用lower,他们直接进入底层str_tolower()例程.您可以在源代码中自己看到这一点,在这种情况下,大多数都相对容易理解.

因此,您或多或少地保存的是每次比较两个SQL函数调用的开销.与比较本身的成本相比,这并不是无关紧要的,但在典型查询中,您可能从未注意到其中任何一项成本.

  • 仅用于完成:在citext列上创建的索引仅包含小写数据.因此指数会小得多.在查询中,citext列上的选择器将转换为小写一次.然后,对于以下所有比较,将使用小写索引.因此,与在查询中使用lower()相比,性能提升将是巨大的.大多数提升来自有效使用索引,这对于lower()查询是不可能的. (2认同)
  • @ Frankenstein:创建一个“UNIQUE INDEX name_idx ON table (LOWER(name))”怎么样,其中“name”是“text”列?它比“citext”列上的索引更快吗? (2认同)