带有DISTINCTUNIONORDER BY的 SQL 语句啊,看着没啥大问题,但其实挺耗资源的。尤其是你在 Oracle 里跑的时候,排序操作一多,SQL 引擎就要忙得团团转,响应慢得一批。嗯,如果你习惯用UNIONGROUP BY,那排序次数就直接翻倍,性能拉胯是分分钟的事儿。

这种时候,换个思路蛮重要的。多场景下,你可以用EXISTS来替代DISTINCT,效果还不错,逻辑也清晰。像这种写法:

SELECT * FROM orders o
WHERE EXISTS (
  SELECT 1 FROM customers c
  WHERE c.id = o.customer_id
)

比你上来一个DISTINCT强多了,查询速度也能快不少。

另外像MINUSINTERSECT这些操作,看起来优雅,但它们会触发多次排序,尤其是数据量大的时候,那性能下滑不是一点点。一般都能找到别的方式,比如NOT EXISTS或是LEFT JOIN ... IS NULL这种组合,灵活还高效。

如果你对 SQL 性能卡脖子的问题挺在意,推荐你看看这篇文章:优化 ORACLE_SQL 性能避免使用 DISTINCT、UNION、MINUS、INTERSECT 和 ORDER BY。讲得比较细,也贴了不少例子,适合动手党。

还有几篇相关文章也蛮有用:

,SQL 写法真没所谓“对错”,但性能差距真不是闹着玩的。如果你写查询常常跑得慢,不妨从这些小细节开始优化一下,效果立竿见影哦~