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'这是一个表达,这就是故事的结局?
我可以看到两种解决方法,但其中没有一个对我有吸引力:
data->>'variantCode'索引键的一部分第二个选择有多糟糕?最终目标是在以下查询中
进行仅索引扫描:
SELECT data->>'variantCode', ARRAY_AGG(product_sku)
FROM products
GROUP BY data->>'variantCode'
Run Code Online (Sandbox Code Playgroud)
您不能将其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)
然后您可以在查询和索引中使用该列。
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |