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

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

 

理解sort操作,其实很简单,核心的就是sort,后面括弧里面说明的是排序的目的是什么?

 

当需要排序操作时,通常会有一系列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 uniquedistinct操作或者某个下一步需要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 uniquehash group by等操作。

 

 

注释:sql语句中的不同词句对应产生执行计划里的不同操作。

 

转自:http://blog.csdn.net/haiross/article/details/17224445

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 非常感谢您的提问。我可以回答这个问题。以下是一个基于DeepSORT的多目标跟踪代码的Python实现: https://github.com/nwojke/deep_sort 这个代码库包含了一个深度学习模型,可以用于多目标跟踪。它使用了卷积神经网络来提取特征,并使用了一种称为“卡尔曼滤波”的技术来预测目标的位置。这个代码库还包含了一些实用工具,比如可视化工具和数据集处理工具,可以帮助您更好地理解和使用这个模型。 希望这个回答能够帮助到您。如果您有任何其他问题,请随时问我。 ### 回答2: DeepSORT是一种用于多目标跟踪的深度学习算法,它结合了目标检测和目标跟踪的技术。在使用Python编写基于DeepSORT的多目标跟踪代码时,你可以按照以下步骤进行操作: 1. 导入所需的Python库,例如OpenCV、NumPy和Tensorflow等。这些库将提供必要的功能和工具来处理图像和运行深度学习模型。 2. 下载或构建一个训练好的目标检测模型,例如YOLOv3或Faster R-CNN,并加载它们到代码。这些模型能够检测图像的目标并提取相关特征。 3. 加载保存的DeepSORT模型。这个模型负责跟踪已检测到的目标,并在每个时间步更新目标的位置和属性。 4. 运行一个实时视频流或读取一个视频文件作为输入。使用OpenCV的VideoCapture库从摄像头或文件读取帧。 5. 对每个帧执行以下操作: - 对帧进行目标检测,获取目标的边界框和相关特征。 - 使用DeepSORT算法跟踪目标,更新目标的位置和属性。 - 绘制目标边界框和轨迹,并在结果视频显示出来。 6. 处理完所有帧后,保存结果视频或显示最终的多目标跟踪输出。 需要注意的是,上述步骤只是一个简单的基本框架,你可能需要进一步调整代码来适应特定的数据集和任务。此外,你还可以添加其他功能,例如数据关联、目标去重和目标识别等来进一步提升多目标跟踪的准确性和鲁棒性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值