我有一个300M行和50列的大事实表。该表格上有多个报告,每个报告仅使用表中50列中的几个。快速全面扫描期间,oracle可以合并位图索引吗?
事实表中的每一列都使用BITMAP INDEX
索引。这个想法是使用这些索引作为原始表的一列版本,假设oracle可以轻松地合并BITMAP INDEX
es。
如果我使用WHERE
语句表中的几列,我可以看到oracle能够有效地合并这些索引。按预期方式执行计划中有BITMAP AND
操作。
如果我在SELECT
语句中使用多列从表中,我可以看到,这取决于列的选择性,甲骨文这些转换要么执行不需要TABLE ACCESS
或BITMAP CONVERSION [to rowids]
,然后HASH JOIN
。
如果加入几个BITMAP INDEX
es,是否有任何方法可以消除HASH JOIN
?是否有任何提示在oracle中强制BITMAP MERGE
列出现在SELECT
声明而不是WHERE
?
直觉好像在HASH JOIN
为BITMAP INDEX
ES是SELECT
声明考虑到不必要的操作是在WHERE
声明确实是不必要的。但我找不到任何证据表明甲骨文可以避免它。
下面是一些例子:
SELECT a, b, c /* 3 BITMAP CONVERSIONs [to rowids] and then 2 unneeded HASH JOINS */
FROM fact;
SELECT a, b, c, d, e /* TABLE ACCESS [full] instead of reading all the data from indexes */
FROM fact;
SELECT a /* BITMAP INDEX [fast full scan] as expected*/
FROM fact
WHERE b = 1 and c = 2; /* BITMAP AND over two BITMAP INDEX [single value] as expected */
是否有任何提示,以优化例子#1和#2?
在生产中我使用oracle11g,但我尝试了类似的查询oracle12c,它看起来像在两个版本的oracle中表现一样。
你能发布完整查询吗?如果您只是从FACT中选择,我不确定通过获取不需要的HASH JOINS意味着什么? – BobC
@BobC,这里不需要完整的查询,因为我可以在较小的示例中说明问题。我有以下查询:'SELECT a,b FROM fact;'。有2个'BITMAP INDEX'用于'a'和'b',并且oracle从这些索引中读取值而不是'fact'表(因为表中有很多其他的列)。然后,我假定oracle应该能够执行'BITMAP MERGE'来匹配'a'中的值和'b'中的值。但是oracle执行'BITMAP CONVERSION [rowid]'然后'HASH JOIN';这对于BITMAP INDEX是无效的。 –