在 postgresql 上的下 () 与 ilike

kor*_*rda 5 postgresql orm

我想要做的是检查列的值是否等于某个字符串,但不区分大小写。在ilike不使用通配符(百分比)和lower()? 的情况下使用时是否存在性能差异?

我打算在上创建索引lower(column_name)并使用lower(column_name) = value(值已经是小写的),但结果证明我使用的 ORM 不允许我以lower()漂亮的方式使用(但有方便的方法ilike)。会column_name ilike 'value'使用lower(column_name)索引吗?

Cra*_*ger 4

explain analyze使用测试数据进行测量并查看。

我预计表达式索引 on lower(col)withlower(col) = lower('constant')与 use of之间存在显着差异col ilike 'constant',表达式索引 onlower(col)更快。

这是因为 Pg 可以使用表达式索引执行位图索引扫描,但为此ilike它必须执行 seqscan。AFAIKtext_pattern_ops索引(对 有用LIKE)不会对您有任何好处ILIKE

另一个问题是这种差异是否值得关心,这取决于您的数据和工作负载。有时更明智的做法是选择较慢但更容易的选项并将时间/精力花在其他地方。

column_name ilike 'value' 会使用 lower(column_name) 索引吗?

不会。它也不会使用 上的索引lower(column_name) text_pattern_ops。AFAIK目前无法在 PostgreSQL 中的区分大小写的 text/varchar 上索引不区分大小写的模式匹配 (ILIKE或)。~~*

我不认为类型citext改变这一点,尽管它确实使事情变得更方便。