执行计划-CONCATENATION释疑

本文通过示例解释了SQL执行计划中的CONCATENATION操作,它与UNION不同,不会去除所有重复数据,而是仅针对OR条件消除重复。在SQL改写时需特别注意此行为。示例中展示了当使用OR条件查询时,CONCATENATION如何处理重复记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL> set linesize 200
SQL> set pagesize 20000
SQL> set autotrace trace
SQL> create table dao_objects as select  * from dba_objects ;


Table created.

SQL> create index idx_obj_id on dao_objects (object_id) ;
create index  idx_obj_type on dao_objects (object_type) ;


Index created.


SQL> 
Index created.




SQL>  select *                                                                               
  2   from dao_objects do                                                                    
  3   where do.object_id<2000                                                                
  4    or do.object_type='VIEW';                                                             
                                                                                             
                                                                                             
Execution Plan                                                                               
----------------------------------------------------------                                   
Plan hash value: 3924143853                                                                  
                                                                                             
---------------------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              |  7479 |  1511K|    36   (0)| 00:00:01 |
|   1 |  CONCATENATION               |              |       |       |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS  |  5181 |  1047K|    20   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN          | IDX_OBJ_TYPE |   415 |       |     5   (0)| 00:00:01 |
|*  4 |   TABLE ACCESS BY INDEX ROWID| DAO_OBJECTS  |  2298 |   464K|    16   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN          | IDX_OBJ_ID   |   934 |       |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
                                                                                             
Predicate Information (identified by operation id):                                          
---------------------------------------------------                                          
                                                                                             
   3 - access("DO"."OBJECT_TYPE"='VIEW')                                                     
   4 - filter(LNNVL("DO"."OBJECT_TYPE"='VIEW'))                                              
   5 - access("DO"."OBJECT_ID"<2000)                                                         
                                                                                             
Note                                                                                         
-----                                                                                        
   - dynamic sampling used for this statement (level=2)                                      





请注意ID为1的操作CONCATENATION.


CONCATENATION操作类似 union ,只不过与union 不同的是他并不对全部数据去重.
CONCATENATION操作只去除由OR引起的重复值.这点在我们做SQL改写的时候一定要特别注意.
因为empno为7934的记录 部门编号为20

SQL> select e.empno,e.deptno
  2    from scott.emp e 
  3   where empno >7900 or deptno=10 ;


     EMPNO     DEPTNO
---------- ----------
      7782         10
      7839         10
      7902         20
      7934         10


SQL> select e.empno,e.deptno
  2    from scott.emp e 
  3   where empno >7900 ;


     EMPNO     DEPTNO
---------- ----------
      7902         20
      7934         10


SQL> select e.empno,e.deptno
  2    from scott.emp e 
  3   where deptno=10;


     EMPNO     DEPTNO
---------- ----------
      7782         10
      7839         10
      7934         10


<think>嗯,用户想了解如何在TensorFlow或PyTorch中实现按通道拼接。首先,我需要回忆一下这两种框架中常用的拼接函数。PyTorch里应该是torch.cat,而TensorFlow可能是tf.concat。然后,关键点在于指定拼接的维度,也就是通道所在的轴。 接下来,我得考虑用户的使用场景。他们可能是在构建卷积神经网络,比如U-Net或者类似的需要多尺度特征融合的模型。这时候,按通道拼接常用于将不同层的特征图合并,增加通道数。需要明确的是,拼接操作需要除通道维度外其他维度(如高度和宽度)必须相同,否则会出错。 用户可能对维度参数不太清楚,比如在PyTorch中,对于NCHW格式的数据,通道是第1维,所以dim=1;而TensorFlow默认是NHWC,通道是最后一维,所以axis=-1或3。需要举例子说明两种框架的用法,同时提醒维度一致的要求。 另外,用户可能有隐式的疑问,比如为什么要用按通道拼接而不是其他方式,比如相加。这时候可以简单提一下拼接的好处,比如保留更多信息,但也会增加计算量。不过用户的问题主要是如何实现,所以这部分可以作为扩展稍微提一下。 还需要检查是否有相关引用可以支持。比如引用[4]提到AGs可以整合到标准CNN如U-Net,可能涉及到特征拼接,但不确定,所以可能不直接引用。其他引用似乎不相关,所以可能不需要添加引用。 最后,生成相关问题时要考虑用户可能的后续问题,比如维度不匹配怎么办,应用场景,性能影响等,这样可以帮他们深入理解。</think>在深度学习框架中,按通道拼接(channel-wise concatenation)主要通过指定维度参数实现。以下是TensorFlow和PyTorch的具体实现方法: ### 一、PyTorch实现 使用`torch.cat`函数,指定拼接维度为通道维度(通常为`dim=1`): ```python import torch # 输入特征图形状:(batch_size, channels, height, width) x1 = torch.randn(2, 64, 128, 128) # 64通道 x2 = torch.randn(2, 32, 128, 128) # 32通道 # 沿通道维度拼接 concatenated = torch.cat((x1, x2), dim=1) print(concatenated.shape) # 输出:torch.Size([2, 96, 128, 128]) ``` ### 二、TensorFlow实现 使用`tf.concat`函数,指定拼接轴为通道轴(通常为`axis=-1`或`axis=3`): ```python import tensorflow as tf # 输入特征图形状:(batch_size, height, width, channels) x1 = tf.random.normal([2, 128, 128, 64]) # 64通道 x2 = tf.random.normal([2, 128, 128, 32]) # 32通道 # 沿通道维度拼接 concatenated = tf.concat([x1, x2], axis=-1) print(concatenated.shape) # 输出:(2, 128, 128, 96) ``` ### 关键注意事项: 1. 拼接时除通道维度外,其他维度必须完全相同 2. 常用于: - U-Net等分割网络的跳跃连接[^4] - 多尺度特征融合 - 多模态数据融合(如RGB+深度图)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值