ITPub博客

首页 > 数据库 > Oracle > Oracle 12c In-Memory Option - 7

Oracle 12c In-Memory Option - 7

原创 Oracle 作者:tolywang 时间:2014-02-14 15:27:24 0 删除 编辑

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13385064