首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【YashanDB 知识库】使用 select * 创建的物化视图无法进行查询重写

【YashanDB 知识库】使用 select * 创建的物化视图无法进行查询重写

作者头像
用户10349277
发布2025-02-21 11:18:49
发布2025-02-21 11:18:49
49300
代码可运行
举报
运行总次数:0
代码可运行

问题现象

使用如下语句准备测试数据:

代码语言:javascript
代码运行次数:0
运行
复制
alter system set query_rewrite_enabled=force scope=both;
drop table test;
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;
drop materialized view mv_1;
create materialized view mv_1
as
select * from test where tid = 66;
alter materialized view mv_1 enable query rewrite;

使用 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 的物化视图查询重写功能还是比较弱,急需改进。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题现象
  • 问题的风险及影响
  • 问题影响的版本
  • 问题发生原因
  • 解决方法及规避方式
  • 问题分析和处理过程
  • 经验总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档