暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 为什么我的表不在记忆中?

askTom 2017-03-03
230

问题描述

我下载了带有最新12.2安装的developers days VM,并想尝试12c的内存功能。我已经阅读了文档,做了我认为我需要做的一切,但是不幸的是,我的表似乎不想进入内存 (也就是说,我在v $ im_segments中看不到它)。我试过强制全表扫描,这没什么区别。Alto尝试弹起数据库,但没有帮助。

[oracle@vbgeneric]$ sqlplus hr@orcl

SQL*Plus: Release 12.2.0.1.0 Production on Fri Mar 3 18:12:31 2017

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> alter table employees inmemory priority critical;

Table altered.

SQL> select * from v$im_segments;

no rows selected

SQL> select * from v$sga;

NAME                      VALUE     CON_ID
-------------------- ---------- ----------
Fixed Size              8794848          0
Variable Size         402656544          0
Database Buffers      654311424          0
Redo Buffers            7979008          0
In-Memory Area       1073741824          0

SQL> show parameter inmemory;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
inmemory_adg_enabled                 boolean     TRUE
inmemory_clause_default              string
inmemory_expressions_usage           string      ENABLE
inmemory_force                       string      DEFAULT
inmemory_max_populate_servers        integer     1
inmemory_query                       string      ENABLE
inmemory_size                        big integer 1G
inmemory_trickle_repopulate_servers_ integer     1
percent
inmemory_virtual_columns             string      MANUAL
optimizer_inmemory_aware             boolean     TRUE
SQL> show parameter sga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
allow_group_access_to_sga            boolean     FALSE
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     TRUE
sga_max_size                         big integer 2G
sga_min_size                         big integer 0
sga_target                           big integer 1500M
unified_audit_sga_queue_size         integer     1048576
SQL> set autotrace on
SQL> select /*+full(e)*/ count(*) from employees e;

  COUNT(*)
----------
       107


Execution Plan
----------------------------------------------------------
Plan hash value: 1756381138

--------------------------------------------------------------------------------
-

| Id  | Operation                   | Name      | Rows  | Cost (%CPU)| Time
|

--------------------------------------------------------------------------------
-

|   0 | SELECT STATEMENT            |           |     1 |     3   (0)| 00:00:01
|

|   1 |  SORT AGGREGATE             |           |     1 |            |
|

|   2 |   TABLE ACCESS INMEMORY FULL| EMPLOYEES |   107 |     3   (0)| 00:00:01
|

--------------------------------------------------------------------------------
-



Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          7  consistent gets
          0  physical reads
          0  redo size
        543  bytes sent via SQL*Net to client
        607  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> set autotrace off
SQL> select * from v$im_segments;

no rows selected

SQL>

复制


我做错了什么?autotrace上显示的计划表明Oracle认为该表应该是inmemory,不是吗?然而,v $ im_segments表明它不是。我没有抓住实际的计划来证明是这样。注意-我以前已经在employe雇员表上做了一个完整的工作,所以所有行可能都在缓冲区缓存中,因此物理读取为0。

专家解答

让你的表变大 :-)

从文档中:

如果磁盘上的段为64 KB或更小,则不会在IM列存储中填充它。因此,一些为IM列存储启用的小数据库对象可能不会在其中填充。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论