0

Boss 有一个查询,将 TranGLC 表连接到我们的 Invoiced 表。事务表的设置方式是,关键字段是标记为 Key1、Key2 等的 varchar 字段,根据行连接的表,每个记录都有一个限定符。所以 TranGLC.RelatedTo = 'InvcDtl',Key1 和 Key2 是 Invoice Number 和 Line Number(在其他表中存储为 Ints)。RelatedTo 可能是许多事情之一。

查询本身运行了大约 9 秒,但是当老板输入一个应该返回更少记录的“Where OrderNumber = XXXXXX”时,运行了 48 秒。奇怪的。他把它拿给我,看了看执行计划,我开始玩,发现 TranGLC 正在隐式地将 Key1 和 Key2 转换为 int 以匹配 Invoice Table。

我尝试将 InvoiceNumber 和 Line 显式转换为 varchar 字段和 BAM!不到一秒就跑了。前任。

Inner Join InvoiceDtl on TGLC.Key1 = convert(varchar(25), InvoiceDtl.InvoiceNum) and.....

执行计划不同,但恐怕这是我对这些事情的了解陷入猜测的地方。我很好奇为什么会这样以及它如何如此剧烈地影响性能。我的理论是,由于 TranGLC 表包含更多记录(其中许多无论如何都无法转换为整数),因此隐式转换尝试(并且在很多情况下失败)首先转换 TranGLC 的整个 Key 列,然后将 int 加入 int 与占用更少的字段相比,转换为 varchar 没有问题,然后将 varchar 加入 varchar。

有人有详细的解释吗?查询上下文:

select 
            [TranGLC].[GLAccount] as [TranGLC_GLAccount],
            [InvcDtl].[InvoiceNum] as [InvcDtl_InvoiceNum],
            [InvcDtl].[OrderNum] as [InvcDtl_OrderNum],
            (SUM(TranGLC.CreditAmount)) as [Calculated_GROSS],
            (SUM(TranGLC.DebitAmount)) as [Calculated_DISCOUNT],
            (SUM(TranGLC.CreditAmount)-SUM(TranGLC.DebitAmount)) as [Calculated_NET]
from Erp.TranGLC as TranGLC
inner join Erp.InvcDtl as InvcDtl on 
            TranGLC.Company = InvcDtl.Company
            and TranGLC.Key1 = convert(varchar(25),InvcDtl.InvoiceNum)
            and TranGLC.Key2 = convert(varchar(4),Invcdtl.InvoiceLine)
            and TranGLC.RelatedToFile = 'InvcDtl'

where (TranGLC.TranDate >= '1-1-2016'  and TranGLC.TranDate <= convert(date, getdate()) and InvcDtl.OrderNum = 123456)
group by [TranGLC].[GLAccount],
            [InvcDtl].[InvoiceNum],
            [InvcDtl].[OrderNum]

WithConvert

无转换

4

0 回答 0