月归档:2014 年六月

让“select min(xxx),max(xxx) from xxx”走索引

首先,做一个测试表: 在extent_id列上创建非唯一索引: 下面的语句没有走索引: 手工指定IDX_LUNAR_EXTENT_ID时,也不走索引: 指定该列为非空时,可以走索引(Oracle的索引不保存空值): 可以看到,无论是否使用hint都走索引了: 再次验证,依然这个结果: LUNAR@lunar>alter table lunar modify extent_id null; Table altered. Elapsed: 00:00:00.01 单独查询最小值或者最大值时,也可以走索引,采用“INDEX FULL SCAN (MIN/MAX)”: 假设,在不能修改表结构的情况下,怎么才能让“select min(extent_id),max(extent_id) from lunar”走索引呢? 参考了网上的一些建议,改写sql如下:

发表在 Performence Tuning | 标签为 | 留下评论

使用coe脚本固定执行计划和手工指定profile的outline的方式有什么区别?

测试目的: 1,假设下面的两个语句分别为A语句和B语句: A语句: select count(*) from lunar where extent_id=1; B语句: select /*+ FULL(lunar) */ count(*) from lunar where extent_id=1; 2,使用coe的脚本(在SQLT中可以知道整套coe脚本)手工为A语句指定B语句的执行计划,看看什么效果 (即,让原本正常走索引的A语句使用全表扫描的B语句的执行计划) 3,使用dbms_sqltune.import_sql_profile为A语句指定执行计划,看看什么效果 首先,做一个测试表: 在extent_id列上创建非唯一索引: 可以看到下面的语句正确的使用了索引(把这条语句称之为A语句): 我使用hint指定该语句必须走全表扫描,姑且把这条语句称为B语句: 找到A语句和B语句的sql_id: 使用coe的脚本来固定执行计划,291688323是B语句的执行计划: 根据提示执行COE_XFR_SQL_PROFILE_fvrmp2a2t38dc_291688323.sql脚本: 再次查询,验证一下A语句是否已经按照我们指定的那样采用了B语句的全表扫描的执行计划: 结论:我们的猜测是错误的,使用coe的脚本固定执行计划,必须是从该sql_id的已经有的所有执行计划中挑选其一,而不能凭空指定一个你认为合适的。 下面,我们使用其他方法固定SQL的执行计划。首先找出B语句的执行计划和outline: 使用下面的脚本为A语句指定B语句的outline: 结论: 1,使用coe的脚本固定执行计划,必须是从该sql_id的已经有的所有执行计划中挑选其一,而不能凭空指定一个你认为合适的。 因此,如果需要从某条sql已经执行过的执行计划中挑选一个合适的,那么coe的脚本简单轻巧,非常合适。 2,如果要手工构造一个该SQL语句从未使用的执行计划,可以采用dbms_sqltune.import_sql_profile的方式手工设置outline,从而改变执行计划。 在这种需求下,coe的脚本是无能为力的。

发表在 Performence Tuning | 标签为 , , | 5 条评论

打赌结果——12.1.0.2.0曾经可以这样

今天跟深圳小兄弟打赌,内容不详述了,结果如下,当事人和当时围观的人自然清楚,不清楚的我也不便解释了,O(∩_∩)O哈哈~ 其实这个测试我本来不用做的,因为飞总早在几个月前已经测试过了,但是兄弟不相信,我不得不再弄一次,O(∩_∩)O哈哈~ 先看下当前环境,注意,这里的信息都足以证明是一个非exadata环境…… 下面我们来测试in-memory option功能(注意版本): 猜猜,谁赢了,O(∩_∩)O哈哈~

发表在 ORACLE 12C | 标签为 , | 留下评论

DUL第二篇——使用DUL抽取dmp文件内容

dul常用命令: DUL> unload database ; DUL> unload user ; DUL> unload table ; DUL> scan database; DUL> scan tables; 记录一下测试表的记录数目: 其余的配置参数,参考第一篇DUL 第一篇 —— DUL是什么? 启动DUL,然后直接执行unpump header,之后就可以抽取了: 这里我们看到17634 行记录全部抽取出来了,如果你想测试的更好玩,可以dd掉其中的一部分数据,然后测试看dul怎么工作。 然后直接导入数据,就这么简单,O(∩_∩)O哈哈~ 这里我们看到全部的17634 行数据都导入表中了。

发表在 DUL ODU | 标签为 , | 2 条评论

DUL 第一篇 —— DUL是什么?

最近打算陆续研究一些DUL的东西,这个在互联网上已经有太多了,我本人用的不多,主要是确实很多时候用不上(运维做得好,这些其实都几乎用不上……) 不过这些东西涉及了很多对于Oracle的运行机制和原理的理解,玩玩还是很有意思的 :) DUL是Oracle Internal工具,专供Oracle Support使用,请勿自行在工作环境操作,否则后果自负!! 第一篇 DUL是什么?

发表在 DUL ODU | 标签为 | 留下评论