不使用SQL而访问SGA有两个先决条件:C语言和x$视图。这里,我们会让你了解x$的内存结构,但C语言则不是本书要讲述的内容。
X$数据结构是Oracle数据库管理系统(DBMS)的核心。在数据库管理系统的内核中,他们是处于不断变化中的内存结构,保存着实例(Instance)运行期间的各种统计信息。所以,如果你的实例已经运行了好几个月,某些统计值可能会因为太大而循环计数了,这些值一般可以忽略掉。X$视图的内容一般只存在于内存中,你不可能将他们导出到其他得数据库中,因为他们在数据字典中没有相关信息。他们也不像普通的表那样可以设置存储参数,但是某些固定的列上可以有索引。
X$视图的名字都是以K开头,表示内核(kernel)。初看起来,他们似乎没有规律,实际上,他们的名字是有规律可循的。X$视图的详细信息并没有相关的描述文档,而且各个版本也可能不一样。
Oracle的内核是分层结构的,相互之间保持独立,控制信息在不同层之间传递。每一层都有一组x$内存结构。下面列出了oracle内核中的层。
KK 编译层(Comlication layer)
KX 执行层(Execution layer)
K2 分布式事务层(Distributed Transaction layer)
KZ 安全层(Security layer)
KQ 查询层(Query layer)
KA 访问层(Access layer)
KD 数据层(Data layer)
KT 事务层(Transaction layer)
KC 缓存层(Cache layer)
KS 服务层(Service layer)
KJ 锁管理层(Lock Management layer)
KG一般层(Generic layer)
编译层(KK)主要负责PL/SQL对象的编译,基于数据字典统计信息的执行计划的生成。编译层的主要组件就是oracle的优化器(Optimizer)。
执行层(KX)执行上层编译好的代码,绑定SQL和PL/SQL对象,同时也负责执行对数据字典的递归SQL调用以及共享池(shared pool)中的游标(cursor)管理。
分布式事务层(K2)处理分布式事务中的两阶段提交(two-phase commits)。两阶段提交(准备和提交)是保证分布式事务的数据完整性的一种机制。
安全层(KZ)用于辅助上面的两层在编译和执行期间的权限处理,主要是管理角色和系统权限。
查询层(KQ)在数据字典缓存中缓存数据字典。在编译期间,编译层(KK)和安全层(KZ)需要从查询层读取数据。
访问层(KA)负责访问数据段(segment),并给上面的层提供数据。
数据层(KD)控制物理数据在段中的存储以及读取。还控制着用户存储表数据和索引数据的数据段的格式化。
事务层(KT)主要的组件就是回滚段(rollback segment)。控制着自由空间列表(freelists)的管理,数据块(data block)中事务列表(ITL)的分配,事务期间的行级锁定(row-level lock)已经回滚数据(undo)的生成。还负责回滚段的分配和事务一致性的管理。
缓存层(KC)管理数据缓冲区(database buffer cache)。本层和操作系统关系紧密,管理着缓冲区和共享内存。同时还负责重做(redo)的生成已经将重做日志写入到重做日志文件。
服务层(KS)为其他的层提供必要的服务。在实例和会话级应用初始化参数。控制着单个实例的闩锁latch分配和锁(lock)管理。并且维护实例级的等待时间和统计信息。
锁管理层(KJ)管理RAC环境的锁和资源。维护着全局缓冲锁(buffer lock),而不是表锁或者行级锁。
在你利用x$视图直接从SGA获取信息前,有必要澄清一些关于x$的常见的误解。
误解一:在一个负荷很重的系统中,你不应该查询x$视图。
事实:查询x$大部分时候是安全的。几乎所有的v$视图都是基于一个或多个x$视图的。如果有什么区别的话,绕过v$而直接查询x$代价更低。
误解二:你不应该经常查询x$视图,因为访问后x$的内容会被清除。
事实:只有X$KSMLRU(Kernel Serveice layer Memory-omponent Least Recently Used)会在查询后清空。其他的x$并不会在查询后清空其内容。
误解三:你不能对x$视图执行DML操作,否则将导致实例崩溃
事实:即使你试图对x$视图执行DML操作,你也不可能成功。Oracle是不会允许你这么做的。当然,通过某些手段可以清除或者重设某些x$视图,但那并不是DML操作了。
误解四:在实际生活中,你没有必要访问x$视图。因为机会所有的x$视图信息都能通过查询v$视图获得。
事实:v$视图只暴露了x$视图的一部分信息。对于一些高级的统计信息和内部信息,你仍然需要通过x$获取。例如,共享池内存块(chunks)的大小和块的接触点计数(touch count)都只能通过x$视图获得。
误解五:只有sys用户能访问x$视图。所以,为了获得x$视图的信息,必须以sys身份登陆数据库
事实:这并不完全正确。你可以以SYS的身份创建基于x$的视图,然后将对创建的视图的select权限赋予其他用户,然后其他非DBA的用户就可以查询这些视图了。
X$ 视图介绍
最新推荐文章于 2022-02-23 20:58:24 发布