Oracle 12c In-Memory Option - 13

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

转载于:http://blog.itpub.net/35489/viewspace-1081466/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值