什么更有效 - 使用 sql 中的 case 语句处理或使用代码中的 if 语句处理相同的数据。我问是因为我的同事有一个包含许多案例陈述的庞大查询。我建议她通过编写案例语句来减轻数据库的压力。我发现它更有效......但是为什么呢?
5 回答
这里没有提出一个更基本的问题:这些CASE
陈述实际上在做什么?
一分钟忘记表演。如果CASE
仅用于转换查询的最终输出,并且实际上可以用 ASP 中的if
or替换相同的功能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
语句是首选,因为:
- SQL:它们是 ANSI 标准,无需更改即可移植到其他数据库
- 他们支持“短路”
根据我的经验,我们的数据库服务器比我们的应用程序服务器大得多,并且通常处于 30% 以下的空闲状态。让数据库管理数据,然后让客户端遍历结果集。更好的做法是让数据库只返回您需要的数据(如果您可以预先确定的话)。
您应该查询(过滤和排序)数据库中的数据,并将表示留给表示层。这有两个关键原因:
- 数据库用于过滤和排序数据
- 您希望根据需要通过网络从数据库中提取最少的数据量
正如我所读到的,这里的基本问题是 CASE 是否比 SQL 中的 IF 更好。答案还取决于您的条件的深度。在这里找到了一篇好文章。可能对某人有用。 http://www.4guysfromrolla.com/webtech/102704-1.shtml