oracle中的minus数据比对

1、要有唯一索引或者主键作为前提,减少数据冲突的数量。

2、当有in查询的时候,尽量用exists,这样能提高查询效率:

create table TF_F_USER_DIFF1 tablespace BD_TBS_EXP_DATA parallel 20

as select /*+ parallel(c,20) / * from TF_F_USER_DIFF c where not
exists(select /
+ parallel(a,10) */ user_id from TF_F_USER_CRM a where

a.user_id=c.user_id);

低效率查询是这样的:

create table TF_F_USER_DIFF1 tablespace BD_TBS_EXP_DATA parallel 20 as select /*+ parallel(c,20) / * from TF_F_USER_DIFF c where a.user_id not in(select /+ parallel(a,10) */ user_id from TF_F_USER_CRM a);

3、ORACLE中的minus内部实现是有唯一索引机制或者主键机制,所以不需要像在其他表数据比对软件中那样要指定唯一索引或者主键那么麻烦,这个大赞。

4、如果两张表的数据量差异太大的话,建议按每个列分别比对,而不是把所有的列放在一起直接minus,因为minus之后的结果需要关联查询,两张大表关联查询效率不高。

1)分别比对:select columnA,columnB from tableA minus select columnC,columnD from tableB,其中columnA,columnC分别是两张表的主键,这样就只比对columnB,columnD这两列了。

2)把所有的列放在一起比对:select columnA,columnB,columnE,columnF,columnG,coulumnH from tableA minus select columnC,columnD,columnL,columnM,columnN,coulumnI from tableB

5、找出既在A表中有数据,又在C表中有数据,其中VPN_ID、MEMBER_ROLE_ID、START_DATE是联合主键:

create table Tf_f_User_Member_CRM tablespace BD_TBS_EXP_DATA parallel

20 as SELECT /*+ parallel(c,20) */

  • FROM TF_F_USER_MEMBER_DIFF C WHERE EXISTS (SELECT /*+ parallel(a,10) */ a.vpn_id,a.member_role_id,a.start_date FROM ucr_group_online.TF_F_USER_MEMBER_DIFF A WHERE A.VPN_ID = C.VPN_ID AND
    A.MEMBER_ROLE_ID = C.MEMBER_ROLE_ID AND A.START_DATE = C.START_DATE);

最好不要用下面的SQL语句,因为它是等值查询,会发生笛卡尔积,导致数据成倍的增长,最终结果不准确:

create table Tf_f_User_Member_diff1 tablespace BD_TBS_EXP_DATA

parallel 20 as SELECT /*+ parallel(c,20) / / + parallel(a,20) / c.

FROM TF_F_USER_MEMBER_DIFF C, UCR_GROUP_ONLINE.TF_F_USER_MEMBER_DIFF A

WHERE A.VPN_ID = C.VPN_ID AND A.MEMBER_ROLE_ID = C.MEMBER_ROLE_ID AND

A.START_DATE = C.START_DATE;

6、找出只在C表中存在数据,A表中不存在相同的数据,其中VPN_ID、MEMBER_ROLE_ID、START_DATE是联合主键:

create table Tf_f_User_Member_CRM tablespace BD_TBS_EXP_DATA parallel

20 as SELECT /*+ parallel(c,20) */

  • FROM TF_F_USER_MEMBER_DIFF C WHERE not EXISTS (SELECT /*+ parallel(a,10) */ a.vpn_id,a.member_role_id,a.start_date FROM
    ucr_group_online.TF_F_USER_MEMBER_DIFF A WHERE A.VPN_ID = C.VPN_ID AND
    A.MEMBER_ROLE_ID = C.MEMBER_ROLE_ID AND A.START_DATE = C.START_DATE);

7、oracle中的minus有排重作用:比如A={1,2,3,4},B={5,6,7,7},虽然两边的数据量是一样的,数据是完全不同的,理应B minus A的数据量是4,但是B minus A={5,6,7},只有三条数据,就是因为minus排重了。A minus B={1,2,3,4},数据量是4,说明A表中没有重复数据。

相关推荐
H_oRIZoN_4 分钟前
Linux入门DAY37(IO 多路复用、TCP 并发服务器与数据库 SQLite3 详解)
linux·服务器·数据库
2501_9304724415 分钟前
05_数据库迁移腾讯云_DTS评估与预检回滚清单
数据库·云计算·腾讯云
三84423 分钟前
SSRF 从入门到实战(下篇):gopher 打 Redis 实现 RCE
数据库·redis·缓存
承渊政道42 分钟前
从GB到TB:KFS如何实现高吞吐、有序的异构增量同步
数据库·kingbase·延迟优化·kfs·数据量级优化
广州灵眸科技有限公司1 小时前
灵眸科技EAI3572-Core-L核心板即将发布!八核+4TOPS NPU,面向工业与边缘AI
linux·运维·服务器·数据库·yolo
Y3815326629 小时前
MySQL 慢查询排查实战:EXPLAIN 看懂 type 与 Extra,一个字段定位性能问题
数据库·mysql
Logintern0910 小时前
PostgreSQL 的 ORDER BY 多列排序
数据库·postgresql
今天AI了吗11 小时前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
数据库小学妹11 小时前
为什么MySQL索引用B+树?从存储底层讲透原理
数据库·mysql·b+树·索引优化·磁盘io·数据库原理
BestHeaker11 小时前
制造业 MES 开发入门:和互联网业务开发的 5 个本质差异(一)
数据库·经验分享·制造业·mes