我正在使用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;
然后你可以在查询和索引中使用该列。