选择具有2种不同case语句/ s格式的语句

时间:2014-01-14 04:24:11

标签: sql tsql

我已经制作并测试了这个SQL脚本,虽然结果集很好,但我想知道2 case语句之间是否存在差异,例如性能方面。而且,如果何时使用每种case语句/ s格式,它是否有特殊情况?


SELECT
SHIPMENTDT_1 = (CASE ISDATE(ohdr.date1) 
                WHEN 1 THEN CONVERT(DATETIME,SUBSTRING(CONVERT(VARCHAR(10),ohdr.date1,102),1,11) +' '+ CONVERT(VARCHAR(8),DateAdd(Hour,-8,ohdr.date1),108))
                WHEN  0 THEN CONVERT(DATETIME,SUBSTRING(CONVERT(VARCHAR(10),getdate(),102),1,11) +' '+ CONVERT(VARCHAR(8),DateAdd(Hour,-8,GETDATE()),108))
               END),

SHIPMENTDT_2 = (CASE 
                   WHEN ISDATE(ohdr.date1) = 1 THEN
                     CONVERT(DATETIME,SUBSTRING(CONVERT(VARCHAR(10),ohdr.date1,102),1,11) +' '+ CONVERT(VARCHAR(8),DateAdd(Hour,-8,ohdr.date1),108))
                   WHEN ISDATE(ohdr.date1) = 0 THEN
                     CONVERT(DATETIME,SUBSTRING(CONVERT(VARCHAR(10),getdate(),102),1,11) +' '+ CONVERT(VARCHAR(8),DateAdd(Hour,-8,GETDATE()),108))
               END ),   
FROM OHDR

1 个答案:

答案 0 :(得分:1)

第一种形式稍微更快,但区别是非常轻微。

原因是SQL Server T-SQL编译器/优化器几乎不对行内的标量表达式进行优化。因此,在第一种情况下,表达式ISDATE(ohdr.date1)每行执行一次,而在第二种情况下,执行两次。

查询计划也没有准确地反映这一点,也没有标量计算中的大多数其他差异。例如,将原始查询的查询计划与此列的相同查询进行比较:

SHIPMENTDT_2 = (CASE 
                   WHEN ISDATE(ohdr.date1) = 1 THEN
                     CONVERT(DATETIME,SUBSTRING(CONVERT(VARCHAR(10),ohdr.date1,102),1,11) +' '+ CONVERT(VARCHAR(8),DateAdd(Hour,-8,ohdr.date1),108))
                   WHEN ISDATE(ohdr.date1) = 0 THEN
                     CONVERT(DATETIME,SUBSTRING(CONVERT(VARCHAR(10),getdate(),102),1,11) +' '+ CONVERT(VARCHAR(8),DateAdd(Hour,-8,GETDATE()),108))
               END ),

更改为:

SHIPMENTDT_2 = ISDATE(ohdr.date1),

你应该看到没有区别,但是如果你执行它会显然在总CPU上有一些差异,尽管如此,差异是如此之小以至于你没有能够在没有极端测试用例的情况下准确测量。