我有一個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是無效的。 –