ITPub博客

首页 > 数据库 > Oracle > 使用索引优化StopKey

使用索引优化StopKey

原创 Oracle 作者:壹頁書 时间:2014-06-16 23:43:55 0 删除 编辑
今天遇到一个调优的问题。
模拟的表结构如下:
  1. create table test
  2. (
  3.  id int primary key,
  4.  name varchar2(10),
  5.  createtime date
  6. );

  7. insert into test select rownum,rownum,sysdate-rownum from dual connect by level<100000;
目标数据库是Oracle。
查询的SQL不算复杂,就是查询一个表最后创建的几条记录。
  1. SELECT *
  2. FROM (
  3.     SELECT A.*, ROWNUM AS RN
  4.     FROM (
  5.         SELECT *
  6.         FROM test
  7.         ORDER BY createtime DESC
  8.     ) A
  9.     WHERE ROWNUM <= 20
  10. )
  11. WHERE RN >= 10
我先看了一下执行计划,发现走的是全表扫描。

我感觉在CreateTime字段上创建一个索引,就应该可以了,可实际上不行。


执行计划没有变。

索引列设置为非空 就可以解决这个问题了。

设置CreateTime字段为非空,并且分析模式。

查看执行计划,已经走索引了。


---分割线

这个问题在MySQL里面,就容易处理了。因为MySQL的索引包括空值。
但是通过简单的创建索引,还是不能达到优化的效果。

通过JAVA程序初始化数据,然后创建索引,查看执行计划

可以看到,单纯的创建一个索引是没有效果的。
可以使用延迟关联的方式
  1. select a.* from
  2. test a
  3. inner join
  4. (
  5.     select id from test order by createtime desc limit 10,10
  6. ) b
  7. on(a.id=b.id)
  8. order by a.createtime desc;
执行计划如下:

可以看到已经应用了索引,达到了优化的目的。

总之,Oracle的索引列尽量设置为非空,会省不少心。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1184340/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: Redis持久化
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339948