首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-04-23 21:41
  • 4537
  • 6777
juejin.cn

在使用 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)等价分析;

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

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

七、总结

注:本文转载自juejin.cn的数据库砖家的文章"https://juejin.cn/post/7496335321782353930"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

133
开发工具
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top