SQL 索引扫描未找到顺序扫描找到的值

问题描述 投票:0回答:1

我有一个疑问:

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
的顺序仍然很奇怪。有解释吗?

postgresql indexing
1个回答
0
投票

您遇到数据损坏。

从您搜索的字符串来看,我猜测原因是您升级了操作系统。 C 库(或 ICU 库,如果您使用 ICU 排序规则)的升级可能会导致库提供的排序规则发生更改,并且由于 PostgreSQL 使用这些排序规则,因此可能会损坏字符串表达式上的索引。

重建字符串上的所有索引。

请参阅本文了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.