PostgreSQL非物化视图中拼接列能否利用索引?
非物化视图中拼接已索引列能否利用索引?
可以实现,但不能直接使用你创建的(col_1, col_2)复合索引,需要针对列拼接的表达式创建表达式索引。
问题原因
你创建的idx_data_col_1_col2是复合列索引,存储的是col_1和col_2各自的原始值。而视图查询的条件是key = 'Mick-Ana',等价于col_1 || '-' || col_2 = 'Mick-Ana'——这种表达式计算后的匹配逻辑,无法直接匹配复合索引的存储结构,因此优化器只能选择全表扫描。
解决方案:创建表达式索引
针对拼接后的表达式创建索引,让索引直接存储计算后的结果,就能匹配视图的查询条件:
create index idx_data_key ON data ((col_1 || '-' || col_2));
关于小数据量未触发索引的说明
你更新中提到创建索引后仍走全表扫描,是因为数据量过小:PostgreSQL的查询优化器会自动评估执行成本,当表中只有3条数据时,全表扫描的开销(直接读取所有数据)远低于走索引的开销(先查索引再定位数据块),因此优化器会选择全表扫描。
当表中数据量增大到一定规模(比如数万条以上),优化器会判断走索引的成本更低,此时就会自动使用idx_data_key索引执行扫描。
内容的提问来源于stack exchange,提问作者VeryNiceArgumentException
相关产品推荐
相关产品推荐

