什么是更高效 - 在sql中处理case语句或使用if语句在代码中处理相同的数据。我问,因为我的同事有一个巨大的查询,有很多案例陈述。我建议她通过编写案例陈述来减轻DB的压力。我发现它更高效......但为什么?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功能。
首先担心逻辑实际所属的位置是基于它打算完成的。如果您实际注意到显着的性能问题,则只应对性能问题进行讨论。
很好的答案!很有帮助!正是我在找什么。 – Eric 2010-03-12 15:47:15
根据我的经验,我们的数据库服务器比我们的应用程序服务器大很多,通常闲置时间低于30%。让数据库管理数据,然后让客户端遍历resultSet。让数据库只返回你需要的数据是更好的做法(如果你能确定这一点)。
CASE
语句,因为首选:
- SQL:他们是ANSI标准,使得它移植到其他数据库,而无需改变
- 他们支持 “短路”
你应该查询(过滤和排序)数据库中的数据,并将演示文稿留给表示层。这有两个重要原因:
- 数据库由过滤和排序数据
- 你想拉最少的数据量在从DB必要
当我阅读时,这里的基本要求是如果CASE在SQL中优于IF。答案也取决于你的条件的深度。在这里找到一篇好文章。可能对某人有用。 http://www.4guysfromrolla.com/webtech/102704-1.shtml
这是模糊的。通常人们会建议你处理数据库中的数据库数据查询,并记住你可能会遇到很多麻烦,试图维护代码中的数据库模式(groups/union/distincts),这是dbs所做的... – 2010-03-11 22:36:27
在我看来,你应该更多地在DB开发人员面前讨论这个问题,单个SQL标签不够用,你使用了什么样的SQL数据库? – AnthonyWJones 2010-03-11 22:37:46