-
sql语句大全之理解执行计划中的一些sort操作
理解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)
当需要排序操作时,通常会有一系列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语句中的不同词句对应产生执行计划里的不同操作。
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式