是否可以创建一个PostgreSQL索引与json包含列?



我正在使用PostgreSQL 11.8

CREATE INDEX ix_products_product_sku_with_json_columns
ON products USING btree((product_sku))
INCLUDE ((data->>'variantCode'));

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

文档说:

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

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

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

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

SELECT data->>'variantCode', ARRAY_AGG(product_sku)
FROM products
GROUP BY data->>'variantCode'

您不能将data->>'variantCode'作为INCLUDE列,但也将其添加为索引键不会帮助您获得仅索引扫描。PostgreSQL不考虑非列的索引键进行仅索引扫描。没有根本的问题阻止这一点,只是没有实现。

您必须将整个data添加到索引中,但这是不可能的,因为jsonb没有b树操作符类。

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

ALTER TABLE products ADD data_varcode text
GENERATED ALWAYS AS (data->>'variantCode') STORED;

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

相关内容

  • 没有找到相关文章

最新更新