Oracle 12c 开启异步通信新阶段(oracle12c 队列)

Oracle 12c: 开启异步通信新阶段

Oracle 12c数据库引入了名为Asynchronous Global Index Mntenance(AGIM)的新特性,它允许数据库在执行数据更新操作时,不必等待全局索引的重建完成,而是采用一种异步方式更新全局索引。这一特性的引入,标志着Oracle数据库开启了一段全新的异步通信阶段。

在以往的版本中,为了保证全局索引和表数据相互保持一致,当表数据发生更改时,全局索引需要同时更新。而全局索引的更新,往往需要较长的时间,导致数据更新操作变得十分缓慢。而现在,引入AGIM,使得当数据更新操作完成后,可以成立异步的任务,另开线程进行全局索引的更新,从而大大提高了数据库的并行效率。

AGIM主要由两个部分构成:系统会将需要更新全局索引的数据块标记为invalid,然后在事务提交之前,将这些标记的块更新到全局索引中,并将它们重建为有效的数据块。全局索引重建时,Oracle会将一些变更转换成异步任务,异步任务会在互相独立的线程中异步执行。异步任务的异步执行,就是数据库中异步通信新阶段的具体体现。

除了提高了数据库的并行效率外,AGIM还在某种程度上降低了数据库出现锁的可能性。在往常的情况下,当需要更新全局索引时,数据库往往需要锁定相关的数据表,以保证更新操作的正确进行,但这种方式很容易引发死锁等问题。现在,AGIM的异步更新方式可以在一定程度上减少对数据库的加锁,从而保证数据库的高可靠性、高可用性。

AGIM的实现依赖于数据库中的一个队列,当数据更新操作完成后,会将需要更新全局索引的任务放入该队列中。如果该队列已满,则将任务以回滚事务的形式进行提交,等待空闲的队列空间。当队列空间空闲时,会立即执行这些异步任务,以保证全局索引和数据表间的数据一致性。

下面是一个使用AGIM的示例代码:

CREATE TABLE employees_new
AS SELECT * FROM employees;

--创建全局索引
CREATE INDEX emp_name_idx ON employees_new(last_name, first_name);
--启动AGIM
ALTER SESSION SET INMEMORY_FORCE=DEFAULT;
ALTER TABLE employees_new MODIFY (
last_name DEFAULT 'unknown' NOT NULL
);
COMMIT;
--查询任务是否已完成
SELECT log.mesg_text FROM v$bg_async_io agg, v$bg_async_io_msgs log
WHERE agg.req_id = log.req_id
AND log.mesg_date > SYSDATE - 5/1440
AND log.mesg_text LIKE 'Index Build%';

--查看任务执行情况
SELECT owner_name, table_name, background_comp_task, created_date, state
FROM dba_background_comp_tasks
WHERE table_name = 'EMPLOYEES_NEW'
ORDER BY created_date DESC;

AGIM的引入标志着Oracle数据库进入了新的异步通信阶段,使得数据库的并行效率、可用性和可靠性得到了更进一步的提高。在实际应用中,我们可以将AGIM应用于不同的场景中,以便更好地使用Oracle数据库的各种优秀特性。


数据运维技术 » Oracle 12c 开启异步通信新阶段(oracle12c 队列)