我有一个需要包含条件逻辑的查询。有 4 种情况需要考虑,结果集是不相交的。
我可以使用单个SELECT
and CASE
/WHEN
语句或使用多个SELECT
语句 and来实现查询UNION ALL
。
一般来说,这些实现中的一种可能比另一种更快吗?如果是这样,为什么?
我有一个需要包含条件逻辑的查询。有 4 种情况需要考虑,结果集是不相交的。
我可以使用单个SELECT
and CASE
/WHEN
语句或使用多个SELECT
语句 and来实现查询UNION ALL
。
一般来说,这些实现中的一种可能比另一种更快吗?如果是这样,为什么?
一个联合会同时进行许多选择,因此如果 from 语句不是那么复杂并且所有其他事情都相同,那么恕我直言,通常情况下会更好。但它们不是相似的 sql 结果:
'Case when ...' 将添加另一个水平行,并且默认情况下,选择的联合必须在集合中具有该数量的列,以便它会添加更多行。例如,如果您查询三个单独的表,然后将它们合并在一起,您将执行三个选择,但是如果您只执行三个案例,那么如果您查询一个表将是有效的。但是您可能要查询五个。在不知道来源的情况下,答案确实是:“取决于”。
我只是在对 SQL 引擎进行快速计时时设置了 ole 'set statistics time on' 来查看。人们可以争论语义,但当它告诉你发生了什么时,引擎不会说谎。SQL 2005 及更高版本我相信在菜单栏中也有“包括实际执行计划”。这是一个好看的小三方形图标,呈 L 形,L 点位于左上角。如果您有一些非常复杂的事情并且正在真正进行微调,那么这是检查引擎在您的查询中执行的操作的首选工具。
这实际上完全取决于您期望从中选择的逻辑和数据是什么样的。如果您针对庞大的数据集运行此 SELECT 并且逻辑非常简单,例如 WHEN Val 在 A 和 B THEN C 之间,您可能会得到一点提升,将逻辑放在 where 子句中并执行 UNION ALL 但不是一吨的差异。在相对较小的数据集上,它可能根本没有任何区别。它还可能取决于您是否看到此代码是一成不变的,还是会定期更改。UNION ALL 肯定会多出几行代码,因为您基本上是用不同的 WHERE 子句一遍又一遍地编写相同的查询,但它也可能更易于阅读和维护。