这个原因很简单:

SELECT * FROM(SELECT T.*,ROWNUM RN FROM(

SELECT * FROM INFO ORDER BY PDATE DESC

) T WHERE ROWNUM<2001) WHERE RN>0

算一下,如果使用定义在PDATE上的索引,那么拿到这2000个rowid后,还需要做2000次random io去读取这2000条记录。 -- 实在不如直接读出所有记录来做排序,成本还小的多。

改为:

SELECT B.id, B.created, T.RN FROM

big_table B

join

(SELECT created,ROWNUM RN FROM (SELECT created FROM big_table ORDER BY created DESC) WHERE ROWNUM<2000) T

on B.created=T.created

WHERE RN>0;

则会使用定义在PDATE上的索引来取最大的2000个PDATE,无需 排序。

下面的实验是 用了我自己建的表,10w条数据。没看出效果。。。,不过第一个select需要排序,第二个不需要。

SQL> SELECT * FROM

2 (SELECT T.*,ROWNUM RN FROM (SELECT id,created FROM big_table ORDER BY created DESC) T WHERE ROWNUM<2000)

3 WHERE RN>0 and rownum>1;

Plan hash value: 2610743403

| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |

| 0 | SELECT STATEMENT | | 1999 | 69965 | | 881 (2)| 00:00:11 |

| 1 | COUNT | | | | | | |

|* 2 | FILTER | | | | | | |

|* 3 | VIEW | | 1999 | 69965 | | 881 (2)| 00:00:11 |

|* 4 | COUNT STOPKEY | | | | | | |

| 5 | VIEW | | 98883 | 2124K| | 881 (2)| 00:00:11 |

|* 6 | SORT ORDER BY STOPKEY| | 98883 | 1255K| 2336K| 881 (2)| 00:00:11 |

| 7 | TABLE ACCESS FULL | BIG_TABLE | 98883 | 1255K| | 406 (1)| 00:00:05 |

Predicate Information (identified by operation id):

2 - filter(ROWNUM>1)

3 - filter("RN">0)

4 - filter(ROWNUM<2000)

6 - filter(ROWNUM<2000)

1 recursive calls

0 db block gets

1488 consistent gets

0 physical reads

0 redo size

471 bytes sent via SQL*Net to client

512 bytes received via SQL*Net from client

1 SQL*Net roundtrips to/from client

1 sorts (memory)

0 sorts (disk)

0 rows processed

SQL> SELECT B.*, T.RN FROM

2 big_table B

3 join

4 (SELECT created,ROWNUM RN FROM (SELECT created FROM big_table ORDER BY created DESC) WHERE ROWNUM<2000) T

5 on B.created=T.created

6 WHERE RN>0 and rownum>1;

Plan hash value: 1806601054

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

| 0 | SELECT STATEMENT | | 364K| 42M| 678 (2)| 00:00:09 |

| 1 | COUNT | | | | | |

|* 2 | FILTER | | | | | |

|* 3 | HASH JOIN | | 364K| 42M| 678 (2)| 00:00:09 |

|* 4 | VIEW | | 1999 | 41979 | 268 (1)| 00:00:04 |

|* 5 | COUNT STOPKEY | | | | | |

| 6 | VIEW | | 98883 | 772K| 268 (1)| 00:00:04 |

| 7 | INDEX FULL SCAN DESCENDING| INX | 98883 | 772K| 268 (1)| 00:00:04 |

| 8 | TABLE ACCESS FULL | BIG_TABLE | 98883 | 9849K| 407 (1)| 00:00:05 |

Predicate Information (identified by operation id):

2 - filter(ROWNUM>1)

3 - access("B"."CREATED"="T"."CREATED")

4 - filter("T"."RN">0)

5 - filter(ROWNUM<2000)

0 recursive calls

0 db block gets

1495 consistent gets

0 physical reads

0 redo size

1479 bytes sent via SQL*Net to client

512 bytes received via SQL*Net from client

1 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

0 rows processed

oracle查询排序速度慢,Oracle-请问Oracle SQL排序查询慢如何解决相关推荐

  1. mysql查询第二个字母为a_MSSQL_关于SQL Server查询语句的使用,一.查询第二个字母是t或者a的 - phpStudy...

    关于SQL Server查询语句的使用 一.查询第二个字母是t或者a的雇员的全部信息 select * from employees where firstname like '_[t,a]%' 注意 ...

  2. sql联合查询网页java,求帮助,这个SQL联合查询如何写~

    求帮助,这个SQL联合查询怎么写~~~~~~~~~~~~~ 本帖最后由 xzs7190966 于 2013-01-08 16:56:27 编辑 项目表 用户表 项目表里的第2,3,4列里的id都是对应 ...

  3. 关联查询取更新时间_数据分析之sql复杂查询

    关键记忆点: 1.[关联子查询] 理解:用于每组组内比较时 应用场景:分组取每组最大值.最小值 #理解:where处的条件为两个表分别是同一组时,筛选满足2表与1表的比较条件,所以group by 可 ...

  4. c mysql数据库函数库查询_Mysql数据库使用concat函数执行SQL注入查询

    SQL注入语句有时候会使用替换查询技术,就是让原有的查询语句查不到结果出错,而让自己构造的查询语句执行,并把执行结果代替原有查询语句查询结果显示出来. 例如:原本查询语句是 select userna ...

  5. 表中查询重复的数据,如何通过sql语句查询?

    1.最直观的思路:要知道所有名字有重复人资料,首先必须知道哪个名字重复了: select name from emp group by name having count(*)>1 所有名字重复 ...

  6. php执行sql内存溢出_SQL Server 2017:SQL排序,溢出,内存和自适应内存授予反馈

    php执行sql内存溢出 This article explores SQL Sort, Spill, Memory and Adaptive Memory Grant Feedback mechan ...

  7. 《数据库原理》实验六 SQL数据查询实验

    本系列传送门: 实验二 SQL Server SSMS工具创建和管理数据库及数据表 实验三 SQL Server SSMS工具添加数据 实验四 SQL的数据定义语句 实验五 数据库完整性约束的实现与验 ...

  8. 工业实时数据库的SQL异步查询

    SQL异步查询 紫金桥跨平台实时数据库提供了对关系型数据库的异步查询机制,防止当发生查询数据量过大或关系库所在主机网络故障等需要较长时间才能返回结果的情况时,引起的DB.VIEW和WEB客户端进程阻塞 ...

  9. Sql Server查询性能优化之走出索引的误区

    据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...

最新文章

  1. socket通信函数的深入分析
  2. 年薪50万美金的工程师到底牛在哪里?
  3. 包含多个段的程序---汇编学习笔记
  4. php运算符的特殊用法
  5. 在移动了用户数据时Android平台的路径设置
  6. python 示例_带有示例的Python File read()方法
  7. java控制单元测试_java – 当单元测试控制器时,模拟一个Spring Validator
  8. 在SpringBoot项目中,自定义注解+拦截器优雅的实现敏感数据的加解密!
  9. 程序猿的键盘侠养成:macOS 常用快捷键分享
  10. DIV块中 元素垂直居中
  11. 知识图谱中的结构信息建模
  12. 刘海洋《LaTex入门》学习笔记3
  13. Android使用adb截屏
  14. 《数据挖掘》读书笔记2、3章节
  15. java socket ascii_TCP套接字上的ASCII - java
  16. Mac端口5000被ControlCe占用问题解决方法
  17. .net实现微信公众账号接口开发
  18. 5.5.1 jmeter组件-取样器-HTTP请求
  19. 午夜之后的暗杀者 维基解密又公布CIA的两个Windows恶意软件框架 主要用于监控及执行命令...
  20. 装修公司网站源码模板电脑、手机端、微信三合一Asp.net

热门文章

  1. 获取文件夹下的文件名并存入txt中
  2. java json注解_返回json用什么注解
  3. basemap安装_【我是解决安装问题系列_1】Mac python basemap安装
  4. 电脑所有程序里有不一样颜色_12个好玩的电脑屏保,让你成为别人眼中最靓的仔。...
  5. 嵌入式C中,全局变量滥用的后果竟如此严重?
  6. C语言中#if,#if defined ,#ifdef,extern的用法描述
  7. 关于n对角矩阵数据结构_机器学习与线性代数 - 特殊矩阵
  8. 西门子伺服电机选型手册_记,新入行维修电工大胆拆解伺服电机和编码器的经历...
  9. 东芝硬盘插入台式机后滴滴响
  10. 工业交换机的价格为什么有高低之分?