是否可以使用 json Include Columns 创建 PostgreSQL 索引?

Rom*_*lle 5 postgresql indexing postgresql-11

我正在使用 PostgreSQL 11.8

CREATE INDEX ix_products_product_sku_with_json_columns
ON products USING btree((product_sku))
INCLUDE ((data->>'variantCode'));
Run Code Online (Sandbox Code Playgroud)

错误:包含的列不支持
表达式 SQL 状态:0A000

文档说:

不支持将表达式作为包含列,因为它们不能在仅索引扫描中使用。

我想data->>'variantCode'这是一个表达,这就是故事的结局?
我可以看到两种解决方法,但其中没有一个对我有吸引力:

  • 在表中创建专用的 VariantCode 常规 SQL 列
  • 作为data->>'variantCode'索引键的一部分

第二个选择有多糟糕?最终目标是在以下查询中
进行仅索引扫描:

SELECT data->>'variantCode', ARRAY_AGG(product_sku)
FROM products
GROUP BY data->>'variantCode'
Run Code Online (Sandbox Code Playgroud)

Lau*_*lbe 6

您不能将其data->>'variantCode'作为INCLUDE列,但将其添加为索引键也无法帮助您获得仅索引扫描。PostgreSQL 不考虑不属于仅索引扫描列的索引键。不存在任何根本问题可以阻止这一点,只是没有实施。

您必须将整体添加data到索引中,但这是不可能的,因为jsonb.

因此,获得仅索引扫描的唯一剩余选项是生成列:

ALTER TABLE products ADD data_varcode text
   GENERATED ALWAYS AS (data->>'variantCode') STORED;
Run Code Online (Sandbox Code Playgroud)

然后您可以在查询和索引中使用该列。