您的位置:首页 > 其它

理解执行计划中的一些sort操作

2013-12-09 15:56 381 查看
理解sort操作,其实很简单,核心的就是sort,后面括弧里面说明的是排序的目的是什么?版本:9.2.0.8

当需要排序操作时,通常会有一系列sort的操作,下面是一些cbo执行sort的操作:

Sort unique(sort的目的是取出所有的唯一值)

Sort aggregate(sort的目的是为了聚合)//聚合函数如count()、sum()等就是聚合操作

Sort group by(sort的目的是为了分组)

Sort join(sort的目的是为了merge)

Sort order by(sort的目的是为了有序输出)

分别来看这些操作的产生和执行情况:

Sort unique

Sort unique在distinct操作或者某个下一步需要unique值的操作:

SQL> select distinct a.state from t_policy_state a;

36 rows selected.

Execution Plan

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

0 SELECT STATEMENT ptimizer=CHOOSE (Cost=18 Card=36 Bytes=828

)

1 0 SORT (UNIQUE)(Cost=18 Card=36 Bytes=828)

2 1 TABLE ACCESS (FULL) OF 'T_POLICY_STATE' (Cost=2 Card=36

Bytes=828)

另外在某些in子查询中也有可能产生。

Sort group by

Sort group by用来在计算不同分组的排序时使用

SQL> select a.state,sum(a.p_state_id) from t_policy_state a group by a.state;

36 rows selected.

Execution Plan

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

0 SELECT STATEMENT ptimizer=CHOOSE (Cost=18 Card=36 Bytes=936

)

1 0 SORT (GROUP BY)(Cost=18 Card=36 Bytes=936)

2 1 TABLE ACCESS (FULL) OF 'T_POLICY_STATE' (Cost=2 Card=36

Bytes=936)

Sort aggregate

这个操作并没有实际的进行sort,只是在计算所有行的总计时使用

SQL> select sum(a.p_state_id) from t_policy_state a ;

Execution Plan

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

0 SELECT STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=4)

1 0 SORT (AGGREGATE)

2 1 INDEX (FULL SCAN) OF 'PK_T_POLICY_STATE' (UNIQUE) (Cost=

1 Card=36 Bytes=144)

Sort join

通常在sort merge join中出现,如果用来join的行集需要对join key排序的话使用

SQL> select /*+ use_merge(a,b) */

2 a.organ_id

3 from t_company_organ a, t_company b

4 where a.organ_id = b.parent_id;

no rows selected

Execution Plan

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

0 SELECT STATEMENT ptimizer=CHOOSE (Cost=19 Card=1 Bytes=16)

1 0 MERGE JOIN(Cost=19 Card=1 Bytes=16)

2 1 INDEX (FULL SCAN) OF 'PK_T_COMPANY_ORGAN' (UNIQUE) (Cost

=1 Card=250 Bytes=1500)

3 1 SORT (JOIN)(Cost=18 Card=1 Bytes=10)

4 3 TABLE ACCESS (FULL) OF 'T_COMPANY' (Cost=2 Card=1 Byte

s=10)

Sort order by

当使用了order by,并且没有在order by的列上有适合的索引,则会使用这个操作:

SQL> select a.organ_id

2 from t_company_organ a, t_company b

3 where a.organ_id = b.parent_id

4 order by a.organ_id;

no rows selected

Execution Plan

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

0 SELECT STATEMENT ptimizer=CHOOSE (Cost=19 Card=1 Bytes=16)

1 0 SORT (ORDER BY)(Cost=19 Card=1 Bytes=16)

2 1 NESTED LOOPS (Cost=3 Card=1 Bytes=16)

3 2 TABLE ACCESS (FULL) OF 'T_COMPANY' (Cost=2 Card=1 Byte

s=10)

4 2 INDEX (UNIQUE SCAN) OF 'PK_T_COMPANY_ORGAN' (UNIQUE)

如果使用sort merge join,使用a.organ_id上的索引,那么由于索引已经排序,则不会有sort操作,例如:

SQL> select /*+ use_merge(a,b)*/a.organ_id

2 from t_company_organ a, t_company b

3 where a.organ_id = b.parent_id

4 order by a.organ_id;

no rows selected

Execution Plan

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

0 SELECT STATEMENT ptimizer=CHOOSE (Cost=19 Card=1 Bytes=16)

1 0 MERGE JOIN (Cost=19 Card=1 Bytes=16)

2 1 INDEX (FULL SCAN)OF 'PK_T_COMPANY_ORGAN' (UNIQUE) (Cost

=1 Card=250 Bytes=1500)

3 1 SORT (JOIN) (Cost=18 Card=1 Bytes=10)

4 3 TABLE ACCESS (FULL) OF 'T_COMPANY' (Cost=2 Card=1 Byte

s=10)

上述这些sql在另外一个版本:10.2.0.4中使用的则是hash unique,hash group by等操作。

注释:sql语句中的不同词句对应产生执行计划里的不同操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: