2014-03-01 44 views
1

where子句中的列不具有選擇性。他們都在一張單人桌上。另外,使用的表達式不等於,或,IS NULL,IS NOT NULL。主鍵在客戶ID上。我不確定如何避開這類數據。是否有不同的索引方法可以在表格上創建或以其他方式解決問題。我猜想分區對於將表分成大數據的一個主要部分是沒有幫助的。任何想法或解決方法都會有用。正常索引或位圖索引無用時如何避免

爲了方便理解,我將以下數據作爲參考和示例查詢。

enter image description here

樣本查詢
可樂= '適銷對路' 或是可樂是空
師範大學指數:由於OR和NULL操作被忽略。此外,查詢的數據涵蓋了表格中超過95%的數據。 BITMAP索引:由於數據覆蓋率超過96%而被忽略。

enter image description here

示例查詢
COLB = '7' OR COLB = '6' OR COLB = '5'
NORMAL或BITMAP:兩者不有用由於大的數據選擇。優化器使用主鍵cust_id進行全表掃描。

enter image description here

示例查詢
COLC <> '特別部分' OR COLC爲空(因爲這些值可以改變,沒有特定的值被傳遞)

組合示例查詢
NOT(COLB = '6'或colB ='3')和 (colC <>'SPECIAL SEGMENT'或colC爲空)

回答

3

全表掃描不是邪惡的。索引訪問並不總是更高效。

如果您想要返回表中的大部分數據,您希望使用全表掃描,因爲這是訪問表中大部分數據的最有效方式。當你想訪問表中相對較小的數據時,索引非常棒。但是如果你想要大部分數據,那麼做數百萬次索引訪問就不會更有效率。在你的第一個例子中,你想從一個930萬行的表中返回920萬行。全表掃描是您想要的計劃 - 這是檢索表格中99%行的最有效方法。其他任何事情效率都會降低。我想,你可能會在A上劃分表格,導致兩個大分區的完整分區掃描。然而,這隻會削減1%的工作量,並且可能會對該表的其他查詢產生負面影響。

現在,我總是對想要首先返回表中99%行的查詢有點懷疑。例如,在OLTP系統中進行這樣的查詢是沒有意義的,因爲沒有人會瀏覽920萬行數據。如果目標是複製數據,那麼進行這種查詢是沒有意義的,因爲只是每次複製增量更改而不是整個數據集幾乎肯定會更有效。如果目標是執行一些聚合,那麼讀取幾乎所有的行可能是有意義的。但如果發生這種事情足以關注優化分析,那麼最好查看使用實體化視圖和維度預先彙總數據的方法,以便您可以閱讀並彙總一次數據,然後再閱讀您的運行時預先彙總的值。

如果確實需要讀取所有數據,那麼您可能還需要考慮並行查詢。如果閱讀器相對較少,讓Oracle並行執行全面掃描更有效,這樣您的會話就可以利用更多可用硬件。當然,這意味着您可以減少同時進行的會話,因爲對於其他硬件而言,其他硬件意味着更少的硬件,因此這是您需要了解的折衷。如果您正在構建一個ETL過程,其中只有幾個會話在任何時候加載數據,那麼並行查詢可以提供顯着的性能改進。

+0

謝謝你的迴應賈斯汀。你能指導我如何啓用「並行查詢」在數據庫上運行,或者我可以在其中進一步閱讀? – user3090427