楼主: paulyibinyi

请教in和exists的区别

[复制链接]
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
21#
发表于 2008-4-14 13:42 | 只看该作者
10053trace看看

使用道具 举报

回复
论坛徽章:
19
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:06:13BLOG每日发帖之星
日期:2010-03-28 01:01:02ITPUB9周年纪念徽章
日期:2010-10-08 09:31:222012新春纪念徽章
日期:2012-01-04 11:51:22
22#
发表于 2008-4-14 13:44 | 只看该作者
Unnesting of Nested Subqueries Subqueries are nested when they appear in the WHERE clause of the parent statement. When Oracle Database evaluates a statement with a nested subquery, it must evaluate the subquery portion multiple times and may overlook some efficient access paths or joins.

Subquery unnesting unnests and merges the body of the subquery into the body of the statement that contains it, allowing the optimizer to consider them together when evaluating access paths and joins. The optimizer can unnest most subqueries, with some exceptions. Those exceptions include hierarchical subqueries and subqueries that contain a ROWNUM pseudocolumn, one of the set operators, a nested aggregate function, or a correlated reference to a query block that is not the immediate outer query block of the subquery.

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
23#
发表于 2008-4-14 13:48 | 只看该作者
原帖由 shiri512003 于 2008-4-14 13:44 发表
Unnesting of Nested Subqueries Subqueries are nested when they appear in the WHERE clause of the parent statement. When Oracle Database evaluates a statement with a nested subquery, it must evaluate the subquery portion multiple times and may overlook some efficient access paths or joins.

Subquery unnesting unnests and merges the body of the subquery into the body of the statement that contains it, allowing the optimizer to consider them together when evaluating access paths and joins. The optimizer can unnest most subqueries, with some exceptions. Those exceptions include hierarchical subqueries and subqueries that contain a ROWNUM pseudocolumn, one of the set operators, a nested aggregate function, or a correlated reference to a query block that is not the immediate outer query block of the subquery.

实际上CBO并非“must evaluate the subquery portion multiple times and may overlook some efficient access paths or joins”

使用道具 举报

回复
论坛徽章:
25
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010世博会纪念徽章
日期:2010-07-30 12:07:232011新春纪念徽章
日期:2011-02-18 11:43:332010广州亚运会纪念徽章:高尔夫球
日期:2011-04-11 18:22:37蜘蛛蛋
日期:2011-08-17 08:44:40ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15复活蛋
日期:2011-12-15 09:06:552012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202013年新春福章
日期:2013-02-25 14:51:24
24#
发表于 2008-4-14 14:00 | 只看该作者
select id, role_id, login
from tb_user e
where Exists (
select id from (Select
ID
From tb_role f
Connect By Prior Id = parent_id Start With Id = 2)
where id=e.role_id
)这个效果应该是和in 一样的

使用道具 举报

回复
论坛徽章:
19
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:06:13BLOG每日发帖之星
日期:2010-03-28 01:01:02ITPUB9周年纪念徽章
日期:2010-10-08 09:31:222012新春纪念徽章
日期:2012-01-04 11:51:22
25#
发表于 2008-4-14 14:01 | 只看该作者
sql优化还要向老大学习;
这里想说的是当子查询包含层次化查询时,是不能unnest

Those exceptions include hierarchical subqueries and subqueries that contain a ROWNUM pseudocolumn, one of the set operators, a nested aggregate function, or a correlated reference to a query block that is not the immediate outer query block of the subquery.

使用道具 举报

回复
论坛徽章:
25
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010世博会纪念徽章
日期:2010-07-30 12:07:232011新春纪念徽章
日期:2011-02-18 11:43:332010广州亚运会纪念徽章:高尔夫球
日期:2011-04-11 18:22:37蜘蛛蛋
日期:2011-08-17 08:44:40ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15复活蛋
日期:2011-12-15 09:06:552012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202013年新春福章
日期:2013-02-25 14:51:24
26#
发表于 2008-4-14 14:01 | 只看该作者
SQL> select id, role_id, login
from tb_user e
where Exists (
select id from (Select
ID
From tb_role f
Connect By Prior Id = parent_id Start With Id = 1)
where id=e.role_id
)  2    3    4    5    6    7    8    9  
10  /

46918 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3832830349

--------------------------------------------------------------------------------
-----------

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

--------------------------------------------------------------------------------
-----------

|   0 | SELECT STATEMENT               |          | 46918 |  1970K|    61   (5)|
00:00:01 |

|*  1 |  HASH JOIN RIGHT SEMI          |          | 46918 |  1970K|    61   (5)|
00:00:01 |

|   2 |   VIEW                         |          |    40 |   520 |     3   (0)|
00:00:01 |

|*  3 |    CONNECT BY WITH FILTERING   |          |       |       |            |
          |

|   4 |     TABLE ACCESS BY INDEX ROWID| TB_ROLE  |       |       |            |
          |

|*  5 |      INDEX UNIQUE SCAN         | IND_ROLE |     1 |     2 |     0   (0)|
00:00:01 |

|*  6 |     HASH JOIN                  |          |       |       |            |
          |

|   7 |      CONNECT BY PUMP           |          |       |       |            |
          |

|   8 |      TABLE ACCESS FULL         | TB_ROLE  |    40 |   160 |     3   (0)|
00:00:01 |

|   9 |     TABLE ACCESS FULL          | TB_ROLE  |    40 |   160 |     3   (0)|
00:00:01 |

|  10 |   TABLE ACCESS FULL            | TB_USER  | 46918 |  1374K|    57   (4)|
00:00:01 |

--------------------------------------------------------------------------------
-----------

SQL> select id, role_id, login
from tb_user e
where role_id in (Select ID
From tb_role f
Connect By Prior Id = parent_id
Start With Id =1);   2    3    4    5    6  
/

46918 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 2919357639

--------------------------------------------------------------------------------
-----------

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

--------------------------------------------------------------------------------
-----------

|   0 | SELECT STATEMENT               |          | 46918 |  1970K|    61   (5)|
00:00:01 |

|*  1 |  HASH JOIN RIGHT SEMI          |          | 46918 |  1970K|    61   (5)|
00:00:01 |

|   2 |   VIEW                         | VW_NSO_1 |    40 |   520 |     3   (0)|
00:00:01 |

|*  3 |    CONNECT BY WITH FILTERING   |          |       |       |            |
          |

|   4 |     TABLE ACCESS BY INDEX ROWID| TB_ROLE  |       |       |            |
          |

|*  5 |      INDEX UNIQUE SCAN         | IND_ROLE |     1 |     2 |     0   (0)|
00:00:01 |

|*  6 |     HASH JOIN                  |          |       |       |            |
          |

|   7 |      CONNECT BY PUMP           |          |       |       |            |
          |

|   8 |      TABLE ACCESS FULL         | TB_ROLE  |    40 |   160 |     3   (0)|
00:00:01 |

|   9 |     TABLE ACCESS FULL          | TB_ROLE  |    40 |   160 |     3   (0)|
00:00:01 |

|  10 |   TABLE ACCESS FULL            | TB_USER  | 46918 |  1374K|    57   (4)|
00:00:01 |

--------------------------------------------------------------------------------
-----------

使用道具 举报

回复
论坛徽章:
76
双子座
日期:2015-07-28 14:26:072012新春纪念徽章
日期:2012-02-13 15:09:52ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15鲜花蛋
日期:2011-08-26 02:02:24管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:皮划艇
日期:2011-04-18 11:24:412011新春纪念徽章
日期:2011-02-18 11:43:342011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
27#
 楼主| 发表于 2008-4-14 14:03 | 只看该作者
原帖由 anlinew 于 2008-4-14 13:42 发表
10053trace看看

以下是10053内容
*** 2008-04-14 13:44:25.181
*** SESSION ID49.21214) 2008-04-14 13:44:25.068
QUERY
select id, role_id, login
from tb_user e
where Exists (Select
ID
From tb_role f
where e.role_id = f.id
Connect By Prior Id = parent_id
Start With Id = 1)
***************************************
PARAMETERS USED BY THE OPTIMIZER
********************************
OPTIMIZER_FEATURES_ENABLE = 9.2.0
OPTIMIZER_MODE/GOAL = Choose
_OPTIMIZER_PERCENT_PARALLEL = 101
HASH_AREA_SIZE = 10240000
HASH_JOIN_ENABLED = TRUE
HASH_MULTIBLOCK_IO_COUNT = 0
SORT_AREA_SIZE = 2048000
OPTIMIZER_SEARCH_LIMIT = 5
PARTITION_VIEW_ENABLED = FALSE
_ALWAYS_STAR_TRANSFORMATION = FALSE
_B_TREE_BITMAP_PLANS = TRUE
STAR_TRANSFORMATION_ENABLED = FALSE
_COMPLEX_VIEW_MERGING = TRUE
_PUSH_JOIN_PREDICATE = TRUE
PARALLEL_BROADCAST_ENABLED = TRUE
OPTIMIZER_MAX_PERMUTATIONS = 2000
OPTIMIZER_INDEX_CACHING = 0
_SYSTEM_INDEX_CACHING = 0
OPTIMIZER_INDEX_COST_ADJ = 100
OPTIMIZER_DYNAMIC_SAMPLING = 1
_OPTIMIZER_DYN_SMP_BLKS = 32
QUERY_REWRITE_ENABLED = FALSE
QUERY_REWRITE_INTEGRITY = ENFORCED
_INDEX_JOIN_ENABLED = TRUE
_SORT_ELIMINATION_COST_RATIO = 0
_OR_EXPAND_NVL_PREDICATE = TRUE
_NEW_INITIAL_JOIN_ORDERS = TRUE
ALWAYS_ANTI_JOIN = CHOOSE
ALWAYS_SEMI_JOIN = CHOOSE
_OPTIMIZER_MODE_FORCE = TRUE
_OPTIMIZER_UNDO_CHANGES = FALSE
_UNNEST_SUBQUERY = TRUE
_PUSH_JOIN_UNION_VIEW = TRUE
_FAST_FULL_SCAN_ENABLED = TRUE
_OPTIM_ENHANCE_NNULL_DETECTION = TRUE
_ORDERED_NESTED_LOOP = TRUE
_NESTED_LOOP_FUDGE = 100
_NO_OR_EXPANSION = FALSE
_QUERY_COST_REWRITE = TRUE
QUERY_REWRITE_EXPRESSION = TRUE
_IMPROVED_ROW_LENGTH_ENABLED = TRUE
_USE_NOSEGMENT_INDEXES = FALSE
_ENABLE_TYPE_DEP_SELECTIVITY = TRUE
_IMPROVED_OUTERJOIN_CARD = TRUE
_OPTIMIZER_ADJUST_FOR_NULLS = TRUE
_OPTIMIZER_CHOOSE_PERMUTATION = 0
_USE_COLUMN_STATS_FOR_FUNCTION = TRUE
_SUBQUERY_PRUNING_ENABLED = TRUE
_SUBQUERY_PRUNING_REDUCTION_FACTOR = 50
_SUBQUERY_PRUNING_COST_FACTOR = 20
_LIKE_WITH_BIND_AS_EQUALITY = FALSE
_TABLE_SCAN_COST_PLUS_ONE = TRUE
_SORTMERGE_INEQUALITY_JOIN_OFF = FALSE
_DEFAULT_NON_EQUALITY_SEL_CHECK = TRUE
_ONESIDE_COLSTAT_FOR_EQUIJOINS = TRUE
_OPTIMIZER_COST_MODEL = CHOOSE
_GSETS_ALWAYS_USE_TEMPTABLES = FALSE
DB_FILE_MULTIBLOCK_READ_COUNT = 64
_NEW_SORT_COST_ESTIMATE = TRUE
_GS_ANTI_SEMI_JOIN_ALLOWED = TRUE
_CPU_TO_IO = 0
_PRED_MOVE_AROUND = TRUE
***************************************
BASE STATISTICAL INFORMATION
***********************
Table stats    Table: tb_role   Alias:  F
  TOTAL ::  CDN: 8974  NBLKS:  88  AVG_ROW_LEN:  100
-- Index stats
  INDEX NAME: IDX_tb_role_NAME  COL#: 4
    TOTAL ::  LVLS: 1   #LB: 27  #DK: 8974  LB/K: 1  DB/K: 1  CLUF: 8071
  INDEX NAME: INX_tb_role_PARENT_ID  COL#: 2
    TOTAL ::  LVLS: 1   #LB: 19  #DK: 508  LB/K: 1  DB/K: 1  CLUF: 824
  INDEX NAME: PK_tb_role  COL#: 1
    TOTAL ::  LVLS: 1   #LB: 18  #DK: 8974  LB/K: 1  DB/K: 1  CLUF: 2192
_OPTIMIZER_PERCENT_PARALLEL = 0
***************************************
SINGLE TABLE ACCESS PATH
Column:         ID  Col#: 1      Table: tb_role   Alias:  F
    NDV: 8974      NULLS: 0         DENS: 1.1143e-04 LO:  1  HI: 13603
    NO HISTOGRAM: #BKT: 1 #VAL: 2
  TABLE: tb_role     ORIG CDN: 8974  ROUNDED CDN: 1  CMPTD CDN: 1
  Access path: tsc  Resc:  5  Resp:  5
  Access path: index (iff)
      Index: PK_tb_role
  TABLE: tb_role
      RSC_CPU: 0   RSC_IO: 2
  IX_SEL:  0.0000e+00  TB_SEL:  1.0000e+00
  Access path: iff  Resc:  2  Resp:  2
  Access path: index (unique)
      Index: PK_tb_role
  TABLE: tb_role
      RSC_CPU: 0   RSC_IO: 1
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (eq-unique)
      Index: PK_tb_role
  TABLE: tb_role
      RSC_CPU: 0   RSC_IO: 1
  IX_SEL:  0.0000e+00  TB_SEL:  0.0000e+00
One row CDN: 1
  BEST_CST: 1.00  PATH: 3  Degree:  1
***************************************
OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***********************
Join order[1]: tb_role [ F]
Best so far: TABLE#: 0  CST:          1  CDN:          1  BYTES:          5
Final:
  CST: 1  CDN: 1  RSC: 1  RSP: 1  BYTES: 5
  IO-RSC: 1  IO-RSP: 1  CPU-RSC: 0  CPU-RSP: 0
***************************************
PARAMETERS USED BY THE OPTIMIZER
********************************
OPTIMIZER_FEATURES_ENABLE = 9.2.0
OPTIMIZER_MODE/GOAL = Choose
_OPTIMIZER_PERCENT_PARALLEL = 101
HASH_AREA_SIZE = 10240000
HASH_JOIN_ENABLED = TRUE
HASH_MULTIBLOCK_IO_COUNT = 0
SORT_AREA_SIZE = 2048000
OPTIMIZER_SEARCH_LIMIT = 5
PARTITION_VIEW_ENABLED = FALSE
_ALWAYS_STAR_TRANSFORMATION = FALSE
_B_TREE_BITMAP_PLANS = TRUE
STAR_TRANSFORMATION_ENABLED = FALSE
_COMPLEX_VIEW_MERGING = TRUE
_PUSH_JOIN_PREDICATE = TRUE
PARALLEL_BROADCAST_ENABLED = TRUE
OPTIMIZER_MAX_PERMUTATIONS = 2000
OPTIMIZER_INDEX_CACHING = 0
_SYSTEM_INDEX_CACHING = 0
OPTIMIZER_INDEX_COST_ADJ = 100
OPTIMIZER_DYNAMIC_SAMPLING = 1
_OPTIMIZER_DYN_SMP_BLKS = 32
QUERY_REWRITE_ENABLED = FALSE
QUERY_REWRITE_INTEGRITY = ENFORCED
_INDEX_JOIN_ENABLED = TRUE
_SORT_ELIMINATION_COST_RATIO = 0
_OR_EXPAND_NVL_PREDICATE = TRUE
_NEW_INITIAL_JOIN_ORDERS = TRUE
ALWAYS_ANTI_JOIN = CHOOSE
ALWAYS_SEMI_JOIN = CHOOSE
_OPTIMIZER_MODE_FORCE = TRUE
_OPTIMIZER_UNDO_CHANGES = FALSE
_UNNEST_SUBQUERY = TRUE
_PUSH_JOIN_UNION_VIEW = TRUE
_FAST_FULL_SCAN_ENABLED = TRUE
_OPTIM_ENHANCE_NNULL_DETECTION = TRUE
_ORDERED_NESTED_LOOP = TRUE
_NESTED_LOOP_FUDGE = 100
_NO_OR_EXPANSION = FALSE
_QUERY_COST_REWRITE = TRUE
QUERY_REWRITE_EXPRESSION = TRUE
_IMPROVED_ROW_LENGTH_ENABLED = TRUE
_USE_NOSEGMENT_INDEXES = FALSE
_ENABLE_TYPE_DEP_SELECTIVITY = TRUE
_IMPROVED_OUTERJOIN_CARD = TRUE
_OPTIMIZER_ADJUST_FOR_NULLS = TRUE
_OPTIMIZER_CHOOSE_PERMUTATION = 0
_USE_COLUMN_STATS_FOR_FUNCTION = TRUE
_SUBQUERY_PRUNING_ENABLED = TRUE
_SUBQUERY_PRUNING_REDUCTION_FACTOR = 50
_SUBQUERY_PRUNING_COST_FACTOR = 20
_LIKE_WITH_BIND_AS_EQUALITY = FALSE
_TABLE_SCAN_COST_PLUS_ONE = TRUE
_SORTMERGE_INEQUALITY_JOIN_OFF = FALSE
_DEFAULT_NON_EQUALITY_SEL_CHECK = TRUE
_ONESIDE_COLSTAT_FOR_EQUIJOINS = TRUE
_OPTIMIZER_COST_MODEL = CHOOSE
_GSETS_ALWAYS_USE_TEMPTABLES = FALSE
DB_FILE_MULTIBLOCK_READ_COUNT = 64
_NEW_SORT_COST_ESTIMATE = TRUE
_GS_ANTI_SEMI_JOIN_ALLOWED = TRUE
_CPU_TO_IO = 0
_PRED_MOVE_AROUND = TRUE
***************************************
BASE STATISTICAL INFORMATION
***********************
Table stats    Table: tb_role   Alias:  F
  TOTAL ::  CDN: 8974  NBLKS:  88  AVG_ROW_LEN:  100
-- Index stats
  INDEX NAME: IDX_tb_role_NAME  COL#: 4
    TOTAL ::  LVLS: 1   #LB: 27  #DK: 8974  LB/K: 1  DB/K: 1  CLUF: 8071
  INDEX NAME: INX_tb_role_PARENT_ID  COL#: 2
    TOTAL ::  LVLS: 1   #LB: 19  #DK: 508  LB/K: 1  DB/K: 1  CLUF: 824
  INDEX NAME: PK_tb_role  COL#: 1
    TOTAL ::  LVLS: 1   #LB: 18  #DK: 8974  LB/K: 1  DB/K: 1  CLUF: 2192
_OPTIMIZER_PERCENT_PARALLEL = 0
***************************************
SINGLE TABLE ACCESS PATH
Column:  PARENT_ID  Col#: 2      Table: tb_role   Alias:  F
    NDV: 508       NULLS: 0         DENS: 1.9685e-03 LO:  0  HI: 3854
    NO HISTOGRAM: #BKT: 1 #VAL: 2
  TABLE: tb_role     ORIG CDN: 8974  ROUNDED CDN: 18  CMPTD CDN: 18
  Access path: tsc  Resc:  5  Resp:  5
  Access path: index (equal)
      Index: INX_tb_role_PARENT_ID
  TABLE: tb_role
      RSC_CPU: 0   RSC_IO: 3
  IX_SEL:  0.0000e+00  TB_SEL:  1.9685e-03
  BEST_CST: 3.00  PATH: 4  Degree:  1
***************************************
OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***********************
Join order[1]: tb_role [ F]
Best so far: TABLE#: 0  CST:          3  CDN:         18  BYTES:        162
Final:
  CST: 3  CDN: 18  RSC: 3  RSP: 3  BYTES: 162
  IO-RSC: 3  IO-RSP: 3  CPU-RSC: 0  CPU-RSP: 0
  First Rows Plan
***************************************
PARAMETERS USED BY THE OPTIMIZER
********************************
OPTIMIZER_FEATURES_ENABLE = 9.2.0
OPTIMIZER_MODE/GOAL = Choose
_OPTIMIZER_PERCENT_PARALLEL = 101
HASH_AREA_SIZE = 10240000
HASH_JOIN_ENABLED = TRUE
HASH_MULTIBLOCK_IO_COUNT = 0
SORT_AREA_SIZE = 2048000
OPTIMIZER_SEARCH_LIMIT = 5
PARTITION_VIEW_ENABLED = FALSE
_ALWAYS_STAR_TRANSFORMATION = FALSE
_B_TREE_BITMAP_PLANS = TRUE
STAR_TRANSFORMATION_ENABLED = FALSE
_COMPLEX_VIEW_MERGING = TRUE
_PUSH_JOIN_PREDICATE = TRUE
PARALLEL_BROADCAST_ENABLED = TRUE
OPTIMIZER_MAX_PERMUTATIONS = 2000
OPTIMIZER_INDEX_CACHING = 0
_SYSTEM_INDEX_CACHING = 0
OPTIMIZER_INDEX_COST_ADJ = 100
OPTIMIZER_DYNAMIC_SAMPLING = 1
_OPTIMIZER_DYN_SMP_BLKS = 32
QUERY_REWRITE_ENABLED = FALSE
QUERY_REWRITE_INTEGRITY = ENFORCED
_INDEX_JOIN_ENABLED = TRUE
_SORT_ELIMINATION_COST_RATIO = 0
_OR_EXPAND_NVL_PREDICATE = TRUE
_NEW_INITIAL_JOIN_ORDERS = TRUE
ALWAYS_ANTI_JOIN = CHOOSE
ALWAYS_SEMI_JOIN = CHOOSE
_OPTIMIZER_MODE_FORCE = TRUE
_OPTIMIZER_UNDO_CHANGES = FALSE
_UNNEST_SUBQUERY = TRUE
_PUSH_JOIN_UNION_VIEW = TRUE
_FAST_FULL_SCAN_ENABLED = TRUE
_OPTIM_ENHANCE_NNULL_DETECTION = TRUE
_ORDERED_NESTED_LOOP = TRUE
_NESTED_LOOP_FUDGE = 100
_NO_OR_EXPANSION = FALSE
_QUERY_COST_REWRITE = TRUE
QUERY_REWRITE_EXPRESSION = TRUE
_IMPROVED_ROW_LENGTH_ENABLED = TRUE
_USE_NOSEGMENT_INDEXES = FALSE
_ENABLE_TYPE_DEP_SELECTIVITY = TRUE
_IMPROVED_OUTERJOIN_CARD = TRUE
_OPTIMIZER_ADJUST_FOR_NULLS = TRUE
_OPTIMIZER_CHOOSE_PERMUTATION = 0
_USE_COLUMN_STATS_FOR_FUNCTION = TRUE
_SUBQUERY_PRUNING_ENABLED = TRUE
_SUBQUERY_PRUNING_REDUCTION_FACTOR = 50
_SUBQUERY_PRUNING_COST_FACTOR = 20
_LIKE_WITH_BIND_AS_EQUALITY = FALSE
_TABLE_SCAN_COST_PLUS_ONE = TRUE
_SORTMERGE_INEQUALITY_JOIN_OFF = FALSE
_DEFAULT_NON_EQUALITY_SEL_CHECK = TRUE
_ONESIDE_COLSTAT_FOR_EQUIJOINS = TRUE
_OPTIMIZER_COST_MODEL = CHOOSE
_GSETS_ALWAYS_USE_TEMPTABLES = FALSE
DB_FILE_MULTIBLOCK_READ_COUNT = 64
_NEW_SORT_COST_ESTIMATE = TRUE
_GS_ANTI_SEMI_JOIN_ALLOWED = TRUE
_CPU_TO_IO = 0
_PRED_MOVE_AROUND = TRUE
***************************************
BASE STATISTICAL INFORMATION
***********************
Table stats    Table: tb_user   Alias: SYS_ALIAS_1
  TOTAL ::  CDN: 8556  NBLKS:  180  AVG_ROW_LEN:  100
-- Index stats
  INDEX NAME: FKINDEX1_21  COL#: 2
    TOTAL ::  LVLS: 1   #LB: 19  #DK: 8367  LB/K: 1  DB/K: 1  CLUF: 2534
  INDEX NAME: FKINDEX2_27  COL#: 4
    TOTAL ::  LVLS: 1   #LB: 27  #DK: 8556  LB/K: 1  DB/K: 1  CLUF: 8322
  INDEX NAME: IDX_tb_user_LOGIN_UID  COL#: 27
    TOTAL ::  LVLS: 1   #LB: 8  #DK: 102  LB/K: 1  DB/K: 2  CLUF: 207
  INDEX NAME: PK_tb_user  COL#: 1
    TOTAL ::  LVLS: 1   #LB: 17  #DK: 8556  LB/K: 1  DB/K: 1  CLUF: 2451
_OPTIMIZER_PERCENT_PARALLEL = 0
***************************************
SINGLE TABLE ACCESS PATH
  TABLE: tb_user     ORIG CDN: 8556  ROUNDED CDN: 428  CMPTD CDN: 428
  Access path: tsc  Resc:  8  Resp:  8
  Access path: index (no sta/stp keys)
      Index: FKINDEX1_21
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 20
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (no sta/stp keys)
      Index: FKINDEX2_27
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 28
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (no sta/stp keys)
      Index: PK_tb_user
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 18
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (no sta/stp keys)
      Index: PK_tb_user
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 18
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (no sta/stp keys)
      Index: FKINDEX1_21
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 20
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (no sta/stp keys)
      Index: FKINDEX2_27
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 28
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
******** Cost index join ********
Ix HA Join
  Outer table:
    resc: 22  cdn: 8556  rcz: 14  deg: 1  resp: 22
  Inner table: <no name>
    resc: 25  cdn: 8556  rcz: 15  deg:  1  resp: 25
    using join:8 distribution:2 #groups:1
  Hash join one ptn Resc: 3   Deg: 1
      hash_area:  250 (max=12500)  buildfrag:  28                probefrag:   29 ppasses:    1
  Hash join   Resc: 50   Resp: 50
Ix HA Join
  Outer table:
    resc: 22  cdn: 8556  rcz: 29  deg: 1  resp: 22
  Inner table: <no name>
    resc: 35  cdn: 8556  rcz: 23  deg:  1  resp: 35
    using join:8 distribution:2 #groups:1
  Hash join one ptn Resc: 4   Deg: 1
      hash_area:  250 (max=12500)  buildfrag:  43                probefrag:   37 ppasses:    1
  Hash join   Resc: 62   Resp: 62
******** Index join cost ********
Cost: 113  
  BEST_CST: 8.00  PATH: 2  Degree:  1
***************************************
OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***********************
Join order[1]: tb_user [SYS_ALIAS_1]
Best so far: TABLE#: 0  CST:          8  CDN:        428  BYTES:       9416
Final:
  CST: 8  CDN: 428  RSC: 8  RSP: 8  BYTES: 9416
  IO-RSC: 8  IO-RSP: 8  CPU-RSC: 0  CPU-RSP: 0
*** 2008-04-14 13:56:04.414
*** SESSION ID49.21214) 2008-04-14 13:56:04.414
QUERY
DELETE FROM PLAN_TABLE WHERE STATEMENT_ID=:1
QUERY
EXPLAIN PLAN SET STATEMENT_ID='PLUS371091' FOR select id, role_id, login
from tb_user e
where Exists (Select
ID
From tb_role f
where e.role_id = f.id
Connect By Prior Id = parent_id
Start With Id = 1)
***************************************
PARAMETERS USED BY THE OPTIMIZER
********************************
OPTIMIZER_FEATURES_ENABLE = 9.2.0
OPTIMIZER_MODE/GOAL = Choose
_OPTIMIZER_PERCENT_PARALLEL = 101
HASH_AREA_SIZE = 10240000
HASH_JOIN_ENABLED = TRUE
HASH_MULTIBLOCK_IO_COUNT = 0
SORT_AREA_SIZE = 2048000
OPTIMIZER_SEARCH_LIMIT = 5
PARTITION_VIEW_ENABLED = FALSE
_ALWAYS_STAR_TRANSFORMATION = FALSE
_B_TREE_BITMAP_PLANS = TRUE
STAR_TRANSFORMATION_ENABLED = FALSE
_COMPLEX_VIEW_MERGING = TRUE
_PUSH_JOIN_PREDICATE = TRUE
PARALLEL_BROADCAST_ENABLED = TRUE
OPTIMIZER_MAX_PERMUTATIONS = 2000
OPTIMIZER_INDEX_CACHING = 0
_SYSTEM_INDEX_CACHING = 0
OPTIMIZER_INDEX_COST_ADJ = 100
OPTIMIZER_DYNAMIC_SAMPLING = 1
_OPTIMIZER_DYN_SMP_BLKS = 32
QUERY_REWRITE_ENABLED = FALSE
QUERY_REWRITE_INTEGRITY = ENFORCED
_INDEX_JOIN_ENABLED = TRUE
_SORT_ELIMINATION_COST_RATIO = 0
_OR_EXPAND_NVL_PREDICATE = TRUE
_NEW_INITIAL_JOIN_ORDERS = TRUE
ALWAYS_ANTI_JOIN = CHOOSE
ALWAYS_SEMI_JOIN = CHOOSE
_OPTIMIZER_MODE_FORCE = TRUE
_OPTIMIZER_UNDO_CHANGES = FALSE
_UNNEST_SUBQUERY = TRUE
_PUSH_JOIN_UNION_VIEW = TRUE
_FAST_FULL_SCAN_ENABLED = TRUE
_OPTIM_ENHANCE_NNULL_DETECTION = TRUE
_ORDERED_NESTED_LOOP = TRUE
_NESTED_LOOP_FUDGE = 100
_NO_OR_EXPANSION = FALSE
_QUERY_COST_REWRITE = TRUE
QUERY_REWRITE_EXPRESSION = TRUE
_IMPROVED_ROW_LENGTH_ENABLED = TRUE
_USE_NOSEGMENT_INDEXES = FALSE
_ENABLE_TYPE_DEP_SELECTIVITY = TRUE
_IMPROVED_OUTERJOIN_CARD = TRUE
_OPTIMIZER_ADJUST_FOR_NULLS = TRUE
_OPTIMIZER_CHOOSE_PERMUTATION = 0
_USE_COLUMN_STATS_FOR_FUNCTION = TRUE
_SUBQUERY_PRUNING_ENABLED = TRUE
_SUBQUERY_PRUNING_REDUCTION_FACTOR = 50
_SUBQUERY_PRUNING_COST_FACTOR = 20
_LIKE_WITH_BIND_AS_EQUALITY = FALSE
_TABLE_SCAN_COST_PLUS_ONE = TRUE
_SORTMERGE_INEQUALITY_JOIN_OFF = FALSE
_DEFAULT_NON_EQUALITY_SEL_CHECK = TRUE
_ONESIDE_COLSTAT_FOR_EQUIJOINS = TRUE
_OPTIMIZER_COST_MODEL = CHOOSE
_GSETS_ALWAYS_USE_TEMPTABLES = FALSE
DB_FILE_MULTIBLOCK_READ_COUNT = 64
_NEW_SORT_COST_ESTIMATE = TRUE
_GS_ANTI_SEMI_JOIN_ALLOWED = TRUE
_CPU_TO_IO = 0
_PRED_MOVE_AROUND = TRUE
***************************************
BASE STATISTICAL INFORMATION
***********************
Table stats    Table: tb_role   Alias:  F
  TOTAL ::  CDN: 8974  NBLKS:  88  AVG_ROW_LEN:  100
-- Index stats
  INDEX NAME: IDX_tb_role_NAME  COL#: 4
    TOTAL ::  LVLS: 1   #LB: 27  #DK: 8974  LB/K: 1  DB/K: 1  CLUF: 8071
  INDEX NAME: INX_tb_role_PARENT_ID  COL#: 2
    TOTAL ::  LVLS: 1   #LB: 19  #DK: 508  LB/K: 1  DB/K: 1  CLUF: 824
  INDEX NAME: PK_tb_role  COL#: 1
    TOTAL ::  LVLS: 1   #LB: 18  #DK: 8974  LB/K: 1  DB/K: 1  CLUF: 2192
_OPTIMIZER_PERCENT_PARALLEL = 0
***************************************
SINGLE TABLE ACCESS PATH
Column:         ID  Col#: 1      Table: tb_role   Alias:  F
    NDV: 8974      NULLS: 0         DENS: 1.1143e-04 LO:  1  HI: 13603
    NO HISTOGRAM: #BKT: 1 #VAL: 2
  TABLE: tb_role     ORIG CDN: 8974  ROUNDED CDN: 1  CMPTD CDN: 1
  Access path: tsc  Resc:  5  Resp:  5
  Access path: index (iff)
      Index: PK_tb_role
  TABLE: tb_role
      RSC_CPU: 0   RSC_IO: 2
  IX_SEL:  0.0000e+00  TB_SEL:  1.0000e+00
  Access path: iff  Resc:  2  Resp:  2
  Access path: index (unique)
      Index: PK_tb_role
  TABLE: tb_role
      RSC_CPU: 0   RSC_IO: 1
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (eq-unique)
      Index: PK_tb_role
  TABLE: tb_role
      RSC_CPU: 0   RSC_IO: 1
  IX_SEL:  0.0000e+00  TB_SEL:  0.0000e+00
One row CDN: 1
  BEST_CST: 1.00  PATH: 3  Degree:  1
***************************************
OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***********************
Join order[1]: tb_role [ F]
Best so far: TABLE#: 0  CST:          1  CDN:          1  BYTES:          5
Final:
  CST: 1  CDN: 1  RSC: 1  RSP: 1  BYTES: 5
  IO-RSC: 1  IO-RSP: 1  CPU-RSC: 0  CPU-RSP: 0
***************************************
PARAMETERS USED BY THE OPTIMIZER
********************************
OPTIMIZER_FEATURES_ENABLE = 9.2.0
OPTIMIZER_MODE/GOAL = Choose
_OPTIMIZER_PERCENT_PARALLEL = 101
HASH_AREA_SIZE = 10240000
HASH_JOIN_ENABLED = TRUE
HASH_MULTIBLOCK_IO_COUNT = 0
SORT_AREA_SIZE = 2048000
OPTIMIZER_SEARCH_LIMIT = 5
PARTITION_VIEW_ENABLED = FALSE
_ALWAYS_STAR_TRANSFORMATION = FALSE
_B_TREE_BITMAP_PLANS = TRUE
STAR_TRANSFORMATION_ENABLED = FALSE
_COMPLEX_VIEW_MERGING = TRUE
_PUSH_JOIN_PREDICATE = TRUE
PARALLEL_BROADCAST_ENABLED = TRUE
OPTIMIZER_MAX_PERMUTATIONS = 2000
OPTIMIZER_INDEX_CACHING = 0
_SYSTEM_INDEX_CACHING = 0
OPTIMIZER_INDEX_COST_ADJ = 100
OPTIMIZER_DYNAMIC_SAMPLING = 1
_OPTIMIZER_DYN_SMP_BLKS = 32
QUERY_REWRITE_ENABLED = FALSE
QUERY_REWRITE_INTEGRITY = ENFORCED
_INDEX_JOIN_ENABLED = TRUE
_SORT_ELIMINATION_COST_RATIO = 0
_OR_EXPAND_NVL_PREDICATE = TRUE
_NEW_INITIAL_JOIN_ORDERS = TRUE
ALWAYS_ANTI_JOIN = CHOOSE
ALWAYS_SEMI_JOIN = CHOOSE
_OPTIMIZER_MODE_FORCE = TRUE
_OPTIMIZER_UNDO_CHANGES = FALSE
_UNNEST_SUBQUERY = TRUE
_PUSH_JOIN_UNION_VIEW = TRUE
_FAST_FULL_SCAN_ENABLED = TRUE
_OPTIM_ENHANCE_NNULL_DETECTION = TRUE
_ORDERED_NESTED_LOOP = TRUE
_NESTED_LOOP_FUDGE = 100
_NO_OR_EXPANSION = FALSE
_QUERY_COST_REWRITE = TRUE
QUERY_REWRITE_EXPRESSION = TRUE
_IMPROVED_ROW_LENGTH_ENABLED = TRUE
_USE_NOSEGMENT_INDEXES = FALSE
_ENABLE_TYPE_DEP_SELECTIVITY = TRUE
_IMPROVED_OUTERJOIN_CARD = TRUE
_OPTIMIZER_ADJUST_FOR_NULLS = TRUE
_OPTIMIZER_CHOOSE_PERMUTATION = 0
_USE_COLUMN_STATS_FOR_FUNCTION = TRUE
_SUBQUERY_PRUNING_ENABLED = TRUE
_SUBQUERY_PRUNING_REDUCTION_FACTOR = 50
_SUBQUERY_PRUNING_COST_FACTOR = 20
_LIKE_WITH_BIND_AS_EQUALITY = FALSE
_TABLE_SCAN_COST_PLUS_ONE = TRUE
_SORTMERGE_INEQUALITY_JOIN_OFF = FALSE
_DEFAULT_NON_EQUALITY_SEL_CHECK = TRUE
_ONESIDE_COLSTAT_FOR_EQUIJOINS = TRUE
_OPTIMIZER_COST_MODEL = CHOOSE
_GSETS_ALWAYS_USE_TEMPTABLES = FALSE
DB_FILE_MULTIBLOCK_READ_COUNT = 64
_NEW_SORT_COST_ESTIMATE = TRUE
_GS_ANTI_SEMI_JOIN_ALLOWED = TRUE
_CPU_TO_IO = 0
_PRED_MOVE_AROUND = TRUE
***************************************
BASE STATISTICAL INFORMATION
***********************
Table stats    Table: tb_role   Alias:  F
  TOTAL ::  CDN: 8974  NBLKS:  88  AVG_ROW_LEN:  100
-- Index stats
  INDEX NAME: IDX_tb_role_NAME  COL#: 4
    TOTAL ::  LVLS: 1   #LB: 27  #DK: 8974  LB/K: 1  DB/K: 1  CLUF: 8071
  INDEX NAME: INX_tb_role_PARENT_ID  COL#: 2
    TOTAL ::  LVLS: 1   #LB: 19  #DK: 508  LB/K: 1  DB/K: 1  CLUF: 824
  INDEX NAME: PK_tb_role  COL#: 1
    TOTAL ::  LVLS: 1   #LB: 18  #DK: 8974  LB/K: 1  DB/K: 1  CLUF: 2192
_OPTIMIZER_PERCENT_PARALLEL = 0
***************************************
SINGLE TABLE ACCESS PATH
Column:  PARENT_ID  Col#: 2      Table: tb_role   Alias:  F
    NDV: 508       NULLS: 0         DENS: 1.9685e-03 LO:  0  HI: 3854
    NO HISTOGRAM: #BKT: 1 #VAL: 2
  TABLE: tb_role     ORIG CDN: 8974  ROUNDED CDN: 18  CMPTD CDN: 18
  Access path: tsc  Resc:  5  Resp:  5
  Access path: index (equal)
      Index: INX_tb_role_PARENT_ID
  TABLE: tb_role
      RSC_CPU: 0   RSC_IO: 3
  IX_SEL:  0.0000e+00  TB_SEL:  1.9685e-03
  BEST_CST: 3.00  PATH: 4  Degree:  1
***************************************
OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***********************
Join order[1]: tb_role [ F]
Best so far: TABLE#: 0  CST:          3  CDN:         18  BYTES:        162
Final:
  CST: 3  CDN: 18  RSC: 3  RSP: 3  BYTES: 162
  IO-RSC: 3  IO-RSP: 3  CPU-RSC: 0  CPU-RSP: 0
  First Rows Plan
***************************************
PARAMETERS USED BY THE OPTIMIZER
********************************
OPTIMIZER_FEATURES_ENABLE = 9.2.0
OPTIMIZER_MODE/GOAL = Choose
_OPTIMIZER_PERCENT_PARALLEL = 101
HASH_AREA_SIZE = 10240000
HASH_JOIN_ENABLED = TRUE
HASH_MULTIBLOCK_IO_COUNT = 0
SORT_AREA_SIZE = 2048000
OPTIMIZER_SEARCH_LIMIT = 5
PARTITION_VIEW_ENABLED = FALSE
_ALWAYS_STAR_TRANSFORMATION = FALSE
_B_TREE_BITMAP_PLANS = TRUE
STAR_TRANSFORMATION_ENABLED = FALSE
_COMPLEX_VIEW_MERGING = TRUE
_PUSH_JOIN_PREDICATE = TRUE
PARALLEL_BROADCAST_ENABLED = TRUE
OPTIMIZER_MAX_PERMUTATIONS = 2000
OPTIMIZER_INDEX_CACHING = 0
_SYSTEM_INDEX_CACHING = 0
OPTIMIZER_INDEX_COST_ADJ = 100
OPTIMIZER_DYNAMIC_SAMPLING = 1
_OPTIMIZER_DYN_SMP_BLKS = 32
QUERY_REWRITE_ENABLED = FALSE
QUERY_REWRITE_INTEGRITY = ENFORCED
_INDEX_JOIN_ENABLED = TRUE
_SORT_ELIMINATION_COST_RATIO = 0
_OR_EXPAND_NVL_PREDICATE = TRUE
_NEW_INITIAL_JOIN_ORDERS = TRUE
ALWAYS_ANTI_JOIN = CHOOSE
ALWAYS_SEMI_JOIN = CHOOSE
_OPTIMIZER_MODE_FORCE = TRUE
_OPTIMIZER_UNDO_CHANGES = FALSE
_UNNEST_SUBQUERY = TRUE
_PUSH_JOIN_UNION_VIEW = TRUE
_FAST_FULL_SCAN_ENABLED = TRUE
_OPTIM_ENHANCE_NNULL_DETECTION = TRUE
_ORDERED_NESTED_LOOP = TRUE
_NESTED_LOOP_FUDGE = 100
_NO_OR_EXPANSION = FALSE
_QUERY_COST_REWRITE = TRUE
QUERY_REWRITE_EXPRESSION = TRUE
_IMPROVED_ROW_LENGTH_ENABLED = TRUE
_USE_NOSEGMENT_INDEXES = FALSE
_ENABLE_TYPE_DEP_SELECTIVITY = TRUE
_IMPROVED_OUTERJOIN_CARD = TRUE
_OPTIMIZER_ADJUST_FOR_NULLS = TRUE
_OPTIMIZER_CHOOSE_PERMUTATION = 0
_USE_COLUMN_STATS_FOR_FUNCTION = TRUE
_SUBQUERY_PRUNING_ENABLED = TRUE
_SUBQUERY_PRUNING_REDUCTION_FACTOR = 50
_SUBQUERY_PRUNING_COST_FACTOR = 20
_LIKE_WITH_BIND_AS_EQUALITY = FALSE
_TABLE_SCAN_COST_PLUS_ONE = TRUE
_SORTMERGE_INEQUALITY_JOIN_OFF = FALSE
_DEFAULT_NON_EQUALITY_SEL_CHECK = TRUE
_ONESIDE_COLSTAT_FOR_EQUIJOINS = TRUE
_OPTIMIZER_COST_MODEL = CHOOSE
_GSETS_ALWAYS_USE_TEMPTABLES = FALSE
DB_FILE_MULTIBLOCK_READ_COUNT = 64
_NEW_SORT_COST_ESTIMATE = TRUE
_GS_ANTI_SEMI_JOIN_ALLOWED = TRUE
_CPU_TO_IO = 0
_PRED_MOVE_AROUND = TRUE
***************************************
BASE STATISTICAL INFORMATION
***********************
Table stats    Table: tb_user   Alias: SYS_ALIAS_1
  TOTAL ::  CDN: 8556  NBLKS:  180  AVG_ROW_LEN:  100
-- Index stats
  INDEX NAME: FKINDEX1_21  COL#: 2
    TOTAL ::  LVLS: 1   #LB: 19  #DK: 8367  LB/K: 1  DB/K: 1  CLUF: 2534
  INDEX NAME: FKINDEX2_27  COL#: 4
    TOTAL ::  LVLS: 1   #LB: 27  #DK: 8556  LB/K: 1  DB/K: 1  CLUF: 8322
  INDEX NAME: IDX_tb_user_LOGIN_UID  COL#: 27
    TOTAL ::  LVLS: 1   #LB: 8  #DK: 102  LB/K: 1  DB/K: 2  CLUF: 207
  INDEX NAME: PK_tb_user  COL#: 1
    TOTAL ::  LVLS: 1   #LB: 17  #DK: 8556  LB/K: 1  DB/K: 1  CLUF: 2451
_OPTIMIZER_PERCENT_PARALLEL = 0
***************************************
SINGLE TABLE ACCESS PATH
  TABLE: tb_user     ORIG CDN: 8556  ROUNDED CDN: 428  CMPTD CDN: 428
  Access path: tsc  Resc:  8  Resp:  8
  Access path: index (no sta/stp keys)
      Index: FKINDEX1_21
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 20
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (no sta/stp keys)
      Index: FKINDEX2_27
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 28
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (no sta/stp keys)
      Index: PK_tb_user
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 18
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (no sta/stp keys)
      Index: PK_tb_user
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 18
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (no sta/stp keys)
      Index: FKINDEX1_21
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 20
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
  Access path: index (no sta/stp keys)
      Index: FKINDEX2_27
  TABLE: tb_user
      RSC_CPU: 0   RSC_IO: 28
  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00
******** Cost index join ********
Ix HA Join
  Outer table:
    resc: 22  cdn: 8556  rcz: 14  deg: 1  resp: 22
  Inner table: <no name>
    resc: 25  cdn: 8556  rcz: 15  deg:  1  resp: 25
    using join:8 distribution:2 #groups:1
  Hash join one ptn Resc: 3   Deg: 1
      hash_area:  250 (max=12500)  buildfrag:  28                probefrag:   29 ppasses:    1
  Hash join   Resc: 50   Resp: 50
Ix HA Join
  Outer table:
    resc: 22  cdn: 8556  rcz: 29  deg: 1  resp: 22
  Inner table: <no name>
    resc: 35  cdn: 8556  rcz: 23  deg:  1  resp: 35
    using join:8 distribution:2 #groups:1
  Hash join one ptn Resc: 4   Deg: 1
      hash_area:  250 (max=12500)  buildfrag:  43                probefrag:   37 ppasses:    1
  Hash join   Resc: 62   Resp: 62
******** Index join cost ********
Cost: 113  
  BEST_CST: 8.00  PATH: 2  Degree:  1
***************************************
OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***********************
Join order[1]: tb_user [SYS_ALIAS_1]
Best so far: TABLE#: 0  CST:          8  CDN:        428  BYTES:       9416
Final:
  CST: 8  CDN: 428  RSC: 8  RSP: 8  BYTES: 9416
  IO-RSC: 8  IO-RSP: 8  CPU-RSC: 0  CPU-RSP: 0
PLAN
Cost of plan:  1292
Operation...........Object name.....Options.........Id...Pid..
SELECT STATEMENT                                        0
FILTER                                                  1
TABLE ACCESS        tb_user       FULL                2    1
FILTER                                                  3    1
CONNECT BY                          WITH FILTERING      4    3
NESTED LOOPS                                            5    4
INDEX               PK_tb_roleUNIQUE SCAN         6    5
TABLE ACCESS        tb_role   BY USER ROWID       7    5
NESTED LOOPS                                            8    4
BUFFER                              SORT                9    8
CONNECT BY PUMP                                        10    9
TABLE ACCESS        tb_role   BY INDEX ROWID     11    8
INDEX               INX_TB_ADMIN_ROLRANGE SCAN         12   11
QUERY
SELECT ID ID_PLUS_EXP,PARENT_ID PARENT_ID_PLUS_EXP,LPAD(' ',2*(LEVEL-1))||OPERATION||DECODE(OTHER_TAG,NULL,'','*')||DECODE(OPTIONS,NULL,'',' ('||OPTIONS||')')||DECODE(OBJECT_NAME,NULL,'',' OF '''||OBJECT_NAME||'''')||DECODE(OBJECT_TYPE,NULL,'',' ('||OBJECT_TYPE||')')||DECODE(ID,0,DECODE(OPTIMIZER,NULL,'',' Optimizer='||OPTIMIZER))||DECODE(COST,NULL,'',' (Cost='||COST||DECODE(CARDINALITY,NULL,'',' Card='||CARDINALITY)||DECODE(BYTES,NULL,'',' Bytes='||BYTES)||')') PLAN_PLUS_EXP,OBJECT_NODE OBJECT_NODE_PLUS_EXP FROM PLAN_TABLE START WITH ID=0 AND STATEMENT_ID=:1 CONNECT BY PRIOR ID=PARENT_ID AND STATEMENT_ID=:1 ORDER BY ID,POSITION
QUERY
SELECT ID ID_PLUS_EXP,OTHER_TAG OTHER_TAG_PLUS_EXP,OTHER OTHER_PLUS_EXP FROM PLAN_TABLE WHERE STATEMENT_ID=:1 AND OTHER_TAG IS NOT NULL ORDER BY ID
QUERY
DELETE FROM PLAN_TABLE WHERE STATEMENT_ID=:1
*** 2008-04-14 13:57:10.898
QUERY
alter session set events '10053 trace name context off'

使用道具 举报

回复
论坛徽章:
11
数据库板块每日发贴之星
日期:2007-10-10 01:04:092010新春纪念徽章
日期:2010-01-04 08:33:08祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:马
日期:2009-04-12 17:19:242009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:猪
日期:2008-05-06 11:10:422008新春纪念徽章
日期:2008-02-13 12:43:03生肖徽章2007版:鼠
日期:2008-01-02 17:35:53授权会员
日期:2007-11-02 16:47:52ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
28#
发表于 2008-4-14 14:11 | 只看该作者
转的

今天在网上查资料看sql中exist与in 的区别,发现众说纷纭,有几种说法:
1. exist效率比in高,凡是in都应该用exist替换
2. 外大内小用in,外小内大用exist
3. 外大内小用exist,外小内大用in

一时分辨不了哪个正确,于是动手检验.

数据库: ORACLE 10G
客户端: PlSqlDev 7.1

1. 外大内小的情况:
history.tb_stk_cap_chg 记录数 > 100,000,000
history.tb_stk_cap_chg_test 记录数 = 20

--使用in
select count(*)
  from history.tb_stk_cap_chg a
where a.tradedate = '20060712'
   and a.br_serial_no in
       (select b.br_serial_no from history.tb_stk_cap_chg_test b)
   
1 row selected in 21.188 seconds

--使用exists
select count(*)
  from history.tb_stk_cap_chg a
where a.tradedate = '20060712'
   and exists (select null
          from history.tb_stk_cap_chg_test b
         where a.br_serial_no = b.br_serial_no)

1 row selected in 0.5 seconds

可以看出外大内小用in效率极低,用exists效率很高

2. 外小内大的情况:
history.tb_stk_cap_chg 记录数 > 100,000,000
history.tb_stk_cap_chg_test 记录数 = 1,000,000

--使用in
select count(*)
  from history.tb_stk_cap_chg_test a
where a.br_serial_no in
       (select b.br_serial_no from history.tb_stk_cap_chg b)

1 row selected in 9.187 seconds

--使用exists
select count(*)
  from history.tb_stk_cap_chg_test a
where exists (select null
          from history.tb_stk_cap_chg b
         where a.br_serial_no = b.br_serial_no)

  1 row selected in 10.359 seconds

注: 当history.tb_stk_cap_chg_test 记录数 < 1,000,000时得出的时间差别很小,不容易判断

可以看出外小内大时使用in比exists效率更高

----------------------------------------------------------------------------------
在改变history.tb_stk_cap_chg_test记录数(10-1,000,000)进行测试(>5次)得出的结论与上述结论符合,在此不一一列出

由此得出结论: exits适合内小外大的查询,in适合内大外小的查询
----------------------------------------------------------------------------------

附上一篇觉得正确的文章,欢迎探讨:
in 和 exists也是很好区别的.

in 是一个集合运算符.

a in {a,c,d,s,d....}

这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的.

而exists是一个存在判断,如果后面的查询中有结果,则exists为真,否则为假.

in 运算用在语句中,它后面带的select 一定是选一个字段,而不是select *.

比如说你要判断某班是否存在一个名为"小明"的学生,你可以用in 运算:

"小明" in (select sname from student)

这样(select sname from student) 返回的是一个全班姓名的集合,in用于判断"小明"是否为此集合中的一个数据;

同时,你也可以用exists语句:

exists (select * from student where sname="小明")



这两个涵数是差不多的, 但是由于优化方案的不同, 通常NOT EXISTS要比NOT IN 要快, 因为NOT EXISTS可以使用结合算法而NOT IN 就不行了,而EXISTS则不如IN快, 因为这时候IN可能更多的使用结合算法.



select * from 表A where exists(select * from 表B where 表B.id=表A.id)

这句相当于

select * from 表A where id in (select id from 表B)


对于表A的每一条数据,都执行select * from 表B where 表B.id=表A.id的存在性判断,如果表B中存在表A当前行相同的id,则exists为真,该行显示,否则不显示


exits适合内小外大的查询,in适合内大外小的查询



IN
确定给定的值是否与子查询或列表中的值相匹配。

EXISTS
指定一个子查询,检测行的存在。

比较使用 EXISTS 和 IN 的查询

这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。

USE pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO

-- Or, using the IN clause:

USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = 'business')
GO

下面是任一查询的结果集:

pub_name
----------------------------------------
Algodata Infosystems
New Moon Books

(2 row(s) affected)



exits 相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如 exist P 表示P不空时为真; not exist P表示p为空时 为真 in表示一个标量和一元关系的关系。例如:s in P表示当s与P中的某个值相等时 为真; s not in P 表示s与P中的每一个值都不相等时 为真

使用道具 举报

回复
论坛徽章:
76
双子座
日期:2015-07-28 14:26:072012新春纪念徽章
日期:2012-02-13 15:09:52ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15鲜花蛋
日期:2011-08-26 02:02:24管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:皮划艇
日期:2011-04-18 11:24:412011新春纪念徽章
日期:2011-02-18 11:43:342011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
29#
 楼主| 发表于 2008-4-14 14:25 | 只看该作者
set autot traceonly
SQL> select id, role_id, login
  2  from tb_user e
  3  where role_id in (
  4  Select
  5  ID
  6  From tb_role f
  7  Connect By Prior Id = parent_id Start With Id = 1)
  8  ;

8369 rows selected.


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=14 Card=18 Bytes=630
          )

   1    0   HASH JOIN (SEMI) (Cost=14 Card=18 Bytes=630)
   2    1     TABLE ACCESS (FULL) OF 'tb_user' (Cost=8 Card=8556 Byt
          es=188232)

   3    1     VIEW OF 'VW_NSO_1' (Cost=3 Card=18 Bytes=234)
   4    3       CONNECT BY (WITH FILTERING)
   5    4         NESTED LOOPS
   6    5           INDEX (UNIQUE SCAN) OF 'PK_tb_role' (UNIQUE)
           (Cost=1 Card=1 Bytes=5)

   7    5           TABLE ACCESS (BY USER ROWID) OF 'tb_role'
   8    4         NESTED LOOPS
   9    8           BUFFER (SORT)
  10    9             CONNECT BY PUMP
  11    8           TABLE ACCESS (BY INDEX ROWID) OF 'tb_role' (
          Cost=3 Card=18 Bytes=162)

  12   11             INDEX (RANGE SCAN) OF 'INX_tb_role_PARENT_
          ID' (NON-UNIQUE) (Cost=1 Card=18)





Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      10250  consistent gets
          0  physical reads
          0  redo size
     224163  bytes sent via SQL*Net to client
       6553  bytes received via SQL*Net from client
        559  SQL*Net roundtrips to/from client
         17  sorts (memory)
          0  sorts (disk)
       8369  rows processed

把exists 的写法改成如下 和in的效果是一样的

SQL> select id, role_id, login
  2    from tb_user e
  3   where Exists (select id
  4            from (Select ID
  5                    From tb_role f
  6                  Connect By Prior Id = parent_id
  7                   Start With Id = 1)
  8           where id = e.role_id);

8369 rows selected.


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=14 Card=18 Bytes=630
          )

   1    0   HASH JOIN (SEMI) (Cost=14 Card=18 Bytes=630)
   2    1     TABLE ACCESS (FULL) OF 'tb_user' (Cost=8 Card=8556 Byt
          es=188232)

   3    1     VIEW OF 'VW_SQ_1' (Cost=3 Card=18 Bytes=234)
   4    3       VIEW (Cost=3 Card=18 Bytes=234)
   5    4         CONNECT BY (WITH FILTERING)
   6    5           NESTED LOOPS
   7    6             INDEX (UNIQUE SCAN) OF 'PK_tb_role' (UNIQU
          E) (Cost=1 Card=1 Bytes=5)

   8    6             TABLE ACCESS (BY USER ROWID) OF 'tb_role'
   9    5           NESTED LOOPS
  10    9             BUFFER (SORT)
  11   10               CONNECT BY PUMP
  12    9             TABLE ACCESS (BY INDEX ROWID) OF 'tb_role'
           (Cost=3 Card=18 Bytes=162)

  13   12               INDEX (RANGE SCAN) OF 'INX_tb_role_PAREN
          T_ID' (NON-UNIQUE) (Cost=1 Card=18)





Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      10250  consistent gets
          0  physical reads
          0  redo size
     224163  bytes sent via SQL*Net to client
       6553  bytes received via SQL*Net from client
        559  SQL*Net roundtrips to/from client
         17  sorts (memory)
          0  sorts (disk)
       8369  rows processed

SQL>

[ 本帖最后由 paulyibinyi 于 2008-4-14 14:26 编辑 ]

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
30#
发表于 2008-4-14 14:28 | 只看该作者
原帖由 likaiabc 于 2008-4-14 14:11 发表
转的

今天在网上查资料看sql中exist与in 的区别,发现众说纷纭,有几种说法:
1. exist效率比in高,凡是in都应该用exist替换
2. 外大内小用in,外小内大用exist
3. 外大内小用exist,外小内大用in

一时分辨不了哪个正确,于是动手检验.

数据库: ORACLE 10G
客户端: PlSqlDev 7.1

1. 外大内小的情况:
history.tb_stk_cap_chg 记录数 > 100,000,000
history.tb_stk_cap_chg_test 记录数 = 20

--使用in
select count(*)
  from history.tb_stk_cap_chg a
where a.tradedate = '20060712'
   and a.br_serial_no in
       (select b.br_serial_no from history.tb_stk_cap_chg_test b)
   
1 row selected in 21.188 seconds

--使用exists
select count(*)
  from history.tb_stk_cap_chg a
where a.tradedate = '20060712'
   and exists (select null
          from history.tb_stk_cap_chg_test b
         where a.br_serial_no = b.br_serial_no)

1 row selected in 0.5 seconds

可以看出外大内小用in效率极低,用exists效率很高

2. 外小内大的情况:
history.tb_stk_cap_chg 记录数 > 100,000,000
history.tb_stk_cap_chg_test 记录数 = 1,000,000

--使用in
select count(*)
  from history.tb_stk_cap_chg_test a
where a.br_serial_no in
       (select b.br_serial_no from history.tb_stk_cap_chg b)

1 row selected in 9.187 seconds

--使用exists
select count(*)
  from history.tb_stk_cap_chg_test a
where exists (select null
          from history.tb_stk_cap_chg b
         where a.br_serial_no = b.br_serial_no)

  1 row selected in 10.359 seconds

注: 当history.tb_stk_cap_chg_test 记录数 < 1,000,000时得出的时间差别很小,不容易判断

可以看出外小内大时使用in比exists效率更高

----------------------------------------------------------------------------------
在改变history.tb_stk_cap_chg_test记录数(10-1,000,000)进行测试(>5次)得出的结论与上述结论符合,在此不一一列出

由此得出结论: exits适合内小外大的查询,in适合内大外小的查询
----------------------------------------------------------------------------------

附上一篇觉得正确的文章,欢迎探讨:
in 和 exists也是很好区别的.

in 是一个集合运算符.

a in {a,c,d,s,d....}

这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的.

而exists是一个存在判断,如果后面的查询中有结果,则exists为真,否则为假.

in 运算用在语句中,它后面带的select 一定是选一个字段,而不是select *.

比如说你要判断某班是否存在一个名为"小明"的学生,你可以用in 运算:

"小明" in (select sname from student)

这样(select sname from student) 返回的是一个全班姓名的集合,in用于判断"小明"是否为此集合中的一个数据;

同时,你也可以用exists语句:

exists (select * from student where sname="小明")



这两个涵数是差不多的, 但是由于优化方案的不同, 通常NOT EXISTS要比NOT IN 要快, 因为NOT EXISTS可以使用结合算法而NOT IN 就不行了,而EXISTS则不如IN快, 因为这时候IN可能更多的使用结合算法.



select * from 表A where exists(select * from 表B where 表B.id=表A.id)

这句相当于

select * from 表A where id in (select id from 表B)


对于表A的每一条数据,都执行select * from 表B where 表B.id=表A.id的存在性判断,如果表B中存在表A当前行相同的id,则exists为真,该行显示,否则不显示


exits适合内小外大的查询,in适合内大外小的查询



IN
确定给定的值是否与子查询或列表中的值相匹配。

EXISTS
指定一个子查询,检测行的存在。

比较使用 EXISTS 和 IN 的查询

这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。

USE pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO

-- Or, using the IN clause:

USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = 'business')
GO

下面是任一查询的结果集:

pub_name
----------------------------------------
Algodata Infosystems
New Moon Books

(2 row(s) affected)



exits 相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如 exist P 表示P不空时为真; not exist P表示p为空时 为真 in表示一个标量和一元关系的关系。例如:s in P表示当s与P中的某个值相等时 为真; s not in P 表示s与P中的每一个值都不相等时 为真

这个更不靠谱,连执行计划都没有的看

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表