并集(Union,Union-All)
合并集合是指合并不同的查询语句所获得的结果,也就是通过将必须要在同一个查询语句中进行复杂处理的集合分解为多个只需要简单处理的集合。从集合的加工运算上看,这里“复杂”的真正意思是指数据读取的复杂性。如:
SELECT order_id,order_date,status
FROM orders
WHERE order_date>:b1
OR order_id IN (SELECT order_id
FROM order_item
WHERE item_group=’A001’);
分析:查询条件中由OR所连接起来的order_date的比较值是常量,而另外一个查询条件order_id之后使用的是子查询,由于无法对这两个查询条件使用索引,因此优化器只能制定全表扫描orders表和检验子查询的执行计划。
虽然一般来说由不同类型的单位执行计划组合而成的执行计划比较有效,但此时,优化器无法制定这种类型的执行计划。如果我们在编写查询语句时将复杂的查询语句分解为比较简单的查询语句,那么由于这些分开的简单查询语句在被执行所需要的数据读取要求也比较简单,优化器就能够很容易地制定我们所期望的执行计划。
SELECT order_id,order_date,status
FROM orders
WHERE order_date>:b1
UNION
SELECT order_id,order_date,status
FROM orders
WHERE order_id IN (SELECT order_id
FROM order_item
WHERE item_group=’A001’);
在分解查询语句时,使用UNION还是使用UNION ALL需要正确选择。由于UNION求的是两个集合的最小公倍数集合,所以合并之后还需要再次执行排序操作SORT(UNION)。
交集(Intersection)的执行计划
交集是指同时存在于两边集合中的共同元素的集合,即两边集合的最大公约数。为了求得两个集合的交集,不允许各个集合中存在重复元素,即集合中的每一个元素必须是唯一存在的。检验集合中元素是否唯一存在的对象是SELECT-List中所使用到的所有列,这里涉及的列并不仅仅指表中的列。
交集的执行计划有点类似于排序合并连接的执行计划,对两边集合进行排序之后再进行合并,所不同的是在这里只合并共存于两个集合中的行。
差集(Minus)的执行计划
差集是指从一个基准集合中除去属于另一集合中的元素后所得到的集合,即所有属于基准集合且不属于另一集合的元素所组成的集合。差集与使用EXISTS所获得的集合有所不同,因为差集运算以不允许重复元素存在的集合为对象。虽然可以通过使用子查询、嵌套视图、DISTINCT等获得与使用集合相同的结果,但如果能灵活运用集合运算,则将会使复杂查询变得比较简单。
在执行差集之前,首先应该求得哥哥SELECT-List中所用到的所有列值的非重复集合。实际上求差集操作与合并(MERGE)操作比较类似。