运行系统
每个查询运行 21 次,中间的运行时间用作代表值,如下所示。
EVENT WINNER_TIME RNR_UP_TIME LOSER_TIME ----- -------------------- -------------------- -------------------- 1. DIM = 00:00:06.049 REL = 00:00:09.023 HYB = 00:00:09.644 2. DIM = 00:00:04.186 HYB = 00:00:07.961 REL = 00:00:08.092 3. DIM = 00:00:03.415 HYB = 00:00:04.938 REL = 00:00:05.428 4. DIM = 00:00:00.140 HYB = 00:00:00.190 REL = 00:00:06.990 5. HYB = 00:00:00.131 DIM = 00:00:00.651 REL = 00:00:05.418 6. DIM = 00:00:00.530 HYB = 00:00:01.392 REL = 00:00:05.478 7. DIM = 00:00:00.520 HYB = 00:00:01.572 REL = 00:00:07.9718. DIM = 00:00:00.461 HYB = 00:00:00.731 REL = 00:00:01.882
转换为百分比大小以使数值成为相对值而不是绝对值,并通过定义将最快模式强制为百分之百,则得到如下百分比:
EVENT WINNER_OFFSET RNR_UP_OFFSET LOSER_OFFSET ----- -------------------- -------------------- -------------------- 1. DIM = 100% REL = 149% HYB = 159% 2. DIM = 100% HYB = 190% REL = 193% 3. DIM = 100% HYB = 145% REL = 159% 4. DIM = 100% HYB = 136% REL = 4993% 5. HYB = 100% DIM = 497% REL = 4136% 6. DIM = 100% HYB = 263% REL = 1034% 7. DIM = 100% HYB = 302% REL = 1533% 8. DIM = 100% HYB = 159% REL = 408%
比较关系模式和维度模式
表明维度模式在运行维度查询时的性能优于关系模式是本实验的核心,这也为考虑混合模式的性能提供了基础。从下面的内容可以看出,正如我们所料,维度模式的性能一直优于关系模式。
EVENT WINNER_OFFSET RNR_UP_OFFSET LOSER_OFFSET ----- -------------------- -------------------- -------------------- 1. DIM = 100% REL = 149% 2. DIM = 100% REL = 193% 3. DIM = 100% REL = 159% 4. DIM = 100% REL = 4993% 5. DIM = 497% REL = 4136% 6. DIM = 100% REL = 1034% 7. DIM = 100% REL = 1533% 8. DIM = 100% REL = 408%
在查询 4 中,差值接近 50 倍!查询 4 是最极端的情况,其中唯一的(非时间)限制是对最顶端的表的属性限制。在关系模式中,这意味着层次结构下所有的表必须连接起来,以便得到数值信息,但这是成本很高的操作。在维度模式中,该连接是从一个维度直接到事实表的连接,这是非常高效的操作。
混合模式与维度模式比较
混合模式的性能是否与维度模式一样卓越是这次分析的核心问题。从下面的内容可以看出,混合模式的性能非常好,但是混合方法没有纯维度方法速度快。
EVENT WINNER_OFFSET RNR_UP_OFFSET LOSER_OFFSET ----- -------------------- -------------------- -------------------- 1. DIM = 100% HYB = 159% 2. DIM = 100% HYB = 190% 3. DIM = 100% HYB = 145% 4. DIM = 100% HYB = 136% 5. HYB = 100% DIM = 497% 6. DIM = 100% HYB = 263% 7. DIM = 100% HYB = 302% 8. DIM = 100% HYB = 159%
查询 5 是一个异常情况,但是对于其余所有的查询,混合模式花费的时间是维度模式所用时间的 136% 到 302%。这直接显示出混合模式的性能存在一些局限性,但可以帮助理解为什么需要查询计划分析。查看系统运行过程中捕获的计划可以发现,其中存在三种行为:
- 维度计划与混合计划相同的查询(查询 1、3、4、8)。
- 维度计划与混合计划不同的查询(查询 2、6、7)。
- 查询与混合模式完美吻合(查询 5)。
计划相同。以下是查询 1 的三个计划:
Query #1, relational schema plan:
SELECT STATEMENT (rows=195)
SORT GROUP BY (rows=195)
TABLE ACCESS FULL PREMIUM (rows=1377304)
Query #1, dimensional schema plan:
SELECT STATEMENT (rows=300)
SORT GROUP BY (rows=300)
HASH JOIN (rows=1372568)
TABLE ACCESS FULL TIME_DIM (rows=3600)
TABLE ACCESS FULL PREMIUM_FACT (rows=1372568)
Query #1, hybrid schema plan:
SELECT STATEMENT (rows=300)
SORT GROUP BY (rows=300)
HASH JOIN (rows=1360176)
TABLE ACCESS FULL TIME_DIM (rows=3600)
TABLE ACCESS FULL PREMIUM (rows=1360176)
注意,不出所料,关系计划与维度计划不同。同时请注意,维度计划与混合计划相同。这表明,优化程序能够检测查询的混合模式中维度结构的维度特性,这是我们需要的行为。维度计划和关系计划相同的模式也体现在查询 3、4 和 8 中。
尽管计划相同,由较慢的性能我们可以得出结论:混合模式较慢的原因仅仅在于其大小。如前所述,混合模式可能需要其余任何一种模式的两倍的空间。这就意味着,与维度模式相比,每块的行数少了,对任何给定操作的读取总次数多了,而且动态字节也多了。这些多出来的动态字节很有可能就是性能变慢的原因。
计划不同。现在来看一下查询 7 的三个计划:
Query #7, relational schema plan:
SELECT STATEMENT (rows=6)
SORT GROUP BY (rows=6)
HASH JOIN (rows=77)
TABLE ACCESS FULL COVERAGE (rows=800)
TABLE ACCESS FULL PREMIUM (rows=13773)
Query #7, dimensional schema plan:
SELECT STATEMENT (rows=1)
SORT GROUP BY (rows=1)
HASH JOIN (rows=1)
TABLE ACCESS BY INDEX ROWID COVERAGE_DIM (rows=6)
BITMAP CONVERSION TO ROWIDS (rows=)
BITMAP AND (rows=)
BITMAP INDEX SINGLE VALUE BX_COVERAGE_ACCD_LIMIT (rows=)
BITMAP INDEX SINGLE VALUE BX_COVERAGE_DEDUCTIBLE (rows=)
BITMAP INDEX SINGLE VALUE BX_COVERAGE_PERS_LIMIT (rows=)
TABLE ACCESS BY INDEX ROWID PREMIUM_FACT (rows=48)
BITMAP CONVERSION TO ROWIDS (rows=)
BITMAP AND (rows=)
BITMAP MERGE (rows=)
BITMAP KEY ITERATION (rows=)
TABLE ACCESS FULL TIME_DIM (rows=12)
BITMAP INDEX RANGE SCAN BX_PREMIUM_TIME (rows=)
BITMAP MERGE (rows=)
BITMAP KEY ITERATION (rows=)
TABLE ACCESS BY INDEX ROWID COVERAGE_DIM (rows=6)
BITMAP CONVERSION TO ROWIDS (rows=)
BITMAP AND (rows=)
BITMAP INDEX SINGLE VALUE BX_COVERAGE_ACCD_LIMIT (rows=)
BITMAP INDEX SINGLE VALUE BX_COVERAGE_DEDUCTIBLE (rows=)
BITMAP INDEX SINGLE VALUE BX_COVERAGE_PERS_LIMIT (rows=)
BITMAP INDEX RANGE SCAN BX_PREMIUM_COVERAGE (rows=)
Query #7, hybrid schema plan:
SELECT STATEMENT (rows=1)
TEMP TABLE TRANSFORMATION (rows=)
LOAD AS SELECT SYS_TEMP_0FD9D697C_1278CF0 (rows=)
TABLE ACCESS BY INDEX ROWID COVERAGE (rows=6)
INDEX FULL SCAN UX_COVERAGE_COVERAGE_KEY (rows=6)
SORT GROUP BY (rows=1)
HASH JOIN (rows=1)
TABLE ACCESS FULL SYS_TEMP_0FD9D697C_1278CF0 (rows=6)
TABLE ACCESS BY INDEX ROWID PREMIUM (rows=47)
BITMAP CONVERSION TO ROWIDS (rows=)
BITMAP AND (rows=)
BITMAP MERGE (rows=)
BITMAP KEY ITERATION (rows=)
TABLE ACCESS FULL TIME_DIM (rows=12)
BITMAP INDEX RANGE SCAN BX_PREMIUM_TIME (rows=)
BITMAP MERGE (rows=)
BITMAP KEY ITERATION (rows=)
TABLE ACCESS FULL SYS_TEMP_0FD9D697C_1278CF0 (rows=1)
BITMAP INDEX RANGE SCAN BX_PREMIUM_COVERAGE (rows=)
关系计划与其余两个计划仍然不同,但是这一次,维度计划与混合计划也不同。这显示出了我们不希望出现的优化程序行为,即由于该模式具有所有必需的结构,因此即使维度计划可以存在也不使用维度计划。在混合模式中不生成维度计划的模式也体现在查询 2 和 6 中。
合理的结论是,在优化程序进行维度查询时,关系结构的可用性导致优化程序生成一种计划,而这种计划并没有在模式中只存在维度结构的情况下生成的纯维度查询有效。
值得注意的是,在混合模式下使用维度计划的四种情况其性能都优于在混合模式下使用除纯维度计划之外的其他计划的三种情况。这更加说明了只要可能就使用维度计划的好处。
