minus 排序

本文探讨了一个SQL性能问题,即在处理大约15万条数据时遇到的排序速度缓慢现象。通过分析发现,使用Minus操作导致了两次内部排序,增加了整体I/O量。文章进一步介绍了使用(not)exist代替Minus的方法,以减少不必要的排序过程。

上周的sql遭遇了排序速度慢的问题。15w左右的数据进行了一次order by的排序,由于数据量巨大因此速度比较慢。

后来dba在帮我优化的时候,发现我的sql为了处理权限问题,使用了minus,从而造成了2次内部排序,使得整体IO量一下子就上去了。

 

minus操作的时候会进行一次 sort unique的排序(效果和distinct相同,union也会有unique的排序,但是不太一样)。使用minus方式,只会进行一次select 就可以得到相应的结果集,但是在得到这个结果集的过程中会进行排序。

也就是同样的数据我进行了2次排序。因此他建议我使用(not) exist方式进行处理。对于in和 exist原则上都是进行的行检测——查询出结果后,查看该结果是否符合in 和exist中集合的要求,然后确定是否输出。

具体的情况见另一篇文章。

Oracle数据库中的`MINUS`操作符是一个非常实用的集合运算符,用于返回两个`SELECT`语句结果的差集。具体来说,它会返回第一个查询结果中存在,但在第二个查询结果中不存在的行,并自动去除重复行。`MINUS`操作符在数据差异分析、数据校验等场景中具有重要作用。 ### 使用方法 `MINUS`操作符的基本语法如下: ```sql SELECT column1, column2, ..., columnN FROM table_name1 MINUS SELECT column1, column2, ..., columnN FROM table_name2; ``` 上述语句的含义是:从第一个`SELECT`查询的结果中减去第二个`SELECT`查询的结果,返回剩余的记录。需要注意的是,两个查询的列数和对应列的数据类型必须一致,否则将引发错误。 ### 快速定位查询结果之间的差异 为了展示`MINUS`操作符如何帮助快速定位两个查询结果之间的差异,以下是一个具体示例: 假设存在两个表`employees_current`和`employees_previous`,分别记录当前和上一周期的员工信息,结构如下: ```sql employees_current(id NUMBER, name VARCHAR2(100), department VARCHAR2(100)); employees_previous(id NUMBER, name VARCHAR2(100), department VARCHAR2(100)); ``` 要查找当前员工表中存在但上一周期不存在的员工,可以使用如下SQL语句: ```sql SELECT id, name, department FROM employees_current MINUS SELECT id, name, department FROM employees_previous; ``` 该查询将返回所有在`employees_current`中存在,但在`employees_previous`中不存在的员工记录。这种方式非常适合用于检测数据变更、新增或删除操作。 ### 注意事项 1. **列匹配**:确保两个查询返回的列数和列的数据类型一致。如果列数或数据类型不一致,Oracle将抛出错误[^1]。 2. **性能优化**:对于大规模数据集,`MINUS`操作可能会影响性能,因为它需要对结果集进行排序和去重操作。在这种情况下,可以考虑对相关列建立索引,或者使用临时表来优化查询效率。 3. **空值处理**:`MINUS`操作符在处理包含`NULL`值的行时会将其视为相等的值。这意味着如果两个查询中都包含`NULL`值,则它们将被视为相同。 4. **并行处理限制**:在某些版本的Oracle中,`MINUS`操作可能不支持并行执行,这可能会影响大数据量下的执行效率。 ### 示例说明 以下是一个完整的示例,展示如何使用`MINUS`操作符来查找两个结果集之间的差异: ```sql -- 查找当前员工表中存在但上一周期不存在的员工 SELECT id, name, department FROM employees_current WHERE department = 'IT' MINUS SELECT id, name, department FROM employees_previous WHERE department = 'IT'; ``` 该查询进一步筛选了`department`为`'IT'`的员工,仅比较该部门的员工差异。 通过上述方法,可以高效地利用Oracle数据库中的`MINUS`操作符来定位两个查询结果之间的差异,适用于数据校验、差异分析等场景。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值