YashanDB|使用 select * 创建物化视图无法触发查询重写?问题出在这儿!

在使用 YashanDB 的物化视图功能进行查询优化时,有用户遇到如下困惑:

"我明明启用了查询重写,为什么语句还是没有命中物化视图?"

经过实际验证,问题出在一个细节------使用了 select * 创建物化视图。本文将带你分析问题原因,并给出规避建议。

一、问题现象

使用如下语句创建基础表与物化视图:

sql 复制代码
alter system set query_rewrite_enabled = force scope=both;
create table test(tid number, tname varchar2(30));
begin
for i in 1..100000 loop
insert into test values(i, i || 'abcd');
end loop;
end;
/
commit;
create materialized view mv_1 as
select * from test where tid = 66;
alter materialized view mv_1 enable query rewrite;

之后执行以下查询:

csharp 复制代码
select * from test where tid = 66;
select tid, tname from test where tid = 66;

均未触发查询重写!

但当我们使用带双引号的大写列名查询时:

csharp 复制代码
select "TID", "TNAME" from test where tid = 66;

查询重写成功命中物化视图。

二、问题风险与影响

重写未命中 → 查询无法利用预聚合视图 → 性能大打折扣;

用户难以定位问题原因,误以为功能不可用;

查询优化效果严重依赖于使用者写 SQL 的"方式"。

三、问题根因剖析

目前 YashanDB 的物化视图重写机制,是通过文本列名匹配来判断是否可以重写的,而不是基于语义或查询逻辑。

具体机制:

使用 select * 创建物化视图时,系统会将其展开为:

csharp 复制代码
select "TID", "TNAME" ...

但当查询语句写为:

csharp 复制代码
select tid, tname from test ...

或者

csharp 复制代码
select * from test ...

则匹配机制无法识别为等价表达,重写失败。

哪怕是写成:

csharp 复制代码
select TID, TNAME ...

由于未加双引号,也不会与 "TID", "TNAME" 匹配成功。

四、影响版本

目前所有 YashanDB 版本均存在该问题。

五、规避建议与解决方法

建议一:创建物化视图时避免使用select *

改为显式列名 + 大写 + 加双引号,例如:

sql 复制代码
create materialized view mv_1 as
select "TID", "TNAME" from test where tid = 66;

建议二:查询时也保持格式一致

查询时尽量写为:

csharp 复制代码
select "TID", "TNAME" from test where tid = 66;

这样最容易命中已存在的物化视图。

建议三:统一命名规范

在数据库设计与开发中统一约定使用大写列名,并强制加双引号,是当前阶段下提升查询重写命中率的有效手段。

六、改进建议

当前 YashanDB 的物化视图重写功能仍处于初级阶段,建议未来版本从"语义等价"角度进行匹配,而不是依赖列名文本比较。

比如参考 Oracle 的方式,可通过:

查询逻辑结构比对;

抽象语法树(AST)等价分析;

聚合字段、表达式规范化识别;

提升查询重写的智能化水平。

七、总结

相关推荐
ClickHouseDB2 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906942 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
时间售卖铺3 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw3 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社4 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
lbb 小魔仙5 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
captain3766 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02146 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川6 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组6 小时前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制