探讨SELECT语句的元数据&动态取样&读一致性导致的一致性读和递归操作
前几天,论坛上的同行在讨论SELECT语句的元数据,动态取样和读一致性导致的一致性读和递归问题,今天有时间,就试着进行了测试,本人测试环境如下:
win7_64+Oracle11.2.0.4_64
那么,下面就说下测试过程:
1、元数据:当用户向数据库发出SELECT语句后,在解析和执行过程中,肯定是需要读取SELECT相关的元数据,这样,SELECT的统计数据中就会包含递归操作,做这个测试的前提是要把其他因素排除掉(动态取样,一致性读):
session1:
session2:
由上可见,在表没有任何数据块分配和取样的前提下,SELECT语句解析执行过程中,还是发生了递归,而且期间产生的读取,并未计入该语句的统计数据中。
2、读一致性:当我们往表里插入数据后,表分配了一些数据块,在没有动态取样情况下,发生了读一致性,发生的一致性读的数量等于需要读取的表的数据块和undo块的数量。
session1:
session2:
这里,为什么说cr的数量等于表数据块加上undo数据块呢?因为当session1中提交时,session2中的cr数量要少很多,那时,在没有其他并发修改操作的情况下,就不再需要读取undo块,大家有时间可以测试下,这里不再贴出测试过程。
3、动态取样:在表数据量不变和发生动态取样的情况下,当有动态取样发生时,cr和无动态取样发生时有较大差别,这说明动态取样虽然导致了递归的发生,但其中发生的cr也被计入了查询语句的统计数据中。
session2:
以上我们通过hint强制查询语句在解析运行时发生level为8的动态取样,可见发生了递归操作,而cr也有相应增加,而当我们再次运行该语句时,因为不需要再次解析,所以,也就没有了动态取样,因此,此时cr有所降低。
4、redo:我们还注意到,在session1中往表中插入数据但没提交的情况下,session2中select该表时,会产生redo数据,并且,经过进一步测试,这些redo数据也确实写入了redo log file中。
那么,这个redo size是怎么产生的呢?也许有人会说延迟块清除,但是,这里session1中插入的数据并未提交,而且,每次执行select语句,都会有几乎等量的redo产生,这和延迟块清除不同。延迟块清除只有在数据提交后,第一次查询时会产生redo数据,再次查询就不会发生,而且产生的redo也不会这么多。仔细想想,唯一的可能就是,在利用undo数据构造cr块的过程中,也记录了对这些db block的redo数据,并写入了redo log file中,目的就是万一系统此时发生崩溃,再次重启时,通过redo log file中的redo数据重构内存中的这些cr块。
以上为个人测试和临时的想法,仅供大家参考。
探讨SELECT语句的元数据&动态取样&读一致性导致的一致性读和递归操作的更多相关文章
- 【SQL必知必会笔记(3)】SELECT语句的WHERE子句数据过滤操作
上个笔记主要介绍了利用SELECT语句检索单个/多个/所有列,并利用DISTINCT关键字检索具有唯一性的值.利用LIMIT/OFFSET子句限制结果:以及利用ORDER BY子句排序检索出的数据,主 ...
- Golang 笔记 3 if、switch、for、select语句
一.if语句 Go的流程控制主要包括条件分支.循环和并发. if语句一般由if关键字.条件表达式和由花括号包裹的代码块组成.在Go中,代码块必须由花括号包裹.这里的条件表达式是结果类型为bool的表 ...
- GO学习-(36) Go语言在select语句中实现优先级
Go语言在select语句中实现优先级 Go语言在select语句中实现优先级 select语句介绍 Go 语言中的 select语句用于监控并选择一组case语句执行相应的代码.它看起来类似于swi ...
- 优化Select 语句的原则
优化Select 语句的原则 -摘抄<SQL Server 2005 性能监测与优化> Select 语句是数据库应用系统中最常用的语句之一,Select 语句设计的好坏直接影响到应用程序 ...
- 8.2.1.1 Speed of SELECT Statements 加速SELECT 语句
8.2.1 Optimizing SELECT Statements 8.2.2 Optimizing Data Change Statements 8.2.3 Optimizing Database ...
- 图解Go select语句原理
Go 的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的:当select中没有case语句的时候,会阻塞当前的groutine.所以,有人也会说select是 ...
- 8.2.1-优化SELECT语句
8.2.1.优化 SELECT 语句 由SELECT 语句组成的查询,在数据中执行所有的查询.对这类语句的调优排在首位,无论是调优动态web网页的二级响应时间,还是减少生成巨大隔夜报告的时间. 而且, ...
- select语句中会影响查询效率的因素
1.没有创建索引,或者没有正确使用索引;2.存在死锁的情况,从而导致select语句挂起; 3.返回不必要的列,如很多人喜欢在程序中使用select * from 这样会查询表或视图中的所有字段,如果 ...
- mysql5.7官网直译SQL语句优化--select语句优化
8.2 sql语句优化 大致内容如下: 8.2.1:SELECT语句的优化 8.2.2:优化子查询,派生表和试图引用 8.2.3:优化INFORMATION_SCHEMA查询 8.2.4:优化数据改变 ...
随机推荐
- ITU-T Technical Paper: QoS的构建模块与机制
本文翻译自ITU-T的Technical Paper:<How to increase QoS/QoE of IP-based platform(s) to regionally agreed ...
- ReentrantReadWriteLock读写锁的使用1
本文可作为传智播客<张孝祥-Java多线程与并发库高级应用>的学习笔记. 一个简单的例子 两个线程,一个不断打印a,一个不断打印b public class LockTest { publ ...
- Gradle 1.12用户指南翻译——第四十一章. 项目报告插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 地产IT人福利:帆软地产BI解决方案全解析
解决方案下载地址 帆软大型地产集团项目解决方案 下载地址:http://pan.baidu.com/s/1pJGeqKF帆软地产BI解决方案之KPI考核系统 下载地址:http://pan.baidu ...
- 在Mac OS X下搭建gtk编译环境
首先安装 XQuartz X11 for Mac ,可以到这里下载: http://xquartz.macosforge.org/landing/ 需要一个包管理器,我用的是brew,其他的操作类似: ...
- 微信android混淆打包减少安装包大小
首先,感谢微信android团队的分享 微信中的资源混淆工具主要为了混淆资源ID长度(例如将res/drawable/welcome.png混淆为r/s/a.png),同时利用7z深度压缩,大大减少了 ...
- 【42】android Context深度剖析
android程序和java程序的区别 Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的Android工程环境,在这个环境下,我们有像Activ ...
- obj-c编程05:类的多态与id动态绑定
说实在的,写这第5篇的时候十分纠结,代码老是不能动态绑定,在编译时就会出错,最后发现这是开了ARC的原因.开了ARC obj-c就不能动态绑定了吗?这个问题还不清楚哦.把ARC关闭后,虽然会有警告,但 ...
- Oracle 中Return 和exit的区别
在Oracle存储过程中,使用Return 时,如果执行到Return语句,会跳出整个语句(如果是循环,会跳出整个循环),将不再执行,也就是结束了整个存储过程. 下面就用一个例子来说明一下 ,这个存储 ...
- asp.net mvc控制器激活全分析
控制器的激活默认情况下使用反射来实现的,这其中采用了DI,单例等设计模式.对于控制器的主要涉及到如下的类:ControllerBuilder.DefaultControllerFactory.Defa ...