【问题标题】:Replacement for a Case statement替换 Case 语句
【发布时间】:2012-08-03 02:57:36
【问题描述】:

我有一个函数可以使用两个 case 语句在视图之外工作。 问题是由于这个 case 语句,运行该函数需要 25 秒以上。因为它应该只需要大约 3 秒(与具有不调用 case 语句的视图的相同函数相比。)

case 语句在 select 中完成。

有趣的是(对我来说),如果我将其中一个案例语句更改为直接的内容,即 D.CARS 而不是

CASE WHEN D.CAR IS NOT NULL 
THEN D.CAR              
ELSE C.CAR
END AS CAR,

然后它会加快运行该函数的速度约 3 秒,但会显示一些关闭的结果。因此,如果 select 语句中有两个 case 语句,似乎只需要 25 秒。

无论案例语句的数量如何,视图的填充时间都不会少于 1 秒。

有没有办法在加快速度的同时仍然获得正确的结果?

【问题讨论】:

  • 您是否尝试过将计算列添加到视图而不是调用函数?

标签: sql-server-2005 function view case


【解决方案1】:

为什么不使用CASE 表达式而不是COALESCE

COALESCE(D.CAR, C.CAR) AS CAR

【讨论】:

  • 我从未听说过这个词。让我试一试。编辑 - COALESCE 似乎仍然给我确切的时间结果作为案例。不过它更整洁。
  • 如果您在 Query Analyzer/Management Studio 中运行函数内部包含的查询并查看执行计划,您会发现瓶颈在哪里?
  • 29% 和 24% 在两个哈希匹配内部连接和一个 25% 哈希匹配在右连接....这看起来很奇怪,因为我没有正确的连接?
  • 没有看到你的整个查询(和/或执行计划),这是一种猜测。 SQL 认为你有一个正确的连接。您可能需要在表上添加额外的索引,您可能希望通过调用 INNER LOOP JOIN 而不是 INNER JOIN 来强制循环连接,您可能希望将您的函数重新编写为内联查询,等等...
  • 好的。调用内部循环连接确实有很大帮助。你介意向我解释一下“循环”到底是什么吗?我在 sql server f1 帮助中找不到它
【解决方案2】:

您是否尝试过使用函数而不是 case 语句?

【讨论】:

  • 函数的性能几乎总是比内联查询差;至少,没有更好的。
  • 命中可以忽略不计,它总能提高代码的可读性。想象一下这样的案例陈述在众多 SP 中重现......
  • 所以你是说我应该在函数内部的视图中有一个函数?从来没想过。我会试试看。
  • 对不起,应该澄清一下——优化器说它总是表现得更差。我没有发现它确实如此的证据。以我的经验相反。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多