目录
- 一、星型查询转换原理
- 二、配置星型查询转换
- 三、性能考虑
- 四、案例
-
- 1、数据模型
- 2、创建表和数据
- 3、创建位图索引
- 4、查询优化前
- 5、查询优化后
- 6、检查执行计划
Oracle的星型查询转换(Star Query Transformation)是Oracle数据库优化器的一个重要特性,专门用于优化针对星型模式(Star Schema)数据模型的查询性能。星型模式通常应用于数据仓库中,它由一个大的事实表(Fact Table)和一组小的维度表(Dimension Tables)组成,这样的结构类似于一个星型。
一、星型查询转换原理
星型查询转换的核心思想是将原本的星型连接查询重写成更高效的形式。在原始查询中,事实表与维度表通过多个连接(JOINs)关联起来,这可能涉及大量的I/O操作和CPU计算,尤其是在维度表上应用过滤条件时。星型查询转换通过以下步骤优化查询:
- 子查询转换:将针对维度表的过滤条件转化为对事实表的子查询,这样可以避免直接连接到维度表,减少I/O和CPU消耗。
- 位图索引使用:在事实表的外键列上创建位图索引(Bitmap Indexes)。位图索引非常适合存储和检索少量的值,它们在处理大量行但少量唯一值的列时特别有效。
- 隐式重写SQL语句:优化器在执行查询时会自动识别是否可以应用星型转换,并对SQL语句进行隐式的重写,以利用位图索引和子查询转换。
二、配置星型查询转换
为了启用星型查询转换,需要设置以下参数:
STAR_TRANSFORMATION_ENABLED
:此初始化参数控制是否允许优化器使用星型转换。默认情况下,这个参数可能是关闭的(FALSE),需要显式设置为TRUE。
假设我们有一个星型模式的数据模型,其中包含一个事实表sales
和三个维度表customers
、products
、dates
。事实表sales
有外键指向这三个维度表。
- 原始查询
SELECT c.customer_name, p.product_name, d.date_name, s.amount
FROM sales s
JOIN customers c ON s.customer_id = c.customer_id
JOIN products p ON s.product_id = p.product_id
JOIN dates d ON s.date_id = d.date_id
WHERE c.customer_name = 'John Doe' AND p.product_name = 'Widget';
- 经过星型查询转换后的查询
SELECT c.customer_name, p.product_name, d.date_name, s.amount
FROM (
SELECT *
FROM sales
WHERE sales.custom