数值转换导致不走索引
2016-11-29 11:28
169 查看
一. 问题描述:
表的数据量1300万+ 搜索列为50-80w每次都全表扫描,性能很差
SQL> set autotrace on SQL> select count(*) from clspuser.crf_p2p_interest_split_rslt t where t.hb_status=1; COUNT(*) ---------- 782889 Execution Plan ---------------------------------------------------------- Plan hash value: 553503729 -------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 2 | 45953 (3)| 00:09:12 | | 1 | SORT AGGREGATE | | 1 | 2 | | | |* 2 | TABLE ACCESS FULL| CRF_P2P_INTEREST_SPLIT_RSLT | 1751K| 3421K| 45953 (3)| 00:09:12 | -------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(TO_NUMBER("T"."HB_STATUS")=1) Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 207148 consistent gets 190464 physical reads 84076 redo size 517 bytes sent via SQL*Net to client 469 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed SQL>由以上执行计划可见过滤列进行了函数转换
2 - filter(TO_NUMBER("T"."HB_STATUS")=1)
这说明本列数字类型为字符型,而查询默认是数字类型
SQL> set linesize 100 SQL> desc clspuser.crf_p2p_interest_split_rslt Name Null? Type ----------------------------------------------------- -------- ------------------------------------ HB_STATUS CHAR(1) SQL>
二 . 解决方法:
建立索引:SQL> create index SPLIT_RSLT_HB_STATUS_IDX ON clspuser.crf_p2p_interest_split_rslt (HB_STATUS) ONLINE;
Index created.
SQL>
更改查询语句:
SQL> select count(*) from clspuser.crf_p2p_interest_split_rslt t where t.hb_status='1'; COUNT(*) ---------- 46674 Execution Plan ---------------------------------------------------------- Plan hash value: 3563200806 -------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 2 | 584 (19)| 00:00:08 | | 1 | SORT AGGREGATE | | 1 | 2 | | | |* 2 | INDEX FAST FULL SCAN| SPLIT_RSLT_HB_STATUS_IDX | 484K| 945K| 584 (19)| 00:00:08 | -------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("T"."HB_STATUS"='1') Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 1768 consistent gets 131 physical reads 0 redo size 517 bytes sent via SQL*Net to client 469 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed SQL>
相关文章推荐
- 类型转换导致执行计划不走索引测试案例
- Oracle直方图导致SQL不走索引.
- 不走空间索引及B树索引转换为bitmap索引问题-解决
- 数据类型不一致导致的SQL不走索引
- 如何优化因将B-tree索引转换成位图索引(BITMAP CONVERSION )而导致SQL执行很慢
- 类型转换导致运行计划不走索引測试案例
- 由于mysql隐式类型转换导致的索引失效的问题
- mysql优化,导致查询不走索引的原因总结
- 11g 搜集直方图导致不走索引
- 隐式转换导致索引失效
- oracle sql调优的经历(隐士转换导致索引失效)
- 绑定变量导致执行计划不走索引
- SQL中一些不经意隐式类型转换或者函数使用导致索引失效问题
- 隐式类型转换导致的索引实效
- 数据类型不一致导致的SQL不走索引
- Mysql优化,导致查询不走索引的原因总结
- 避免在sql的where中对字段进行转换(函数转换/操作符转换/隐式转换)------索引会失效从而导致慢查询
- 列定义允许null,可能导致Index Hint提升不走索引
- Oracle查询隐式类型转换不走索引
- 列定义允许null,可能导致Index Hint提升不走索引