在处理相同数据时,使用SQL中的CASE语句还是在代码中使用if语句更有效率?我问这个问题是因为我的同事有一个包含多个CASE语句的巨大查询。我建议她通过编写代码来减轻数据库的压力。我发现这样做更有效率...但是为什么呢?
在处理相同数据时,使用SQL中的CASE语句还是在代码中使用if语句更有效率?我问这个问题是因为我的同事有一个包含多个CASE语句的巨大查询。我建议她通过编写代码来减轻数据库的压力。我发现这样做更有效率...但是为什么呢?
这里其实有一个更基本的问题:这些 CASE
语句到底是做什么用的?
先不要考虑性能。如果 CASE
只是用于转换查询结果的最终输出,而且实际上可以通过在 ASP 中使用 if
或 select case
来替换相同的功能,那么这可能意味着数据库查询/过程正在尝试完成应由 UI 负责的工作,比如格式化。分离关注点问题比任何可能的性能问题都更为严重。
如果你有这样一个查询:
SELECT InvoiceID, InvoiceDate,
CASE WHEN PaidStatus = 0 THEN 'Unpaid' ELSE 'Paid' END
FROM ...
这太荒谬了,因为UI或者任何层负责将数据映射到领域的层应该知道如何将数据库中的状态转换为对应的描述。在查询本身中包含这个逻辑是没有意义的。
另一方面,如果CASE
构造是查询的重要部分,例如:
SELECT
SUM(CASE WHEN PaidStatus = 0 THEN Amount ELSE 0 END) AS TotalUnpaid,
SUM(CASE WHEN PaidStatus = 1 THEN Amount ELSE 0 END) AS TotalPaid
FROM ...
不要试图将这种逻辑移到UI层,因为数据库在这方面更加出色。而且CASE
语句在语义上是查询的一部分(“计算x的总付款和未付款金额”),它并没有替代任何UI功能。
首先要考虑这个逻辑根据其意图实际属于哪里。只有在您真正发现显著的性能问题时,才应该考虑性能问题。
CASE
语句是首选的,因为:
根据我的经验,我们的数据库服务器比应用服务器要大得多,并且通常处于30%以下的空闲状态。让数据库管理数据,然后让客户端通过resultSet迭代。最好的实践是让数据库只返回你需要的数据(如果你可以提前确定这一点)。
你应该在数据库中查询(过滤和排序)数据,并将演示留给演示层。这有两个关键原因: