对于dual总是有种熟悉而陌生的感觉,我们经常使用却对它知之甚少。今天由【DBA 社群】联合发起人杨建荣老师带你一起了解dual和它深藏的那些你不知道的玄机…… 目录
一、为了存在而存在的dualDual在Oracle数据库中是一个特殊存在的对象,当然用黑格尔的哲学名言“存在即合理“来解释最恰当不过了。 我对dual的感觉就是为了存在而存在,一方面是为了保证语法的完整性,还有一种场景是为了序列的递增,如果再进一步,那应该是dual中会保留一条数据。 dual是一个虚表,也常称为dummy表。通过下面的查询结果可以很容易看出来dual是一个实体表,然后通过public的同义词,对所有的用户都可以提供访 问。 我对dual的关注源于一个小小的案例,也是在一次巡检中发现了一个小问题,然后死磕,发现了dual的一些小问题,最后也做了不少的测试。 二、 一个小案例中对dual的思考Oracle对于sys用户的审计是默认的一个操作,所以不管你开启了什么审计策略,sys的登录操作都会记录下来,可能估计Oracle也没有料到有些应用会把这个影响放大,毕竟频繁登录sys听起来也是不现实的。但是放到大批量细粒度的自动化监控中,这个影响就会放大,可能在设计上有些功能还不够严谨,确切的说应该是存在一定的问题。
不要小瞧这些细小的文件,如果积累到一定程度,就会带来不小的影响。比如命令ls支持不了 或者inode溢出。
这个时候发现 这个简单的监控语句在nomount状态下也是可用的,这个时候还没有开始初始化数据字典,但是就是可以做一些计算。
所以通过这个细小的案例还是发现,其实监控的一些方式还是需要斟酌,如果需要做数据库是否可用的检查验证,使用了select 'Oracle is alive'的方式验证,那么可能数据库还没到open阶段,通过这个语句就已经“验证”数据库服务已经OK了,这种情况还是很容易造成误导。还是需要好好注意一下。 所以一个初步结论就是使用dual来做监控还是存在一定的隐患,很可能监控会给我们带来一些误导,因为数据库实例在nomount,mount,open阶段都可以成功输出结果。 一个小小的案例结束,我的分析才刚刚开始。 三、 Dual在数据库实例启动的不同阶段的变化如果你观察仔细,就会发现dual在数据库启动的不同的阶段,里面的字段其实还会发生一些微妙的变化。在nomount和mount阶段含有多个“字段”,而不是一个。 如果感兴趣可以仔细分析一下上面的原委,如果从实用主义的角度,可能会感觉然并卵,好吧,我们再来看一个例子:FAST DUAL。 四、 关于dual的改进:FAST DUAL如果追溯起来,FAST DUAL执行计划是Oracle10g中的新特性。对使用DUAL进行的计算,可以不用真正的访问表,从而快速的得到结果。 这个改变似乎并不起眼,但是实际上累计起来对于系统的影响还是很大的。 我们来简单测试一下两者的细微差别。 可以看到FAST DUAL的场景下consistents gets为0,然后再来看一下查询全表数据的情况,其实里面只有一条数据,但是还是会有额外的consistent gets。 明白了dual的一些基本使用,如果想更进一步了解dual,可以做一些小的测试。 五、 Dual中只保留一条数据记录的验证测试我们再来看看dual的表结构,只有一个字段,里面也只有一条纪录。 那么我们可以不可以自己新建一个dual表呢,答案是当然可以。 不过这个使用下面的语句查看,会查不出结果。 SQL |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|