我可以写
Select
Sum(Case When Resposta.Tecla = 1 Then 1 Else 0 End) Valor1,
Sum(Case When Resposta.Tecla = 2 Then 1 Else 0 End) Valor2,
Sum(Case When Resposta.Tecla = 3 Then 1 Else 0 End) Valor3,
Sum(Case When Resposta.Tecla = 4 Then 1 Else 0 End) Valor4,
Sum(Case When Resposta.Tecla = 5 Then 1 Else 0 End) Valor5
From Resposta
或者
Select
Count(*)
From Resposta Group By Tecla
我在大量的行上尝试了这个,看起来好像花了相同的时间。
任何人都可以证实这一点吗?
答案 0 :(得分:3)
DB在内部使用第二个查询执行的操作几乎与您明确指示第一个查询执行的操作相同。执行计划应该没有区别,因此在查询时间内也应该没有区别。考虑到这一点,明确使用第二个查询更好:
Tecla
的值时,它会更加灵活
不需要更改您的查询Tecla
有很多值
阅读第一个查询并意识到它只是很重要
不同的价值观答案 1 :(得分:3)
我相信Group By更好,因为没有特定的治疗方法。 它可以通过数据库引擎进行优化。 我认为结果可能取决于您使用的数据库引擎。 也许你正在使用的那个优化了第一个查询,理解它就像一个小组!
您可以尝试“解释/解释计划”命令来查看引擎如何计算您的查询但是使用我的Microsoft SQL Server 2008,我只能看到两个操作之间的交换(“计算标量”和“agregate”)
我在数据库表上尝试过这样的查询:
结果非常不同:
所以我的选择是“分组依据”。 另一个好处是查询更容易编写!
答案 2 :(得分:2)
任何一个都必须从Resposta
读取所有行,因此对于任何合理大小的表,我都希望I / O成本占主导地位 - 给出大致相同的整体运行时间。
我通常会使用:
Select
Tecla,
Count(*)
From Resposta
Group By Tecla
如果Tecla
值的范围有可能在将来发生变化。
答案 3 :(得分:2)
我认为GROUP BY
语句总是比SUM(CASE WHEN ...)
更快,因为在SUM ...
的示例中,使用GROUP BY
时会有5种不同的计算,数据库只会简单排序和计算。
想象一下,你有一个装有不同硬币的袋子,你需要知道,你有多少硬币类型的硬币。你可以这样做:
SUM(CASE WHEN ...)
方式是将每个硬币与预定义的样本硬币进行比较,并对每个样本进行数学运算(加1或0); GROUP BY
方式是按类型对硬币进行排序,然后计算earch组。您更喜欢哪种方法?
答案 4 :(得分:0)
要公平地与count(*)
竞争,您的第一个SQL应该是:
Select
Sum(Case When Resposta.Tecla >= 1 AND Resposta.Tecla <=5 Then 1 Else 0 End) Valor
From Resposta
为了回答你的问题,我没有注意到SUM CASE WHEN
和COUNT
之间的速度差异。我在POSTGRESQL中查询超过250,000行。