首页 > 解决方案 > Postgres 索引创建 - 索引字段名称上的单引号

问题描述

使用 Postgres 10.11。

表架构:

create table "db"."table"
(
    id varchar(4096) not null
        constraint "db-table_pkey"
            primary key,
    etag varchar(255) not null,
    jsondata jsonb not null
);

我们发现不小心创建了这样的索引:

create index "something"
    on "db"."table" (('id'::text), 
                     (jsondata -> 'someOtherField'::text), 
                     ((jsondata -> 'someOtherField2'::text) = 'false'::jsonb));

而且这个查询不会使用上面的索引:

select *
FROM "db"."table" 
where jsonData->'someOtherField' = '"value"'
  AND jsonData->'someOtherField2' = 'false'
  AND id = 'testid'
order by id 
limit 5

像这样重新制作索引解决了这个问题:

create index "something"
    on "db"."table" ((id), -- JUST ID!!!
                     (jsondata -> 'someOtherField'::text), 
                     ((jsondata -> 'someOtherField2'::text) = 'false'::jsonb));

似乎我们不应该在索引列名称上使用单引号。谁能告诉我第一部分的索引是什么?它只是在“id”字符串常量上制作的吗?我什至可以用任何查询触发该索引吗?还是它们是相同的索引?

标签: sqlpostgresql

解决方案


似乎我们不应该在索引列名称上使用单引号。

你的直觉是对的。

'id'是一个字符串常量,所以如果你索引它,所有索引条目都将具有相同的常量值。这样的索引是非常没用的(尽管有常量索引的部分或唯一索引的用例)。

要引用列,您必须使用 unquotedid或 double quotes "id"

该文档对此有一整章。


推荐阅读