由于我是SQL的新手,我无法理解以下语句之间的区别:
SELECT DISTINCT x , 66 FROM Person
VS
SELECT s.x, 66 FROM (SELECT DISTINCT x FROM Person ) s
是否有任何性能差异。 任何帮助将不胜感激。谢谢!!
答案 0 :(得分:0)
没有逻辑差异,因为常量66
不会影响两行是否相等。
我怀疑没有性能差异,因为优化器可能会选择此模式并将第一种形式转换为第二种形式。查看您喜欢的RDBMS中的执行计划以查找。
答案 1 :(得分:0)
不应存在任何(重要/可检测)差异,因为查询优化器可以看到它是相同的。
您可以通过查看查询的执行计划和/或查询的IO和TIME统计信息来自行查看。 在我自己的测试中,它们都是一样的。 两者都会导致扫描和标量计算。
如果我选择使用#1,因为它更容易阅读,因为它避免了子选择
如果您开始在查询中添加更多逻辑,尤其是子查询,则会出现差异。所以总是测试变化。
答案 2 :(得分:0)
这甚至再次相同,你看到了模式吗?您只是创建另一个更深层次的查询来预生成结果集。你可以随心所欲地做到这一点,如果你很幸运,优化器会看一段时间。
SELECT s.x, 66 FROM (SELECT t.x as x FROM ( SELECT DINSTINCT x FROM Person ) t ) s
最后,始终尝试使用最佳可读性和最佳可维护性解决方案,而不是在不需要它们的情况下引入子查询。在大多数情况下,引入多余的子查询来实现相同的结果是微不足道的,但除了心甘情愿地惹恼任何跟随你的开发人员之外,我不明白你为什么要这样做:)