我有一个疑问:
select * from table where table.entity = '->...'
运行此查询时,它不会返回任何结果。
select * from table where table.entity like '->...'
确实返回结果。
起初我以为这是由于某些非ascii字符(
entity
是varchar(40)
)所以我做了一个select ascii(substring(#,1))
查询并运行了所有40个字符,但它们按预期工作,没有特殊的隐藏字符。
我能找到的
=
和 like
案例之间的唯一区别是,当我运行解释分析时,like
案例使用 Seq Scan
而不是 Index Scan
。
索引为
CREATE INDEX table_entity ON public.table USING btree (entity NULLS FIRST, primary_key NULLS FIRST)
字符串
'->...'
与数据库前缀相当通用,1043 条记录中有 315 条共享该前缀。我注意到这对于所有以 ->
开头的字符串来说都是一个问题,并且在运行此查询时 select * from table ORDER BY entity NULLS FIRST, primary_key NULLS FIRST
它似乎忽略了 ->
而只关注值,所以它看起来像 "->","Aaron","->Abagail",...
已订购但忽略 ->
编辑: 重新索引解决了原来的问题。但
ORDER BY
的顺序仍然很奇怪。有解释吗?
您遇到数据损坏。
从您搜索的字符串来看,我猜测原因是您升级了操作系统。 C 库(或 ICU 库,如果您使用 ICU 排序规则)的升级可能会导致库提供的排序规则发生更改,并且由于 PostgreSQL 使用这些排序规则,因此可能会损坏字符串表达式上的索引。
重建字符串上的所有索引。
请参阅本文了解更多信息。