SQL CONVERT_IMPLICIT和查询速度

时间:2018-04-09 22:50:40

标签: sql sql-server epicor10

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]

WithConvert

WithoutConvert

0 个答案:

没有答案