今天我们要说的是Oracle 12c R2中的一个非常重要的功能——Oracle 12.1.0.2.0 Automatic Big Table Caching(Abtc)。在Oracle 12c R2中,Abtc功能对于需要频繁访问大表的应用程序来说非常有用,可以大幅度提供应用程序的性能。
所谓大表,指的是包含数百万行记录的表。这些表的访问非常耗费I / O资源,这是因为Oracle数据库通常会扫描整个表的大部分数据,即使只有几百行满足查询条件。这样,就会导致在磁盘I / O中进行大量随机读取,为系统带来沉重的开销。为解决这些性能问题,Oracle 12c R2中出现了自动大表缓存(Abtc)。
Abtc功能可以自动检测和缓存大表,并在将来的查询操作中使用缓存的数据来加速访问。Abtc通过分析查询模式来确定哪些表是候选表,并将其存入缓存中。如果之后的查询匹配缓存中的查询模式,则将使用缓存中的数据而不是磁盘数据进行查询。因此,Abtc可以显着提高大表的查询效率,降低应用程序的响应时间。
接下来我们在终端中打开Oracle的SQL*Plus,并运行以下脚本,来查看Oracle Abtc缓存的命中率。下面的脚本会在其中一个表中定义了一个查询,并反复执行这个查询,以确定Abtc有多少次命中率。
SET SERVEROUTPUT ON DECLARE v_current_hits NUMBER; v_current_misses NUMBER; BEGIN SELECT sum(pins), sum(reloads), sum(pins) / (sum(pins) + sum(reloads)) * 100, (select max(sum(pins) + sum(reloads)) / 10 from v$bh) scale_factor INTO v_current_hits, v_current_misses, v_current_hit_ratio, v_current_scale_factor FROM v$bh WHERE tch = 1; DBMS_OUTPUT.PUT_LINE ('Hits: ' || LPAD(v_current_hits, 6) || '; Misses: ' || LPAD(v_current_misses, 6) || '; Hit Ratio: ' || LPAD(to_char(v_current_hit_ratio, '999.00') || '%', 6)); END; /
上面的脚本运行后,我们可以看到Abtc的命中率。该命中率越高,表明Abtc的效能越好。通常,Abtc的命中率应该达到80%至90%以上,才可以较好的发挥其缓存大表的作用。
总之,Abtc是Oracle 12c R2中非常有用的功能,它可以大幅度提高应用程序的性能,特别是那些需要频繁访问大表的应用程序。使用Abtc,我们可以获得更快的查询响应时间和更好的用户体验,提高数据读写操作的效率。