来自不同SQL Server中相同查询的不同执行计划

时间:2016-07-28 12:25:22

标签: sql sql-server stored-procedures query-optimization sql-server-2014

我对此查询有一些问题:

select distinct
    Date_Int,
    CodF,
    Desc_Com,
    DataDesc_Com,
    CodC,
    Function,
    Tratt_Number,
    Tratt_State
from 
    tmp_SIC_Trattative_Stato_com_l2

UNION 

SELECT DISTINCT
    case 
       when (ts.Date_Int is not null) 
          then ts.Date_Int 
          else All_Day.Date_Int 
    end as Date_Int,
    case 
       when (ts.CodF is not null) 
          then ts.CodF 
          else All_Day.CodF  
    end as CodF,
    case 
       when (ts.Desc_Com is not null) 
          then ts.Desc_Com 
          else All_Day.Desc_Com 
    end as Desc_Com,
    case 
       when (ts.DataDesc_Com is not null) 
          then ts.DataDesc_Com 
          else All_Day.DataDesc_Com 
    end as DataDesc_Com,
    case 
       when (ts.CodC is not null) 
          then ts.CodC 
          else All_Day.CodC 
    end as CodC,
    case when (ts.Function is not null) then ts.Function else All_Day.Function end as Function,
    case when (ts.Tratt_Number is not null) then ts.Tratt_Number else All_Day.Tratt_Number end as Tratt_Number,
    case when (ts.Tratt_State is not null) then ts.Tratt_State else All_Day.Tratt_State end as Tratt_State
FROM 
    Commerciali_All_Day as All_Day 
LEFT OUTER JOIN
    tmp_SIC_Trattative_Stato_com_l2 as ts ON ts.Date_Int = All_Day.Date_Int
                                          AND ts.CodF = All_Day.CodF
                                          AND ts.Desc_Com = All_Day.Desc_Com
                                          AND ts.DataDesc_Com = All_Day.DataDesc_Com
                                          AND ts.CodC = All_Day.CodC
                                          AND ts.Function = All_Day.Function
                                          AND ts.Tratt_State = All_Day.Tratt_State
WHERE 
    ts.Date_Int IS NULL

我在存储过程中执行此查询,但如果使用生产SQL Server或使用测试SQL Server执行存储过程,则执行计划会更改。

这是测试执行计划:

Test Execution Plan

这是生产执行计划:

Production Execution Plan

源表和存储过程在测试和生产中是相同的,我不明白,因为执行计划和时间不同。

在测试中,查询将在6分钟后执行,并在15分钟内完成。

测试和生产SQL Server是Microsoft SQL Server 2014版本12.0.4100.1。

  • 生产服务器具有24 GB RAM和8 CPU 2GHz
  • 测试服务器有16 GB RAM和4 CPU 2GHz

我不明白为什么程序在测试环境中而不是在生产环境中表现更好。

1 个答案:

答案 0 :(得分:0)

问题的标题不是你真正要求的。您的prod和测试服务器之间有相同的查询计划。您真正要问的是为什么prod服务器比具有相同查询的测试服务器慢。

在评论中你回答说测试和产品之间的表格和内容是相同的。具体来说,你提到他们有相同的行数。

prod计划显示的返回数据多于测试计划。返回数据的最大兴趣点是Commerciali_All_Day上的表扫描,它是哈希表的构建输入。在测试中,它返回725,858行,总大小为47MB。在prod中它返回728,941行,总大小为120MB。这是大小的两倍多,相差3,083行。

随着散列构建输入表返回的数据量增加一倍以上,它在prod中比在测试中大得多。在测试中,哈希表是19,897,066行,大小为2,713MB。在prod中,哈希表是20,006,362行,大小为4,732MB。 Prod正在通过额外的2GB数据进行处理。

您需要返回并更好地了解prod和test中的数据之间的差异。在比较产品和测试计划时,您的表中没有任何表返回相同数量的数据。具体来说,这个查询的真正痛点是Commerciali_All_Day表。