You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Oracle普通视图底层查询中原表Bitmap索引的使用情况及执行逻辑问询

嘿,我来给你拆解下这个Oracle视图查询的底层逻辑和索引使用问题~

一、Oracle对视图查询的底层处理逻辑

当你执行针对普通视图my_brand的查询时,Oracle并不会直接对视图本身做操作——因为普通视图本质就是一个预存储的查询语句,它不保存任何实际数据。Oracle会先执行「视图合并」操作,把你的查询语句和视图的定义合并成一条直接针对原表x的SQL。

举个具体的例子,你写的查询:

select item from my_brand where item='item1'

会被Oracle自动转换成等价的原表查询:

select item_name as item from x where brand='x' and item_name='item1'

之后的执行流程就和直接执行这条原表SQL完全一致了。

二、原表Bitmap索引的使用情况

原表item_name上的Bitmap索引有概率被使用,但最终取决于Oracle基于成本的优化器(CBO)的判断:

  • 合并后的SQL包含两个过滤条件:brand='x'item_name='item1',恰好这两个字段都建有Bitmap索引。CBO会评估这两个索引的「选择性」(符合条件的行数占总表行数的比例)、索引大小、表的数据量等因素,计算不同执行路径的成本。
  • 如果item_name='item1'这个条件的选择性很高(比如符合条件的行数极少),CBO大概率会选择使用item_name的Bitmap索引来快速定位数据;
  • 如果brand='x'的选择性更高,也可能优先使用brand的Bitmap索引,再过滤item_name的条件;
  • 要是两个条件组合起来的选择性极高,CBO甚至会做Bitmap索引的「AND合并操作」,通过两个索引的位图快速交集出符合条件的行位置,再去表中取数据。

需要补充的是,你的视图只是简单的字段重命名和单表过滤,没有聚合、distinct、多表连接等会阻止视图合并的逻辑,所以视图一定会被合并,索引的评估完全基于原表的过滤条件。

内容的提问来源于stack exchange,提问作者Pato

火山引擎 最新活动