我想要做的是检查列的值是否等于某个字符串,但不区分大小写。在ilike不使用通配符(百分比)和lower()? 的情况下使用时是否存在性能差异?
我打算在上创建索引lower(column_name)并使用lower(column_name) = value(值已经是小写的),但结果证明我使用的 ORM 不允许我以lower()漂亮的方式使用(但有方便的方法ilike)。会column_name ilike 'value'使用lower(column_name)索引吗?
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会改变这一点,尽管它确实使事情变得更方便。
| 归档时间: |
|
| 查看次数: |
3885 次 |
| 最近记录: |