写点什么

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

作者:YashanDB
  • 2024-07-30
    广东
  • 本文字数:676 字

    阅读完需:约 2 分钟

问题现象

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


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

用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
【YashanDB知识库】使用select * 创建的物化视图无法进行查询重写_yashandb_YashanDB_InfoQ写作社区