Oracle 12.1.0.2 In-Memory组件测试

1:连接到sys用户下,查看内存初始化参数的值

[sql]  view plain  copy
  1. [oracle@oracle12c ~]$ sqlplus / as sysdba  
  2.   
  3. SQL*Plus: Release 12.1.0.2.0 Production on Wed Jul 30 23:25:42 2014  
  4.   
  5. Copyright (c) 1982, 2014, Oracle.  All rights reserved.  
  6.   
  7.   
  8. Connected to:  
  9. Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production  
  10. With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options  
  11.   
  12. SQL> show parameter inm  
  13.   
  14. NAME                                 TYPE        VALUE  
  15. ------------------------------------ ----------- ------------------------------  
  16. inmemory_clause_default              string  
  17. inmemory_force                       string      DEFAULT  
  18. inmemory_max_populate_servers        integer     0  
  19. inmemory_query                       string      ENABLE  
  20. inmemory_size                        big integer 0  
  21. inmemory_trickle_repopulate_servers_ integer     1  
  22. percent  
  23. optimizer_inmemory_aware             boolean     TRUE  

2:默认情况下内存参数inmemory_size是没有值得,用户需要手动修改参数值。

  • inmemory_clause_default:默认空值,表示需要显式的指定某个table才能in memory。INMEMORY,表示所有的new table都in memory;NO INMEMORY,和空值是一个意思。
  • inmemory_force:default:具有IN MEMORY属性的table,才会被选定以in memory的方式存储。OFF:即使具有IN MEMORY AREA被配置了,也不会有table以in memory的方式存储。ON:除非显式的指定NO INMEMORY的属性的table,其他的table都会以in memory方式存储。
  • inmemory_query:enable,可以进行inmemory_query;disable,禁用inmemory_query
  • inmemory_size:设置inmemory option的内存大小,注,不能动态调整。
  • inmemory_max_populate_servers :该参数设置用于将数据加载到内存的后台进程数量

[sql]  view plain  copy
  1. SQL> alter system set inmemory_size=2G scope=spfile;  
  2.   
  3. System altered.  
  4.   
  5. SQL> alter system set inmemory_max_populate_servers=2 scope=spfile;  
  6.   
  7. System altered.  
  8.   
  9. SQL> shutdown immediate;  
  10. Database closed.  
  11. Database dismounted.  
  12. ORACLE instance shut down.  
  13. SQL> startup  
  14. ORACLE instance started.  
  15.   
  16. Total System Global Area 4294967296 bytes  
  17. Fixed Size                  2932632 bytes  
  18. Variable Size             603979880 bytes  
  19. Database Buffers         1526726656 bytes  
  20. Redo Buffers               13844480 bytes  
  21. In-Memory Area           2147483648 bytes  
  22. Database mounted.  
  23. Database opened.  
  24. SQL> show parameter inm  
  25.   
  26. NAME                                 TYPE        VALUE  
  27. ------------------------------------ ----------- ------------------------------  
  28. inmemory_clause_default              string  
  29. inmemory_force                       string      DEFAULT  
  30. inmemory_max_populate_servers        integer     2  
  31. inmemory_query                       string      ENABLE  
  32. inmemory_size                        big integer 2G  
  33. inmemory_trickle_repopulate_servers_ integer     1  
  34. percent  
  35. optimizer_inmemory_aware             boolean     TRUE  

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

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

建议看到转载,请直接访问正版链接获得最新的ArcGIS技术文章

Blog:               http://blog.csdn.net/linghe301 

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


3:创建一个普通表,然后进行一个普通测试

[sql]  view plain  copy
  1. SQL> create table t1 as select * from dba_objects;  
  2.   
  3. Table created.  
  4.   
  5. SQL> select bytes/1024/1024 from user_segments where segment_name='T1';  
  6.   
  7. BYTES/1024/1024  
  8. ---------------  
  9.            12.5  
  10.   
  11. SQL> set timing on  
  12. SQL> set time on  
  13. 01:53:00 SQL> set autot traceonly  
  14. 01:53:07 SQL> select * from t1;  
  15.   
  16. 92177 rows selected.  
  17.   
  18. Elapsed: 00:00:03.51  
  19.   
  20. Execution Plan  
  21. ----------------------------------------------------------  
  22. Plan hash value: 3617692013  
  23.   
  24. --------------------------------------------------------------------------  
  25. | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |  
  26. --------------------------------------------------------------------------  
  27. |   0 | SELECT STATEMENT  |      | 92177 |    10M|   429   (1)| 00:00:01 |  
  28. |   1 |  TABLE ACCESS FULL| T1   | 92177 |    10M|   429   (1)| 00:00:01 |  
  29. --------------------------------------------------------------------------  
  30.   
  31.   
  32. Statistics  
  33. ----------------------------------------------------------  
  34.           2  recursive calls  
  35.           0  db block gets  
  36.        7596  consistent gets  
  37.        1546  physical reads  
  38.           0  redo size  
  39.    12280356  bytes sent via SQL*Net to client  
  40.       68146  bytes received via SQL*Net from client  
  41.        6147  SQL*Net roundtrips to/from client  
  42.           0  sorts (memory)  
  43.           0  sorts (disk)  
  44.       92177  rows processed  

我们从执行计划中可以看到,逻辑读7596个、物理读1546个。该表在数据库中占用空间约12.5MB。

4:创建同样的表在内存组件中进行测试

[sql]  view plain  copy
  1. SQL> create table t2 as select * from dba_objects;  
  2.   
  3. Table created.  
  4.   
  5. SQL> set line 200  
  6.   
  7. SQL> alter table t2 inmemory;  
  8.   
  9. Table altered.  
  10.   
  11. SQL>  select * from v$inmemory_area;  
  12.   
  13. POOL                       ALLOC_BYTES USED_BYTES POPULATE_STATUS                CON_ID  
  14. -------------------------- ----------- ---------- -------------------------- ----------  
  15. 1MB POOL                    1710227456    4194304 DONE                                3  
  16. 64KB POOL                    419430400   51314688 DONE                                3  
  17.   
  18. SQL> select count(*) from t2;  
  19.   
  20.   COUNT(*)  
  21. ----------  
  22.      92178  
  23.   
  24. SQL> select * from v$inmemory_area;  
  25.   
  26. POOL                       ALLOC_BYTES USED_BYTES POPULATE_STATUS                CON_ID  
  27. -------------------------- ----------- ---------- -------------------------- ----------  
  28. 1MB POOL                    1710227456    8388608 DONE                                3  
  29. 64KB POOL                    419430400   51445760 DONE                                3  
  30.   
  31. SQL> set timing on  
  32. SQL> set time on  
  33. 01:59:12 SQL> set autot traceonly  
  34. 01:59:21 SQL> select * from t2;  
  35.   
  36. 92178 rows selected.  
  37.   
  38. Elapsed: 00:00:03.42  
  39.   
  40. Execution Plan  
  41. ----------------------------------------------------------  
  42. Plan hash value: 1513984157  
  43.   
  44. -----------------------------------------------------------------------------------  
  45. | Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |  
  46. -----------------------------------------------------------------------------------  
  47. |   0 | SELECT STATEMENT           |      | 92178 |    10M|    31  (17)| 00:00:01 |  
  48. |   1 |  TABLE ACCESS INMEMORY FULL| T2   | 92178 |    10M|    31  (17)| 00:00:01 |  
  49. -----------------------------------------------------------------------------------  
  50.   
  51.   
  52. Statistics  
  53. ----------------------------------------------------------  
  54.           5  recursive calls  
  55.           0  db block gets  
  56.           9  consistent gets  
  57.           0  physical reads  
  58.           0  redo size  
  59.     5016356  bytes sent via SQL*Net to client  
  60.       68146  bytes received via SQL*Net from client  
  61.        6147  SQL*Net roundtrips to/from client  
  62.           0  sorts (memory)  
  63.           0  sorts (disk)  
  64.       92178  rows processed  

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

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

建议看到转载,请直接访问正版链接获得最新的ArcGIS技术文章

Blog:               http://blog.csdn.net/linghe301 

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

5:结论

从上面可以看出,当将表至于inmemory状态时,该数据并没有在内存中,我们可以查看v$inmemory_area表里面信息,我们需要执行一些SQL语句如select count(*) from table将表读入内存中,这时候查看v$inmemory_area表中可以看到增长的信息,可能我原来进行过相关测试,1M内存pool和64K内存pool都有相关的信息,我们可以进行压缩对比来查看行式存储和列式存储的比较。

[sql]  view plain  copy
  1. 02:12:21 SQL> select (51445760 +8388608 -51314688 -4194304)/1024/1024 MB from dual;  
  2.   
  3.         MB  
  4. ----------  
  5.      4.125  

可以进行对比,行式存储为12.5MB,列式存储约4MB,如果数据量更大的话这个对比更加明显。


另外我们可以看到,使用in-memory组件,相关的逻辑读仅有5,而且没有物理读,这个也是该组件的高效之处。


但是我们细心的朋友也会发现一个问题,普通查询耗时3.51秒,但是内存组件查询耗时3.42秒,我们看到后者的指标要比前者漂亮的多,但是性能方面并没有想象中的提高,这个是为什么呢?

经过咨询,这个问题可能是:inmemory是列式存储,数据经过压缩的。它的优势是针对某些列的分析型操作。你如果只是把数据拿出来,数据库需要把列数据拼成行数据,相对于普通的行式存储还要干额外的工作,当然要慢了。


PS:因为虚拟机的问题,我们测试都是在同一条件下进行,结果可能有所不同,但是希望能够说明相关的问题。


6:其他

当然,Oracle也提供了In-Memory 的视图来帮助用户进行分析

v$im_segments

[sql]  view plain  copy
  1. SQL> desc v$im_segments  
  2.  Name                                      Null?    Type  
  3.  ----------------------------------------- -------- ----------------------------  
  4.  OWNER                                              VARCHAR2(128)  
  5.  SEGMENT_NAME                                       VARCHAR2(128)  
  6.  PARTITION_NAME                                     VARCHAR2(128)  
  7.  SEGMENT_TYPE                                       VARCHAR2(18)  
  8.  TABLESPACE_NAME                                    VARCHAR2(30)  
  9.  INMEMORY_SIZE                                      NUMBER  
  10.  BYTES                                              NUMBER  
  11.  BYTES_NOT_POPULATED                                NUMBER  
  12.  POPULATE_STATUS                                    VARCHAR2(9)  
  13.  INMEMORY_PRIORITY                                  VARCHAR2(8)  
  14.  INMEMORY_DISTRIBUTE                                VARCHAR2(15)  
  15.  INMEMORY_DUPLICATE                                 VARCHAR2(13)  
  16.  INMEMORY_COMPRESSION                               VARCHAR2(17)  
  17.  CON_ID                                             NUMBER  
  18.   
  19. SQL> select inmemory_size/1024/1024,bytes/1024/1024 from v$im_segments where segment_name='T2';  
  20.   
  21. INMEMORY_SIZE/1024/1024 BYTES/1024/1024  
  22. ----------------------- ---------------  
  23.                   4.125            12.5  

user_tables表也会多了几项关于INMEMORY的相关信息

[sql]  view plain  copy
  1. SQL> desc user_tables  
  2.  Name                                      Null?    Type  
  3.  ----------------------------------------- -------- ----------------------------  
  4.  TABLE_NAME                                NOT NULL VARCHAR2(128)  
  5.  TABLESPACE_NAME                                    VARCHAR2(30)  
  6.  CLUSTER_NAME                                       VARCHAR2(128)  
  7.  IOT_NAME                                           VARCHAR2(128)  
  8.  STATUS                                             VARCHAR2(8)  
  9.  PCT_FREE                                           NUMBER  
  10.  PCT_USED                                           NUMBER  
  11.  INI_TRANS                                          NUMBER  
  12.  MAX_TRANS                                          NUMBER  
  13.  INITIAL_EXTENT                                     NUMBER  
  14.  NEXT_EXTENT                                        NUMBER  
  15.  MIN_EXTENTS                                        NUMBER  
  16.  MAX_EXTENTS                                        NUMBER  
  17.  PCT_INCREASE                                       NUMBER  
  18.  FREELISTS                                          NUMBER  
  19.  FREELIST_GROUPS                                    NUMBER  
  20.  LOGGING                                            VARCHAR2(3)  
  21.  BACKED_UP                                          VARCHAR2(1)  
  22.  NUM_ROWS                                           NUMBER  
  23.  BLOCKS                                             NUMBER  
  24.  EMPTY_BLOCKS                                       NUMBER  
  25.  AVG_SPACE                                          NUMBER  
  26.  CHAIN_CNT                                          NUMBER  
  27.  AVG_ROW_LEN                                        NUMBER  
  28.  AVG_SPACE_FREELIST_BLOCKS                          NUMBER  
  29.  NUM_FREELIST_BLOCKS                                NUMBER  
  30.  DEGREE                                             VARCHAR2(10)  
  31.  INSTANCES                                          VARCHAR2(10)  
  32.  CACHE                                              VARCHAR2(5)  
  33.  TABLE_LOCK                                         VARCHAR2(8)  
  34.  SAMPLE_SIZE                                        NUMBER  
  35.  LAST_ANALYZED                                      DATE  
  36.  PARTITIONED                                        VARCHAR2(3)  
  37.  IOT_TYPE                                           VARCHAR2(12)  
  38.  TEMPORARY                                          VARCHAR2(1)  
  39.  SECONDARY                                          VARCHAR2(1)  
  40.  NESTED                                             VARCHAR2(3)  
  41.  BUFFER_POOL                                        VARCHAR2(7)  
  42.  FLASH_CACHE                                        VARCHAR2(7)  
  43.  CELL_FLASH_CACHE                                   VARCHAR2(7)  
  44.  ROW_MOVEMENT                                       VARCHAR2(8)  
  45.  GLOBAL_STATS                                       VARCHAR2(3)  
  46.  USER_STATS                                         VARCHAR2(3)  
  47.  DURATION                                           VARCHAR2(15)  
  48.  SKIP_CORRUPT                                       VARCHAR2(8)  
  49.  MONITORING                                         VARCHAR2(3)  
  50.  CLUSTER_OWNER                                      VARCHAR2(128)  
  51.  DEPENDENCIES                                       VARCHAR2(8)  
  52.  COMPRESSION                                        VARCHAR2(8)  
  53.  COMPRESS_FOR                                       VARCHAR2(30)  
  54.  DROPPED                                            VARCHAR2(3)  
  55.  READ_ONLY                                          VARCHAR2(3)  
  56.  SEGMENT_CREATED                                    VARCHAR2(3)  
  57.  RESULT_CACHE                                       VARCHAR2(7)  
  58.  CLUSTERING                                         VARCHAR2(3)  
  59.  ACTIVITY_TRACKING                                  VARCHAR2(23)  
  60.  DML_TIMESTAMP                                      VARCHAR2(25)  
  61.  HAS_IDENTITY                                       VARCHAR2(3)  
  62.  CONTAINER_DATA                                     VARCHAR2(3)  
  63.  INMEMORY                                           VARCHAR2(8)  
  64.  INMEMORY_PRIORITY                                  VARCHAR2(8)  
  65.  INMEMORY_DISTRIBUTE                                VARCHAR2(15)  
  66.  INMEMORY_COMPRESSION                               VARCHAR2(17)  
  67.  INMEMORY_DUPLICATE                                 VARCHAR2(13)  


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

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

建议看到转载,请直接访问正版链接获得最新的ArcGIS技术文章

Blog:               http://blog.csdn.net/linghe301 

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

测试环境2:IBM 笔记本 W500  、Linux 6.4、8GB内存、Oracle12.1.0.2、ArcSDE10.3  数据介绍:空间数据  ST_Geometry存储,内存参数设置为3GB

1:首先看一下数据情况,面状数据subdltb约300W条记录,查询数据也是面状数据query,里面包含一个大的要素

[sql]  view plain  copy
  1. 11:40:28 SQL> select count(*) from subdltb;  
  2.   
  3.   COUNT(*)  
  4. ----------  
  5.    2999999  
  6.   
  7. Elapsed: 00:00:11.09  
  8. 11:40:53 SQL> select sde.st_area(shape) from query where objectid=3;  
  9.   
  10. SDE.ST_AREA(SHAPE)  
  11. ------------------  
  12.         4.0640E+10  
  13.   
  14. Elapsed: 00:00:00.42  

2:使用ArcSDE for Oracle的ST_Intersects函数进行查询,然后进行sum求和

[sql]  view plain  copy
  1. 11:41:16 SQL> select sum(a.db2gse_st_) from subdltb a,query b where sde.st_intersects(a.shape,b.shape)=1 and b.objectid=3;  
  2.   
  3. SUM(A.DB2GSE_ST_)  
  4. -----------------  
  5.        4451543224  
  6.   
  7. Elapsed: 00:03:01.04  
  8.   
  9. Execution Plan  
  10. ----------------------------------------------------------  
  11. Plan hash value: 2821153078  
  12.   
  13. --------------------------------------------------------------------------------------------------------------  
  14.   
  15. | Id  | Operation                                 | Name               | Rows  |Bytes | Cost (%CPU)| Time     |  
  16.   
  17. --------------------------------------------------------------------------------------------------------------  
  18. |   0 | SELECT STATEMENT                          |                    |     1 |4648 |     2   (0)| 00:00:01 |  
  19. |   1 |  SORT AGGREGATE                           |                    |     1 |4648 |            |          |  
  20. |   2 |   NESTED LOOPS                            |                    | 27712 |122M |     2   (0)| 00:00:01 |  
  21. |   3 |    TABLE ACCESS BY INDEX ROWID            | QUERY              |     1 |2324 |     0   (0)| 00:00:01 |  
  22. |*  4 |     INDEX UNIQUE SCAN                     | R7_SDE_ROWID_UK    |     1 |     |     0   (0)| 00:00:01 |  
  23. |   5 |    TABLE ACCESS BY INDEX ROWID            | SUBDLTB            | 27712 |61M  |     2   (0)| 00:00:01 |  
  24. |*  6 |     DOMAIN INDEX (Sel: Default - No Stats)| SHAPE_92247_4_SIDX |       |     |    18E  (0)|          |  
  25. --------------------------------------------------------------------------------------------------------------  
  26.   
  27.   
  28.   
  29. Predicate Information (identified by operation id):  
  30. ---------------------------------------------------  
  31.   
  32.    4 - access("B"."OBJECTID"=3)  
  33.    6 - access("SDE"."ST_INTERSECTS"("A"."SHAPE","B"."SHAPE")=1)  
  34.   
  35. Note  
  36. -----  
  37.    - dynamic statistics used: dynamic sampling (level=2)  
  38.   
  39.   
  40. Statistics  
  41. ----------------------------------------------------------  
  42.      733910  recursive calls  
  43.           0  db block gets  
  44.      835491  consistent gets  
  45.       88615  physical reads  
  46.           0  redo size  
  47.         559  bytes sent via SQL*Net to client  
  48.         552  bytes received via SQL*Net from client  
  49.           2  SQL*Net roundtrips to/from client  
  50.         677  sorts (memory)  
  51.           0  sorts (disk)  
  52.           1  rows processed  

3:使用In-MEMORY组件进行测试

将相关要素类进行Inmemory

[sql]  view plain  copy
  1. SQL> select * from v$inmemory_area;  
  2.   
  3. POOL                       ALLOC_BYTES USED_BYTES POPULATE_STATUS                CON_ID  
  4. -------------------------- ----------- ---------- -------------------------- ----------  
  5. 1MB POOL                    2565865472    4194304 DONE                                3  
  6. 64KB POOL                    637534208   51642368 DONE                                3  
  7.   
  8. SQL> alter table query inmemory;  
  9.   
  10. Table altered.  
  11.   
  12. SQL> select count(*) from query;  
  13.   
  14.   COUNT(*)  
  15. ----------  
  16.          4  
  17.   
  18. SQL> select * from v$inmemory_area;  
  19.   
  20. POOL                       ALLOC_BYTES USED_BYTES POPULATE_STATUS                CON_ID  
  21. -------------------------- ----------- ---------- -------------------------- ----------  
  22. 1MB POOL                    2565865472    4194304 DONE                                3  
  23. 64KB POOL                    637534208   51642368 DONE                                3  
  24.   
  25. SQL> select bytes/1024 KB from user_segments where segment_name='QUERY';  
  26.   
  27.         KB  
  28. ----------  
  29.         64  
我们发现,Query要素类并没有加入内存中,Oracle帮助有提示:Objects that are smaller than 64KB are not populated into memory ,Query数据刚好64KB。

然后将subdltb数据放入内存中。

[sql]  view plain  copy
  1. SQL> alter table subdltb inmemory;  
  2.   
  3. Table altered.  
  4.   
  5. SQL> select count(*) from subdltb;  
  6.   
  7.   COUNT(*)  
  8. ----------  
  9.    2999999  
  10.   
  11. SQL> select * from v$inmemory_area;  
  12.   
  13. POOL                       ALLOC_BYTES USED_BYTES POPULATE_STATUS                CON_ID  
  14. -------------------------- ----------- ---------- -------------------------- ----------  
  15. 1MB POOL                    2565865472  849346560 POPULATING                          3  
  16. 64KB POOL                    637534208   52297728 POPULATING                          3  
  17.   
  18. SQL> /  
  19.   
  20. POOL                       ALLOC_BYTES USED_BYTES POPULATE_STATUS                CON_ID  
  21. -------------------------- ----------- ---------- -------------------------- ----------  
  22. 1MB POOL                    2565865472 2554331136 DONE                                3  
  23. 64KB POOL                    637534208   52953088 DONE                                3  

我们看到,一开始查看v$inmemory_area的populate_status是populating,这是因为300W记录的数据,需要一定的时间写入内存中,所以需要稍等些时间状态才会变成DONE。然后查看一下v$im_segments表信息

[sql]  view plain  copy
  1. SQL> select INMEMORY_SIZE/1024/1024,bytes/1024/1024 from v$im_segments where segment_name='SUBDLTB';  
  2.   
  3. INMEMORY_SIZE/1024/1    BYTES/1024/1024  
  4. --------------------    ---------------  
  5. 1182.25         1025  
我们发现,针对于ST_Geometry存储的数据,列式存储压缩之后比行式存储还要大,这个让人很不理解。

进行实际查询

[sql]  view plain  copy
  1. SQL> set timing on  
  2. SQL> set time on  
  3. 12:36:09 SQL> set autot on  
  4. 12:36:16 SQL> select sum(a.db2gse_st_) from subdltb a,query b where sde.st_intersects(a.shape,b.shape)=1 and b.objectid=3;  
  5.   
  6. SUM(A.DB2GSE_ST_)  
  7. -----------------  
  8.        4451543224  
  9.   
  10. Elapsed: 00:03:00.14  
  11.   
  12. Execution Plan  
  13. ----------------------------------------------------------  
  14. Plan hash value: 2821153078  
  15.   
  16. ----------------------------------------------------------------------------------------------------------------  
  17. | Id  | Operation                                 | Name               | Rows  | Bytes | Cost (%CPU)| Time     |  
  18. ----------------------------------------------------------------------------------------------------------------  
  19. |   0 | SELECT STATEMENT                          |                    |     1 |  4648 |  2     (0)   | 00:00:01 |  
  20. |   1 |  SORT AGGREGATE                           |                    |     1 |  4648 |              |          |  
  21. |   2 |   NESTED LOOPS                            |                    | 27712 |   122M|     2     (0)| 00:00:01 |  
  22. |   3 |    TABLE ACCESS BY INDEX ROWID            | QUERY              |     1 |  2324 |     0     (0)| 00:00:01 |  
  23. |*  4 |     INDEX UNIQUE SCAN                     | R7_SDE_ROWID_UK    |     1 |       |     0     (0)| 00:00:01 |  
  24. |   5 |    TABLE ACCESS BY INDEX ROWID            | SUBDLTB            | 27712 |    61M|     2     (0)| 00:00:01 |  
  25. |*  6 |     DOMAIN INDEX (Sel: Default - No Stats)| SHAPE_92247_4_SIDX |       |       |    18E  (0)  |          |  
  26. ----------------------------------------------------------------------------------------------------------------  
  27.   
  28. Predicate Information (identified by operation id):  
  29. ---------------------------------------------------  
  30.   
  31.    4 - access("B"."OBJECTID"=3)  
  32.    6 - access("SDE"."ST_INTERSECTS"("A"."SHAPE","B"."SHAPE")=1)  
  33.   
  34. Note  
  35. -----  
  36.    - dynamic statistics used: dynamic sampling (level=2)  
  37.   
  38.   
  39. Statistics  
  40. ----------------------------------------------------------  
  41.      734531  recursive calls  
  42.           0  db block gets  
  43.      835836  consistent gets  
  44.       87819  physical reads  
  45.           0  redo size  
  46.         559  bytes sent via SQL*Net to client  
  47.         551  bytes received via SQL*Net from client  
  48.           2  SQL*Net roundtrips to/from client  
  49.         455  sorts (memory)  
  50.           0  sorts (disk)  
  51.           1  rows processed  
  52.   
  53. 12:39:25 SQL> select sum(a.db2gse_st_) from subdltb a,query b where sde.st_intersects(b.shape,a.shape)=1 and b.objectid=3;  
  54.   
  55. SUM(A.DB2GSE_ST_)  
  56. -----------------  
  57.        4451543224  
  58.   
  59. Elapsed: 00:12:46.23  
  60.   
  61. Execution Plan  
  62. ----------------------------------------------------------  
  63. Plan hash value: 209829830  
  64.   
  65. -------------------------------------------------------------------------------------------------  
  66. | Id  | Operation                     | Name            | Rows  | Bytes | Cost (%CPU)| Time     |  
  67. -------------------------------------------------------------------------------------------------  
  68. |   0 | SELECT STATEMENT              |                 |     1 |  4648 |  1851  (29)| 00:00:01 |  
  69. |   1 |  SORT AGGREGATE               |                 |     1 |  4648 |            |          |  
  70. |   2 |   NESTED LOOPS                |                 | 27712 |   122M|  1851  (29)| 00:00:01 |  
  71. |   3 |    TABLE ACCESS BY INDEX ROWID| QUERY           |     1 |  2324 |     0   (0)| 00:00:01 |  
  72. |*  4 |     INDEX UNIQUE SCAN         | R7_SDE_ROWID_UK |     1 |       |     0   (0)| 00:00:01 |  
  73. |*  5 |    TABLE ACCESS INMEMORY FULL | SUBDLTB         | 27712 |    61M|  1851  (29)| 00:00:01 |  
  74. -------------------------------------------------------------------------------------------------  
  75.   
  76. Predicate Information (identified by operation id):  
  77. ---------------------------------------------------  
  78.   
  79.    4 - access("B"."OBJECTID"=3)  
  80.    5 - filter("SDE"."ST_INTERSECTS"("B"."SHAPE","A"."SHAPE")=1)  
  81.   
  82. Note  
  83. -----  
  84.    - dynamic statistics used: dynamic sampling (level=2)  
  85.   
  86.   
  87. Statistics  
  88. ----------------------------------------------------------  
  89.     1801418  recursive calls  
  90.           0  db block gets  
  91.        1124  consistent gets  
  92.          17  physical reads  
  93.           0  redo size  
  94.         559  bytes sent via SQL*Net to client  
  95.         551  bytes received via SQL*Net from client  
  96.           2  SQL*Net roundtrips to/from client  
  97.           5  sorts (memory)  
  98.           0  sorts (disk)  
  99.           1  rows processed  


看到这个结果,我觉得是否是空间索引表如果In memory是否有相关效果,结果发现,空间索引表不支持in memory,会报ora-64358错误

[sql]  view plain  copy
  1. SQL> select index_id from st_geometry_index where table_name='SUBDLTB';  
  2.   
  3.   INDEX_ID  
  4. ----------  
  5.          2  
  6.   
  7.   
  8. SQL> alter table s2_idx$ inmemory;  
  9. alter table s2_idx$ inmemory  
  10. *  
  11. ERROR at line 1:  
  12. ORA-64358: in-memory column store feature not supported for IOTs  

4:结论

通过对比可以看到,虽然在内存中进行查询,大家都知道,st_instersects(a,b)需要传入两个参数,该函数a参数会走空间索引,b参数走全表扫描,所以尽可能将数据量大的放到a参数的位置,我按照最高效的方式测试,发现这种方式与普通查询没有任何差别,不管是逻辑读还是物理读和普通查询区别不大,查询时间也基本类似,如果我更换顺序,走比较低效的查询方式,果然,从执行计划指标上看,在内存中进行全表扫描,而且物理读和逻辑读明显减少,但是执行效率更加低效。


在内存技术方面,甲骨文并没有采用SAP HANA的“全内存”架构,数据会根据不同的“温度”来选择不同的处理方式,包含传统硬盘、闪存和内存三个层级,而不是把全部的数据都放到内存当中。Andy Mendelsohn介绍,在Oracle Database In-memory当中,最活跃或者说最热的数据将放到内存中进行分析,活跃度相对较低的数据会采用闪存(事实上,Oracle数据库是最早拥抱闪存的产品之一,在Exadata上已经大面积使用了闪存存储),而温度最低、最不活跃的数据还是会采用传统磁盘来存储。根据不同需求的数据采取不同的策略,这样做的好处在于,客户不必采购大量的内存设备就可以获得最佳性能提升,降低了总体成本,提升了投资回报率。


目前,Oracle的 IN-MEMORY组件还处于研究阶段,这方面的资料还比较少,该问题还在不断研究中,希望能够得到一些有些的解决方法!



当然Oracle的IN-MEMORY OPTION作为一个刚刚发布的组件还没有经过项目的实践,这不已经可以看到关于它的Bug问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值