Boss有一个查询将TranGLC表加入我们的Invoiced表。事务表的设置方式是键字段是标记为Key1,Key2等的varchar字段,每个记录的限定符就行连接的表而言。因此,TranGLC.RelatedTo =' InvcDtl',Key1和Key2是发票编号和行号(在其他表中存储为Ints)。 RelatedTo可能是众多事情之一。
查询本身在大约9秒内运行,但是当老板输入' Where OrderNumber = XXXXXX'应该返回更少的记录,运行需要48秒。奇。他把它带给我并查看执行计划,我开始玩,发现TranGLC隐含地将Key1和Key2转换为int以匹配发票表。
我尝试将InvoiceNumber和Line显式转换为varchar字段和BAM!跑不到一秒钟。离。
Inner Join InvoiceDtl on TGLC.Key1 = convert(varchar(25), InvoiceDtl.InvoiceNum) and.....
执行计划是不同的,但我担心这是我对这些事情的知识停滞不前的猜测。我很好奇为什么会这样,以及它如何影响性能。我的理论是,由于TranGLC表保存了更多的记录(其中许多记录无法转换为整数),隐式转换尝试(并在很多情况下失败)首先转换TranGLC的整个Key列,然后join int to int Vs占用的字段数量明显减少,转换为varchars没有问题,然后将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]