我有一个包含 300M 行和 50 列的大型事实表。此表上有多个报告,每个报告仅使用表中 50 列中的几列。
事实表中的每一列都用 索引BITMAP INDEX
。这个想法是将这些索引用作原始表的单列版本,假设 oracle 可以BITMAP INDEX
轻松合并 es。
如果我在语句中使用表中的几列WHERE
,我可以看到 oracle 能够有效地合并这些索引。执行计划中有BITMAP AND
预期的操作。
如果我在语句中使用表中的几列SELECT
,我可以看到根据列的选择性,oracle 要么执行不需要的转换,TABLE ACCESS
要么执行这些转换。BITMAP CONVERSION [to rowids]
HASH JOIN
有什么办法可以消除HASH JOIN
在加入几个BITMAP INDEX
es的情况下?BITMAP MERGE
当列出现在SELECT
语句中而不是语句中时,oracle 中是否有强制提示WHERE
?
HASH JOIN
直观上看, for BITMAP INDEX
es似乎是语句中不需要的操作,SELECT
考虑到它确实在WHERE
语句中是不需要的。但我找不到任何证据表明 oracle 可以避免它。
这里有些例子:
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 中都表现相同。