使用Oracle内存机制优化ArcSDE图层空间查询的实验(二)

2014-11-24 17:07:29 · 作者: · 浏览: 1
L*Net to client 1235 bytes received via SQL*Net from client 67 SQL*Net roundtrips to/from client 28 sorts (memory) 0 sorts (disk) 984 rows processed
主要看“已用时间”和“physical reads”项,前者为总用时,后者为读取硬盘的次数 发现在时间使用上和硬盘读取次数,sde_ori>sde_index_mem>sde_all_mem,但差别不大,与预期不一样,按实验前的想法,加载在内存中的图层应该会大大加快,而且sde_all_mem应该基本不需要读取硬盘才对

2.以相反的顺序重新查询

清空缓存后,重新进行实验,将查询的顺序倒过来(篇幅原因,结果就不贴了)发现结果也反过来了,时间使用上和硬盘读取次数上,都变成了sde_ori

3.不清空缓存的前提下继续查询

继续实验,在不清空缓存的情况下,再运行一下对三个图层的查询语句,这时,三条语句都执行得非常快,基本都在半秒内,均如下(结果类似,这里只举一条例子):
已选择984行。 已用时间: 00: 00: 01.40
统计信息 ---------------------------------------------------------- 1184 recursive calls 150 db block gets 2087 consistent gets 0 physical reads 0 redo size 42237 bytes sent via SQL*Net to client 1235 bytes received via SQL*Net from client 67 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 984 rows processed
可以看到,使用时间大大减少,而且均没有读取硬盘,这表明,设置为Keep方式加载到内存的表,也需要先进行一次读取,才会在之后加载到内存,对于普通的表,在读取时也会加载到内存,只是加载的位置不同,一个在KEEP POOL,一个在DEFAULT POOL

4.模拟大量使用之后

再进行实验,通过全表搜索某个大表 ,将原来缓存里的内容挤掉,再进行查询, 首先查原表,sde_ori COUNT(*) ---------- 984
已用时间: 00: 00: 04.37
统计信息 ---------------------------------------------------- 1837 recursive calls 150 db block gets 3826 consistent gets 1378 physical reads 0 redo size 528 bytes sent via SQL*Net to client 519 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 15 sorts (memory) 0 sorts (disk) 1 rows processed
然后查索引放在内存Keep pool中的sde_index_mem COUNT(*) ---------- 984
已用时间: 00: 00: 04.87
统计信息 ---------------------------------------------------- 1559 recursive calls 150 db block gets 3876 consistent gets 1181 physical reads 0 redo size 528 bytes sent via SQL*Net to client 519 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 5 sorts (memory) 0 sorts (disk) 1 rows processed
最后查全表放在内存Keep pool中的sde_all_mem COUNT(*) ---------- 984
已用时间: 00: 00: 00.20
统计信息 ---------------------------------------------------- 1184 recursive calls 150 db block gets 1132 consistent gets 5 physical reads 0 redo size 528 bytes sent via SQL*Net to client 519 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
可以看到,主表没有放入Keep Pool的两个表,数据已经被从缓存中挤出去了,再次查询时耗时非常大,也有非常多的硬盘读取。全表放入内存Keep Pool的sde_all_mem则保持了非常高速度以及非常少的硬盘读取。说明影响空间查询的主要还是主表,索引表是否放入内存影响不大,同时,放入Keep Pool的数据,不会因为其它的查询而被挤出内存。

推论:

1:对于ArcSDE,在进行空间查询时,空间表是否在内存中,会对空间查询的速度产生非常大的影响; 2:对于ArcSDE,在进行空间查询时,索引表是否在内存中对查询速度影响不大,主要还是取决于主表是否在内存中 3:不管是否设置为Keep,在没有进行过查询时,都不会加载到内存中 4:不管是否设置为Keep,在进行完查询后,都会加载到内存中(不考虑因为内存大小关系加载不完的情况),只是加载的位置不一样 5:设置为Keep的表,不会因为其它查询而被从内存中清除,而没有设置成Keep的表则会。下一次查询时,没有设置成Keep的表还需要从硬盘加载,速度变慢 6:所以,因为 Oracle的内存机制,将表设置为Keep不会对查询绝对速度有明显的提升,只是会减少其从硬盘加载到内存的次数,对于使用不太频繁的应用,从用户感觉上会有一定的提升。对于某些特定的应用环境,会有一定的使用价值。