Oracle 12c In-Memory Option - 7

tolywang發表於2014-02-14

13. storage index

習慣上,在一個表上查詢時全表掃描是最沒有效率的執行計劃,但是儲存在In-Memory Column Store
中的 tables 打破了這個老套的說法。

-- In-Memory Column Store 型別查詢:
SET TIMING ON
SELECT lo_orderkey, lo_custkey, lo_revenue
FROM lineorder
WHERE lo_orderkey = 5000000;

-- 在buffer cache中的查詢:
ALTER SESSION set inmemory_query = disable;

SELECT /* BUFFER CACHE */
lo_orderkey, lo_custkey, lo_revenue
FROM lineorder WHERE lo_orderkey = 5000000;

ALTER SESSION set inmemory_query = enable;

可以發現,In-Memory Column Store查詢明顯比buffer cache查詢快。

In-Memory Column Store在每個column上訪問storage index, storage index將column
值做 min/max pruning ,where子句謂詞對比相應列在每個 in-memory segment 中的
min/max 範圍,如果這個值沒有落在指定的範圍,那麼這個in-memory segment直接跳過,
不用再掃描 。

你能透過檢視三個IMC session statistics看出來min/max pruning的發生。

SELECT display_name, value
FROM v$mystat m, v$statname n
WHERE m.statistic# = n.statistic#  AND  display_name IN
( 'IMC Preds all rows pass minmax',
  'IMC Preds some rows pass minmax',
  'IMC Preds no rows pass minmax' );

然後再次執行我們的查詢 :
SELECT lo_orderkey, lo_custkey, lo_revenue FROM lineorder WHERE lo_orderkey = 5000000;

再次檢查session statistics :
SELECT display_name, value
FROM v$mystat m, v$statname n
WHERE m.statistic# = n.statistic#  AND  display_name IN
( 'IMC Preds all rows pass minmax',
  'IMC Preds some rows pass minmax',
  'IMC Preds no rows pass minmax' );

從得出的結果可以看出min/max pruning的高效,statistics顯示大量的segments被跳過,因為
沒有行在這些segment 的min/max範圍 (no rows pass minmax),這意味著不會掃描這些segments,
我們的值僅僅落在少量segments上(some rows pass minmax)。

這時你可能會想,如果在where後的列上加一個簡單的索引,將可能會帶來和In-Memory column store
訪問一樣的效率。我們可以透過設定 OPTIMIZER_USE_INVISIBLE_INDEXES 引數(預設值為FALSE)來對比
In-Memory Column Store和使用index的效能 。例子:

create index lo_orderkey_idx on  lineorder(lo_orderkey)  invisible; 
SET TIMING ON
SELECT lo_orderkey, lo_custkey, lo_revenue FROM lineorder WHERE lo_orderkey = 5000000;

ALTER SESSION set inmemory_query = disable;
ALTER SESSION SETOPTIMIZER_USE_INVISIBLE_INDEXES=TRUE;
--- 在buffer cache中使用index
SELECT lo_orderkey, lo_custkey, lo_revenue FROM lineorder WHERE lo_orderkey = 5000000;

ALTER SESSION set inmemory_query = enable;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-1081467/,如需轉載,請註明出處,否則將追究法律責任。

相關文章