【YashanDB 知识库】使用 select * 创建的物化视图无法进行查询重写
问题现象
使用如下语句准备测试数据:
复制代码
使用 select * from test where tid = 66 以及 select tid,tname from test where tid = 66,均无法进行查询重写:
使用带双引号的大写字段名才可以进行查询重写:
问题的风险及影响
物化视图无法进行查询重写,影响查询性能
问题影响的版本
所有 yashandb 版本
问题发生原因
目前 yashandb 在进行物化视图的查询重写时,使用的是 select 中的列名匹配,未根据查询的语义进行匹配
解决方法及规避方式
在 select 中使用带双引号的大写列名
问题分析和处理过程
在存储物化视图时,create 物化视图如果下发的是 select *,那么 yashandb 会将 select *展开,存储为列名
在 matchCompactedSQLText 中,使用的是列名进行匹配。
1、如果后面想进行查询重写的语句是 select *,目前的实现是在 select *展开以前进行列的匹配,很明显,与 dba_mviews 中存储的 select "TID","TNAME"是匹配不上的
2、如果后面想进行查询重写的语句是 select tid,tname,因为大小写匹配不上
3、如果后面想进行查询重写的语句是 select TID,TNAME,因为没有用双引号包含,依然匹配不上
以上三种情况均无法进行查询重写
经验总结
目前 yashandb 的物化视图查询重写功能还是比较弱,急需改进。
评论