我有一个有效的代码,
CURSOR c_val IS
SELECT 'Percentage' destype,
1 descode
FROM dual
UNION ALL --16028 change from union to union all for better performance
SELECT 'Unit'destype,
2 descode
FROM dual
ORDER BY descode DESC;
--
我将联盟更改为联合所有,从我所读到的它只要我有一个订单(我这样做)就不会产生很大的差异,这是真的还是应该让它保持原样,它仍然可以双向运作
答案 0 :(得分:6)
UNION和UNION ALL之间的选择不是它们中的一个是否有效,或者其中一个是否表现更快,而是哪一个对于你想要实现的逻辑是正确的。
UNION ALL只是两个查询合并为单个结果集的结果。你应该认为结果集的顺序是随机的,尽管实际上你可能发现它是第一个结果集,后面是第二个结果集。
UNION是相同的,但DISTINCT应用于组合集。因此,它可以返回更少的行,花费更长的时间并消耗更多的资源。您可能会发现行的顺序不同,但您应该再次假设顺序是随机的。
将ORDER BY应用于其中任何一个是保证结果集上的顺序的唯一方法。它会影响UNION ALL的性能,但可能不会太多地影响UNION(除了DISTINCT的影响),因为优化器可能会选择一个DISTINCT实现来返回有序的结果集。
因此,在您的情况下,您希望显示两个行(实际上UNION不会消除它们中的任何一个),并且您希望指定顺序 - 因此基于此,UNION ALL和您提供的ORDER BY是正确的方法。
答案 1 :(得分:2)
"UNION" = "UNION ALL" + "DISTINCT"
所以基本上通过UNION ALL
来保存重复数据删除操作。在这种情况下,您可能会发现性能增益可以忽略不计,但它对大型数据集很重要。
答案 2 :(得分:1)
Union All返回所有行,因此您可能会获得重复项。联盟实际上就像一个独特的。在你的情况下,它使用相同的表没有区别!