栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么Oracle会忽略ORDER BY的索引?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么Oracle会忽略ORDER BY的索引?

您的FIRST_NAME列很有可能为空。

SQL> create table customer (first_name varchar2(20), last_name varchar2(20));Table created.SQL> insert into customer select dbms_random.string('U', 20), dbms_random.string('U', 20) from dual connect by level <= 100000;100000 rows created.SQL> create index c on customer(first_name);Index created.SQL> explain plan for select * from (  2    select  FIRST_NAME, ROW_NUMBER() over (order by FIRST_NAME) RN  3    from CUSTOMER C  4  )  5  where RN between 1 and 20  6  order by RN;Explained.SQL> @explain ""Plan hash value: 1474094583----------------------------------------------------------------------------------------------| Id  | Operation      | Name     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |----------------------------------------------------------------------------------------------|   0 | SELECt STATEMENT          |          |   117K|  2856K|       |  1592   (1)| 00:00:20 ||   1 |  SORT ORDER BY |          |   117K|  2856K|  4152K|  1592   (1)| 00:00:20 ||*  2 |   VIEW         |          |   117K|  2856K|       |   744   (2)| 00:00:09 ||*  3 |    WINDOW SORT PUSHED RANK|          |   117K|  1371K|  2304K|   744   (2)| 00:00:09 ||   4 |     TABLE ACCESS FULL     | CUSTOMER |   117K|  1371K|       |   205   (1)| 00:00:03 |----------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   2 - filter("RN">=1 AND "RN"<=20)   3 - filter(ROW_NUMBER() OVER ( ORDER BY "FIRST_NAME")<=20)Note-----   - dynamic sampling used for this statement (level=2)21 rows selected.SQL> alter table customer modify first_name not null;Table altered.SQL> explain plan for select * from (  2    select  FIRST_NAME, ROW_NUMBER() over (order by FIRST_NAME) RN  3    from CUSTOMER C  4  )  5  where RN between 1 and 20  6  order by RN;Explained.SQL> @explain ""Plan hash value: 1725028138----------------------------------------------------------------------------------------| Id  | Operation    | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |----------------------------------------------------------------------------------------|   0 | SELECt STATEMENT        |      |   117K|  2856K|       |   850   (1)| 00:00:11 ||   1 |  SORT ORDER BY          |      |   117K|  2856K|  4152K|   850   (1)| 00:00:11 ||*  2 |   VIEW       |      |   117K|  2856K|       |     2   (0)| 00:00:01 ||*  3 |    WINDOW NOSORT STOPKEY|      |   117K|  1371K|       |     2   (0)| 00:00:01 ||   4 |     INDEX FULL SCAN     | C    |   117K|  1371K|       |     2   (0)| 00:00:01 |----------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   2 - filter("RN">=1 AND "RN"<=20)   3 - filter(ROW_NUMBER() OVER ( ORDER BY "FIRST_NAME")<=20)Note-----   - dynamic sampling used for this statement (level=2)21 rows selected.SQL>

在其中添加一个NOT NULL来解决它。

SQL> explain plan for select * from (  2    select  FIRST_NAME, ROW_NUMBER() over (order by FIRST_NAME) RN  3    from CUSTOMER C  4    where first_name is not null  5  )  6  where RN between 1 and 20  7  order by RN;Explained.SQL> @explain ""Plan hash value: 1725028138----------------------------------------------------------------------------------------| Id  | Operation    | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |----------------------------------------------------------------------------------------|   0 | SELECT STATEMENT        |      |   117K|  2856K|       |   850   (1)| 00:00:11 ||   1 |  SORT ORDER BY          |      |   117K|  2856K|  4152K|   850   (1)| 00:00:11 ||*  2 |   VIEW       |      |   117K|  2856K|       |     2   (0)| 00:00:01 ||*  3 |    WINDOW NOSORT STOPKEY|      |   117K|  1371K|       |     2   (0)| 00:00:01 ||*  4 |     INDEX FULL SCAN     | C    |   117K|  1371K|       |     2   (0)| 00:00:01 |----------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   2 - filter("RN">=1 AND "RN"<=20)   3 - filter(ROW_NUMBER() OVER ( ORDER BY "FIRST_NAME")<=20)   4 - filter("FIRST_NAME" IS NOT NULL)Note-----   - dynamic sampling used for this statement (level=2)22 rows selected.SQL>


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/456185.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号