2010-03-11 139 views
7

什么是更高效 - 在sql中处理case语句或使用if语句在代码中处理相同的数据。我问,因为我的同事有一个巨大的查询,有很多案例陈述。我建议她通过编写案例陈述来减轻DB的压力。我发现它更高效......但为什么?Case语句与编码语句

+1

这是模糊的。通常人们会建议你处理数据库中的数据库数据查询,并记住你可能会遇到很多麻烦,试图维护代码中的数据库模式(groups/union/distincts),这是dbs所做的... – 2010-03-11 22:36:27

+2

在我看来,你应该更多地在DB开发人员面前讨论这个问题,单个SQL标签不够用,你使用了什么样的SQL数据库? – AnthonyWJones 2010-03-11 22:37:46

回答

19

有一个更电线这里没有提到的基本问题:这些CASE声明实际上在做什么?

忘记表演一分钟。如果CASE仅用于转换查询的最终输出,并且实际上可以用ASP中的ifselect 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功能。

首先担心逻辑实际所属的位置是基于它打算完成的。如果您实际注意到显着的性能问题,则只应对性能问题进行讨论。

+0

很好的答案!很有帮助!正是我在找什么。 – Eric 2010-03-12 15:47:15

2

根据我的经验,我们的数据库服务器比我们的应用程序服务器大很多,通常闲置时间低于30%。让数据库管理数据,然后让客户端遍历resultSet。让数据库只返回你需要的数据是更好的做法(如果你能确定这一点)。

5

CASE语句,因为首选:

  • SQL:他们是ANSI标准,使得它移植到其他数据库,而无需改变
  • 他们支持 “短路”
1

你应该查询(过滤和排序)数据库中的数据,并将演示文稿留给表示层。这有两个重要原因:

  • 数据库由过滤和排序数据
  • 你想拉最少的数据量在从DB必要