ITPub博客

首页 > Linux操作系统 > Linux操作系统 > "or" and "( )" make execution plan difference

"or" and "( )" make execution plan difference

原创 Linux操作系统 作者:txt1124 时间:2010-09-10 10:59:01 0 删除 编辑

    test_c as 1160 rows.It has a columan called "STRDHHM".a function index is created in the column "STRDHHM".The statment is like that:
    create index IND_AUTO_CUSTOMERJUDGE_1 on TEST_C (LTRIM(STRDHHM,'0')) tablespace USERS;
    The distinct LTRIM(STRDHHM,'0') values is 1130.And test_c has been analyzed.
    when I use this query statement,It goes "table access full" or "BITMAP CONVERSION":
_____________________________________________________
    EXPLAIN PLAN FOR
SELECT *
  from test_c c
 where (LTRIM(STRDHHM,'0') = LTRIM('18999912345', '0') AND type = '1')
    OR
       ((LTRIM(STRDHHM,'0')=substr(LTRIM('18999912345', '0'), 1, 3)) AND type = '2')
   and (sysdate - dtjudgedate) * 1440 <= inthmdlimit
   and inthmdflag = 1;
SELECT * from TABLE(dbms_xplan.display) 
________________________________________________________
Plan hash value: 1554345677
 
-------------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name                     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                          |     1 |    48 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS BY INDEX ROWID     | TEST_C                   |     1 |    48 |     3   (0)| 00:00:01 |
|   2 |   BITMAP CONVERSION TO ROWIDS    |                          |       |       |            |          |
|   3 |    BITMAP OR                     |                          |       |       |            |          |
|   4 |     BITMAP CONVERSION FROM ROWIDS|                          |       |       |            |          |
|*  5 |      INDEX RANGE SCAN            | IND_AUTO_CUSTOMERJUDGE_1 |       |       |     1   (0)| 00:00:01 |
|   6 |     BITMAP CONVERSION FROM ROWIDS|                          |       |       |            |          |
|*  7 |      INDEX RANGE SCAN            | IND_AUTO_CUSTOMERJUDGE_1 |       |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter("TYPE"='1' AND LTRIM("STRDHHM",'0')='18999912345' OR "INTHMDFLAG"=1 AND "TYPE"='2' AND
              LTRIM("STRDHHM",'0')='189' AND "INTHMDLIMIT">=(SYSDATE@!-"DTJUDGEDATE")*1440)
   5 - access(LTRIM("STRDHHM",'0')='18999912345')
   7 - access(LTRIM("STRDHHM",'0')='189')
   _________________________________________________________
    when I carry () in  the both size of "or" statement,It goes "INLIST ITERATOR" what is I want:
   _______________________________________________________
EXPLAIN PLAN FOR
SELECT COUNT(*)
  from test_c c
 where ((LTRIM(STRDHHM,'0') = LTRIM('18999912345', '0') AND type = '1')
    OR
       ((LTRIM(STRDHHM,'0')=substr(LTRIM('18999912345', '0'), 1, 3)) AND type = '2'))
   and (sysdate - dtjudgedate) * 1440 <= inthmdlimit
   and inthmdflag = 1;
SELECT * from TABLE(dbms_xplan.display)
_________________________________________________
Plan hash value: 2951030008
 
----------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name                     | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                          |     1 |    48 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE               |                          |     1 |    48 |            |          |
|   2 |   INLIST ITERATOR             |                          |       |       |            |          |
|*  3 |    TABLE ACCESS BY INDEX ROWID| TEST_C                   |     1 |    48 |     3   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN          | IND_AUTO_CUSTOMERJUDGE_1 |     2 |       |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - filter("INTHMDFLAG"=1 AND ("TYPE"='1' AND LTRIM("STRDHHM",'0')='18999912345' OR "TYPE"='2'
              AND LTRIM("STRDHHM",'0')='189') AND "INTHMDLIMIT">=(SYSDATE@!-"DTJUDGEDATE")*1440)
   4 - access(LTRIM("STRDHHM",'0')='18999912345' OR LTRIM("STRDHHM",'0')='189')
   

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

下一篇: 1Z0-042记录(三)
请登录后发表评论 登录
全部评论

注册时间:2008-12-15

  • 博文量
    91
  • 访问量
    162487