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

时间:2015-06-30 08:46:38

标签: sql postgresql

PostgreSQL manual中,它表示citext只是一个通过调用TEXT来实现LOWER()数据类型的模块:

  

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

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

  

citext不如文本有效,因为运算符功能和   B树比较函数必须复制数据和   将其转换为小写进行比较。然而,它略有不同   比使用lower来获得不区分大小写的匹配更有效。

所以我很困惑,如果它使用LOWER()怎么可能"比使用更低的&#34更有效?

1 个答案:

答案 0 :(得分:5)

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

调用发生在实现citext比较操作的C函数中。而不是实际调用lower,而是直接进入基础str_tolower()例程。你可以在source code中看到这个,在这种情况下大多数都相对容易理解。

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