愿你出走半生,归来仍是少年

Kratos
专注于用户阅读体验的响应式博客主题
  1. 首页
  2. Oracle
  3. 正文

Selectivity-索引的可选择性

2019年12月26日 5718点热度 0人点赞 2条评论

同事反应这个查询“较慢”,并且没有走索引:
select * from pl_georoute where STATEFLAG = 0 and ROUTE_TYPE = '9102';

经分析,这是一个400万的表:
select count(*) from pl_georoute;
4473003

以上查询结果集达到50万:
select count(*) from pl_georoute where STATEFLAG = 0 and ROUTE_TYPE = '9102';
508381

于是想到了,根据oracle对于SQL执行计划基于成本的优化原则,这么大的结果集,相对于400万的表来讲,索引不如全表扫描快。
之所以反应慢,估计是结果太大,加上网络传输等其他环节,因此在应用看来“较慢”。

以下做验证。

对于相对较大的结果集,尽管建立了相应的索引,但是oracle可以“任性的无视”。
SQLPLUS> explain plan for select * from pl_georoute where STATEFLAG = 0 and ROUTE_TYPE = '9102';
Explained.
SQLPLUS> select * from table(dbms_xplan.display);
---------------------------------------------------------------------------------
| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |             |   472K|   195M| 55636   (1)| 00:11:08 |
|*  1 |  TABLE ACCESS FULL| PL_GEOROUTE |   472K|   195M| 55636   (1)| 00:11:08 |
---------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("ROUTE_TYPE"=U'9102' AND "STATEFLAG"=0)

而对于可选择性【selectivity】较好的查询,oracle会乖乖的重视这个索引。
SQLPLUS> explain plan for select * from pl_georoute where STATEFLAG = 0 and ROUTE_TYPE = '9101';
Explained.
SQLPLUS> select * from table(dbms_xplan.display);
--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |   788 |   334K|    96   (0)| 00:00:02 |
|   1 |  TABLE ACCESS BY INDEX ROWID| PL_GEOROUTE  |   788 |   334K|    96   (0)| 00:00:02 |
|*  2 |   INDEX RANGE SCAN          | R175_UNION_1 |   903 |       |     5   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("ROUTE_TYPE"=U'9101' AND "STATEFLAG"=0)
标签: 暂无
最后更新:2019年12月26日

liking

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

  • liking

    select * from pl_georoute where STATEFLAG = 0 and ROUTE_TYPE = '9101';
    no rows selected
    第二个查询条件结果。

    2019年12月26日
    回复
  • liking

    关于filter和access的解读:
    以上两个查询SQL语句的predicate谓词条件有区别,一个是9102,一个是9101
    filter("ROUTE_TYPE"=U'9102' AND "STATEFLAG"=0)
    access("ROUTE_TYPE"=U'9101' AND "STATEFLAG"=0)
    filter是指:没有合适的访问路径,全表扫了,谓词条件只是起到了filter过滤作用;
    access是指:找到合适的访问路径,走索引了,谓词条件起到了直接access读取作用。

    2019年12月27日
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    归档

    • 2026 年 6 月
    • 2026 年 3 月
    • 2026 年 2 月
    • 2025 年 12 月
    • 2025 年 11 月
    • 2025 年 4 月
    • 2025 年 2 月
    • 2025 年 1 月
    • 2024 年 12 月
    • 2024 年 10 月
    • 2024 年 7 月
    • 2024 年 5 月
    • 2024 年 4 月
    • 2023 年 11 月
    • 2023 年 10 月
    • 2023 年 8 月
    • 2023 年 7 月
    • 2023 年 5 月
    • 2023 年 3 月
    • 2023 年 2 月
    • 2022 年 12 月
    • 2022 年 11 月
    • 2022 年 10 月
    • 2022 年 9 月
    • 2022 年 8 月
    • 2022 年 6 月
    • 2022 年 5 月
    • 2022 年 3 月
    • 2022 年 2 月
    • 2022 年 1 月
    • 2021 年 12 月
    • 2021 年 11 月
    • 2021 年 10 月
    • 2021 年 8 月
    • 2021 年 7 月
    • 2021 年 6 月
    • 2021 年 5 月
    • 2021 年 4 月
    • 2021 年 3 月
    • 2021 年 2 月
    • 2021 年 1 月
    • 2020 年 12 月
    • 2020 年 11 月
    • 2020 年 10 月
    • 2020 年 9 月
    • 2020 年 8 月
    • 2020 年 7 月
    • 2020 年 6 月
    • 2020 年 5 月
    • 2020 年 3 月
    • 2020 年 2 月
    • 2019 年 12 月
    • 2019 年 11 月
    • 2019 年 10 月
    • 2019 年 9 月
    • 2019 年 8 月
    • 2019 年 7 月
    • 2019 年 6 月
    • 2019 年 5 月
    • 2019 年 4 月
    • 2019 年 2 月
    • 2018 年 12 月
    • 2018 年 11 月
    • 2018 年 8 月
    • 2018 年 7 月
    • 2018 年 6 月
    • 2018 年 5 月
    • 2018 年 4 月
    • 2018 年 3 月
    • 2018 年 2 月
    • 2018 年 1 月
    • 2017 年 12 月
    • 2017 年 11 月
    • 2017 年 8 月
    • 2017 年 6 月
    • 2017 年 5 月
    • 2017 年 3 月
    • 2016 年 9 月
    • 2016 年 8 月
    • 2016 年 7 月
    • 2016 年 6 月
    • 2016 年 5 月
    • 2015 年 10 月
    • 2014 年 10 月
    • 2014 年 8 月
    • 2014 年 3 月
    • 2013 年 12 月
    • 2013 年 8 月
    • 2013 年 7 月
    • 2013 年 6 月
    • 2013 年 4 月
    • 2012 年 11 月
    • 2012 年 7 月
    • 2012 年 6 月
    • 2012 年 5 月
    • 2012 年 2 月
    • 2011 年 10 月
    • 2011 年 8 月
    • 2011 年 3 月
    • 2010 年 11 月
    • 2010 年 10 月
    • 2010 年 9 月
    • 2010 年 8 月
    • 2010 年 7 月
    • 2010 年 5 月
    • 2010 年 4 月
    • 2010 年 1 月
    • 2009 年 11 月
    • 2009 年 8 月
    • 2009 年 5 月
    • 2009 年 3 月
    • 2009 年 2 月
    • 2008 年 11 月
    • 2008 年 10 月
    • 2008 年 8 月
    • 2008 年 4 月
    • 2007 年 4 月

    分类

    • BigData
    • kubernetes
    • linux
    • MongoDB
    • MySQL
    • Oracle
    • PostgreSQL
    • 备份恢复
    • 安装配置
    • 性能优化
    • 技术杂谈
    • 未分类
    • 梦回红楼
    • 测试
    • 生活点滴
    • 网站建设
    • 自制工具
    • 轻松一刻
    • 运维知识
    • 问题处理

    COPYRIGHT © 2026 愿你出走半生,归来仍是少年. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang