Oracle 内存列存储没有改进 SELECT 查询?
Posted
技术标签:
【中文标题】Oracle 内存列存储没有改进 SELECT 查询?【英文标题】:Oracle in-memory column store is not improving SELECT query? 【发布时间】:2021-08-21 16:02:12 【问题描述】:我有一个SELECT
声明
SELECT MIN(C_PRICE), MAX(C_PRICE)
FROM CAR;
我运行该语句并创建一个处理计划来查看成本。
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 | 12150 (1)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 3 | | |
| 2 | TABLE ACCESS FULL| CAR | 1800K| 5273K| 12150 (1)| 00:00:01 |
-------------------------------------------------------------------------------
在将inmemory
的大小设置为200M 后,我为这个表car
创建了一个inmemory
。
ALTER TABLE CAR INMEMORY;
结果
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 | 12150 (1)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 3 | | |
| 2 | TABLE ACCESS INMEMORY FULL| CAR | 1800K| 5273K| 12150 (1)| 00:00:01 |
----------------------------------------------------------------------------------------
我的问题是为什么在将表更改为inmemory
后查询没有得到改进? SELECT
语句清楚地表明它正在通过inmemory
访问表。我认为创建inmemory
会改善查询处理从而降低成本?
【问题讨论】:
成本只是一个估计值,仅包含足以供 Oracle 确定最佳执行计划的信息。执行时间的实际差异是什么?如果你真的想让这个查询更快,你可以索引聚合列并将它分成两个标量子查询(一个做最小值,一个做最大值) @Sunny J - 您对 inmemory 列存储的总体体验如何,如果您可以分享,将会对我有很大帮助,我计划将它用于我的 OLAP 场景 【参考方案1】:你应该看看两件事。一、表是否填充在 IM 列存储中(即 v$im_segments)?其次,两次查询之间的时间差是多少,花费的时间在哪里? SQL Monitor 活动报告非常适合确定这一点。
【讨论】:
以上是关于Oracle 内存列存储没有改进 SELECT 查询?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 12.1.0.2 New Feature翻译学习In-Memory column store内存列存储原创