缓存与连接池.doc
文本预览下载声明
【转载】缓存和连接池
Oracle数据库11g:面向DBA和开发人员的重要新特性
作者:Arup Nanda
缓存和连接池
探究如何使用SQL结果缓存、PL/SQL功能缓存和客户端缓存以及数据库驻留连接池来改善性能。
SQL结果缓存
访问内存比访问硬盘快得多,在接下来几年中,除非硬盘体系结构有重大改进,不然这一情况很可能会持续。缓存这一将数据存储于内存而非硬盘中的过程由此应运而生。缓存是Oracle数据库体系结构的一个基本原理,用户从缓存而非数据库所驻留的磁盘中获取数据。
在相对较小的含静态数据的表中,如STATES、PRODUCT_CODES等参考表,缓存的优势异乎寻常的明显。但是,假设有一个存储公司客户的大型表CUSTOMERS。列表相对静态但不完全是,在向列表中添加或从列表中删除客户时,表极少更改。
缓存在这一情况中也有些许用武之地。但如果您要缓存该表,如何在发生变化时确保获得正确的数据?
Oracle数据库11g可以解决这一问题:使用QL结果缓存。假设查询如下。运行它以获取执行统计信息和响应时间:
SQL set autot on explain stat select state_code,count(*),min(times_purchased),avg(times_purchased)from customers group by state_code/结果是:
ST COUNT(*)MIN(TIMES_PURCHASED)AVG(TIMES_PURCHASED)--------NJ 115 15 NY 994898 015.0052086 CT 5099 014.9466562 MO 125 25 FL 13 35 rows selected.Elapsed:00:00:02.57 Execution Plan--Plan hash value:1577413243--|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|--|0|SELECT STATEMENT||5|30|1846(25)|00:00:23||1|HASH GROUP BY||5|30|1846(25)|00:00:23||2|TABLE ACCESS FULL|CUSTOMERS|1000K|5859K|1495(7)|00:00:18|--Statistics--1 recursive ca lls 0db block gets 5136 consistent gets 5128 physical reads 0redo size 760 bytes sent via SQL*Net to client 420 bytes received via SQL*Net from client 2SQL*Net roundtrips to/from client 0sorts(memory)0 sorts(disk)5 rows processed几点注意事项:
解释计划说明执行了全表扫描。共有5,136次连续的获取(逻辑I/O)。执行时间2.57秒。因为表几乎没变,您可以使用提示来存储要缓存到内存中的查询结果:
select/*+result_cache*/state_code,count(*),min(times_purchased),avg(times_purchased)from customers group by state_code/除提示外,查询与第一个相同。结果(第二次执行该查询):
ST COUNT(*)MIN(TIMES_PURCHASED)AVG(TIMES_PURCHASED)--------NJ 115 15 NY 994898 015.0052086 CT 5099 014.9466562 MO 125 25 FL 13 35 rows selected.Elapsed:00:00:00.01 Execution Plan--Plan hash value:1577413243--|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|--|0|SELECT STATEMENT||5|30|1846(25)|00:00:23||1|RESULT CACHE|gk69saf6h3ujx525twvvsnaytd||||||2|HASH GROUP BY||5|30|1846(25)|00:00:23||3|TABLE ACCESS FULL|CUSTOMERS|1000K|5859K|1495(7)|00:00:18|--Result Cache Information(identified by operation id):--1-colu
显示全部