2015-03-13 36 views
2

我应该以最常见的情况开始CASE顺序条件吗?假设在我的数据库中有3个产品。产品编号1.代表所有病例的70%,产品编号2代表29%的案例和产品编号。 1%的病例。SQL中CASE的性能是否与案例的频率有关?

这是关于性能的最佳条件顺序吗?

SELECT 
    CASE 
     WHEN Product=1 THEN 'Most popular case' 
     WHEN Product=2 THEN 'Not very popular' 
     WHEN Product=3 THEN 'Very rare case' 
    END AS Frequency 

只是很好理解。这是糟糕的顺序吗?

SELECT 
    CASE 
     WHEN Product=3 THEN 'Very rare case' 
     WHEN Product=2 THEN 'Not very popular' 
     WHEN Product=1 THEN 'Most popular case' 
    END AS Frequency 

我知道的情况下,声明事项的查询执行的顺序,并尽快退出如发现第一个真正的条件。但我的问题是关于CASE的频率。

+3

我想你是低估了查询优化器。在我看来,最好专注于编写正确和可读的SQL查询,而不是微观优化具有可疑收益的事物。 – 2015-03-13 09:38:23

+0

很容易检查哪些案例最受欢迎,并将其置于查询之上。我只想确认它是否重要。 – 2015-03-13 09:41:25

+0

优化'SELECT'通常不是那么重要,因为您应该更关心'WHERE'必须首先找到记录。因此,如果您有十亿条记录,而您的选择会返回其中的十条,那么您正在优化这10条记录。 – 2015-03-13 09:42:40

回答

-1

在这个例子中CASE语句顺序的实际影响很小。查询优化器将自行决定最优执行计划是什么,并据此采取行动。

如果你真的对CASE语句本身感到疑惑,那么就像你说的,如果CASE在它发现它的第一个真值后退出,那么首先评估一个更常见的事件会更有可能在理论上缩短执行时间。

所以是的,如果有一个具有较高发生概率的CASE,也会增加运行时间较短的机会。但它并不能保证它,这个晦涩的案例可能仍然存在,并且最后被评估,导致执行时间更长。根据您的数据,这可能会有所不同,确保执行两个版本并平均时间来查看哪一个更适合您。

编辑:(如果您想控制执行流程):您可以在CASE文档中阅读:CASE表达式不能用于控制Transact-SQL语句,语句块,用户定义语句的执行流程,定义的函数和存储过程。