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/