Author Archives: yangtingkun

Undo构造一致性读的例外情况

嘉年华听了恩墨学院的一个主题:《重现ORA-01555 细说Oracle 12c Undo数据管理》,吕老师介绍了UNDO的概念以及ORA-1555的产生,并介绍了12c以来Oracle的UNDO相关的新特性。 其中介绍了Oracle如何使用UNDO来实现多版本一致性读,使用了OPEN CURSOR的方式非常巧妙地在很少量数据的情况下构造出可重现的案例。不过这个案例存在一点小的瑕疵,因为如果一不小心,很可能会导致结果与预期不符,这是因为这里有一个例外存在。 我们先来模拟一下UNDO构造一致性读的情况,对于Oracle而言,默认的隔离级别是READ COMMIT,也就是说一个会话只能看到其他会话已经提交的修改,未提交的修改或者在当前会话查询发起之后提交的修改都是不可见的。 再介绍一下OPEN CURSOR,Oracle中当一个游标被打开,其结果集就已经确定了,也就是说这个游标会根据OPEN CURSOR这个时间点对应的SCN来构造一致性查询。但是OPEN CURSOR时,对应的SQL并不会被执行,在后续FETCH的时候(对于SQLPLUS而言PRINT命令会触发FETCH),SQL才真正被执行。使用这种办法可以模拟一个大的查询,OPEN CURSOR相当于大的查询的开始时间,其早于其他会话的修改提交时间,而FETCH的时间相当于大查询读取到这条记录的时间,而该时间晚于其他会话提交的时间:   SQL> SET SQLP ‘SQL1> ‘ SQL1> CREATE TABLE T_UNDO (ID NUMBER, NAME VARCHAR2(30));   Table created.   SQL1> INSERT INTO T_UNDO SELECT ROWNUM, OBJECT_NAME FROM DBA_OBJECTS; … Continue reading

Posted in ORACLE | Tagged , , | Leave a comment

全局事务锁等待分析

某客户数据库出现了严重的性能问题,导致应用出现大范围超时以及会话激增等问题,多次尝试kill session都无法彻底解决问题,重启后系统恢复正常。 拿到故障时刻的AWR报告,可以发现问题时刻,数据库的主要等待为:Global transaction acquire instance locks和enq: TX – row lock contention。   Event Waits Time(s) Avg wait (ms) % DB time Wait Class Global transaction acquire instance locks 5,342 5,343 1000 74.09 Configuration enq: TX – row lock contention … Continue reading

Posted in ORACLE | Tagged , , | Leave a comment

利用分析函数改写范围判断自关联查询

最近碰到一个单条SQL运行效率不佳导致数据库整体运行负载较高的问题。 分析、定位数据库的主要负载是这条语句引起的过程相对简单,通过AWR报告就可以比较容易的完成定位,这里就不赘述了。 现在直接看一下这个导致性能问题的SQL语句,其对应的SQL REPORT统计如下: Stat Name Statement Total Per Execution % Snap Total Elapsed Time (ms) 363,741 363,740.78 8 .42 CPU Time (ms) 362,770 362,770.00 8 .81 Executions 1     Buffer Gets 756 756.00 0.00 Disk Reads 0 0.00 … Continue reading

Posted in ORACLE | Tagged , | Leave a comment

UPDATE语句是否带有WHERE语句对更新重启动的影响

最近看到一个比较有意思的例子,是和更新重启动有关。 更新重启动是Oracle中一个隐藏的知识点,当Oracle在读取数据时,会构造读一致性,当读取的内容发生了修改,Oracle会通过UNDO信息来还原数据的前镜像,把数据还原到查询发生的时刻,通过构造一致性的结果来实现读取数据的一致性和隔离性。 Oracle实现的读一致性也被称为多版本读一致性,每个会话都会构造自己的一致性查询版本。但是对于写操作而言,这种方式是不可能的,因为最终的数据只有一份,如要要修改数据,就只能修改唯一的这份数据,所以对读操作,访问的是一致性版本,而对于写操作,修改的永远是当前版本。 既然写操作只能修改当前版本,当写操作执行的过程中,发现要修改的记录发生了变化,破坏了更新发起时刻的一致性,这时就触发了更新重启动,也就是说更新操作会放弃之前的修改,然后重新发起一次新的更新操作。 ITPUB上有一个有意思的案例,展示的就是更新重启动现象,链接如下:http://www.itpub.net/forum.php?mod=viewthread&tid=2102897 这里来重现一下更新重启动,建立一张简单测试用表,在会话一插入初始数据并进行更新操作: SQL> SET SQLP ‘SQL1> ‘ SQL1> CREATE TABLE T_UPDATE (ID NUMBER); Table created. SQL1> INSERT INTO T_UPDATE SELECT ROWNUM FROM DUAL CONNECT BY LEVEL < 4; 3 rows created. SQL1> COMMIT; Commit complete. SQL1> … Continue reading

Posted in ORACLE | Tagged , , | Leave a comment

SQL解决刑侦推理问题

前些天看到一个朋友在朋友圈里面贴了个图,上面是2018年刑侦科推理试题,看了一下题目,这些题目都是彼此依赖,很难找到一个题目作为入手点可以进一步分析,因此可能需要用纸笔配合大量的假设和试错才能继续完成。 原题如下:     不过这种问题其实是SQL擅长的领域,于是一时手痒,写了一个SQL语句: SQL> WITH T AS   2  (SELECT ASCII(‘A’) R FROM DUAL   3  UNION ALL   4  SELECT ASCII(‘B’) FROM DUAL   5  UNION ALL   6  SELECT ASCII(‘C’) FROM DUAL   7  UNION ALL   … Continue reading

Posted in ORACLE | Tagged , , | Leave a comment

20180517 Oracle Code Singapore

接到Oracle的邀请参加了2018年5月17日在新加坡举办的Oracle Code会议。我的演讲主题是How to write an efficient SQL。 开发相关的技术变化非常之快,甚至让人有应接不暇的感觉,不过开发技术中也有少量技术一直历久弥新,SQL就是之一,自诞生以来40多年一直发挥着重要的作用。 调查显示,SQL是目前第二大编程语言,有50%的开发者都在使用SQL。虽然使用非常广泛,但是SQL的质量水平却并不令人满意。           根据经验80%的数据库问题是由于SQL引起的,而80%的SQL问题来自于20%的SQL语句,在一些高并发高负载的系统中,由于一条SQL的性能问题导致数据库整体出现异常的情况屡见不鲜,这也是我本次选择这个主题的原因,希望帮助更多的开发人员可以书写出高效的SQL语句。                     本次主题包括四方面的内容:合理的使用新特性;数据集整体处理;设计SQL执行计划;严格过滤数据。                     合理的使用新特性,可以避免重复访问数据,合并简化执行操作过程,缓存中执行间结果,减少自关联,高效灵活的处理一些复杂问题。因此,充分理解新特性的功能以及其适用场景,是书写高效SQL语句的基础。                    SQL本身是描述性语言,大部分情况下使用SQL的时候并不需要特别关注每行数据如何去处理,将数据整理处理作为思路,会发现SQL的性能会更好,而且很多时候SQL的写法也会更加简洁。             好的性能是设计出来的,因此如果想写出高效的SQL语句,要从一开始就考虑好这个SQL的执行计划,驱动表是谁,采用何种JOIN方式连接到被驱动表。设计思路是一方面,另一方面是保证执行计划符合设计思路,这时候就需要用到提示的功能。熟悉提示的功能,可以更好的控制SQL的执行路径,绕过bug或性能问题,强制SQL按照设计思路去执行。             过滤不必要的数据对于提升SQL的性能非常重要,对于一个计算10000以内质数的SQL,未经优化前需要1分12秒的执行时间,消耗17万逻辑读。       … Continue reading

Posted in NEWS | Tagged , | Leave a comment

非空字段空值的产生

上一篇讨论了非空字段中如果存在空值对于查询的影响,这里描述一下导致问题的原因。 非空字段空值对查询的影响:http://yangtingkun.net/?p=1481 书接上文,其实CBO的判断本身是没有问题的,问题在于,为什么一个空值会存在非空约束的字段中。 重新看一下问题: SQL> select * from t_def; ID NAME TYPE ———- —————————— ——– 1 a SQL> select * from t_def where type is null; no rows selected SQL> select * from t_def where type is not null; ID … Continue reading

Posted in BUG, ORACLE | Tagged , , | Leave a comment

非空字段空值对查询的影响

BLOG有三年没有更新了,其实这篇文档也是三年前写的,不过当时没有贴出来,今天看到有人问起,于是分享出来。 这是客户数据库中碰到的一个有意思的问题。 数据库版本为11.2.0.3,客户的DSG同步软件在同步某张表时出现了错误,报错无非插入空值ORA-1400,本来这是一个很简单的问题,但是诊断发现问题比较有意思: SQL> select * from t_def; ID NAME TYPE ———- —————————— ——– 1 a SQL> select * from t_def where type is null; no rows selected SQL> select * from t_def where type is not null; ID NAME … Continue reading

Posted in BUG, ORACLE | Tagged , , , | 2 Comments

20130725 上海OOW第四日

今天终于有空听了一下技术主题。 展台的奖品已经基本上发完了,而且今天是最后一天,人相对少一些,因此上午抽出一些时间去听了一个技术的专题。 这个主题主要介绍了12c性能方面的特性。开篇Oracle先介绍了在各个场景下TPCC的记录都是Oracle保持的,并展示了那张引来无数关注的TPMC测试结果:SUN平台性能超过HP平台的7倍。 主题中的另一个亮点是介绍了Oracle自己用来承载邮件、日历、联系人、聊天、文档以及网络会议的Oracle集群,由9台X2-2组成,一共2376核,2PB数据量,7T内层和48T闪存。这个应该是实际上最大的Oracle集群部署在奥斯汀,通过DG技术将备用环境部署在犹他数据中心。这个环境中充分利用了Oracle各种软件功能:RAC、Streams、Active Data Guard、Secure Backup、RMAN、Flashback Database、ASM、Partition等。数据库利用SecureFiles的压缩功能节省了2倍的空间。 最后终于介绍了12c中一些与性能有关的特性:内存中并行执行、自适应执行计划、通过WITH将PL/SQL内嵌到SQL中、内存中的全局临时表、内存中的LOB查询和更新、并行加载和移动LOB、基于内存队列的快速审计、自动数据优化、高级压缩等。

Posted in NEWS | Tagged , , | Leave a comment

20130724 上海OOW第三日

又在OOW的展览大厅打了一回酱油,和Jackie Han、Kamus一起介绍ACE Program。 今天上午本打算一早去听技术的专题,没想到有客户数据库出现了异常,远端诊断和分析用了不少时间,到了OOW现场时,KeyNotes已经结束了。又赶上公司的展台事情比较多,因此一直在展台帮忙。 OOW的午饭从1点开始,而我们的专题从1:20开始,怕吃饭的人多来不及,于是打算等专题结束后再去,没有想到后来提问的人还很多,专题一直持续到了2点以后。跑到楼上发现午饭也结束了。 公司的展台仍然是络绎不绝,连Oracle数据库研发的老大Andy都来到了我们的展台,可惜当时正在给一个咨询问题的朋友讲解12c的架构,完全没有注意到。知道最后看到Eygle的微博才发现,也算是后知后觉了。我们的12c架构图非常受欢迎,从北京带来的近900张图,在今天下午就已经发送一空了。看来明天上午已经没啥礼品可送了。 晚上Oracle的答谢晚宴,感觉和旧金山的金银岛音乐节异曲同工,都是我很不感冒的。转了一圈就闪人了。

Posted in NEWS | Tagged , , | Leave a comment