我对此查询有一些问题:
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执行存储过程,则执行计划会更改。
这是测试执行计划:
这是生产执行计划:
源表和存储过程在测试和生产中是相同的,我不明白,因为执行计划和时间不同。
在测试中,查询将在6分钟后执行,并在15分钟内完成。
测试和生产SQL Server是Microsoft SQL Server 2014版本12.0.4100.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表。