2014-09-04 105 views
1

前言中,此查询将db_links用于oracle环境,目前正在TOAD中针对SQL Server数据库执行。SQL Server - 查询花费很长时间使用硬编码日期

我最初有一些日期变量,用户可以输入日期范围,当使用这些变量时,查询在15秒内执行。当我手动插入变量的同一日期进行硬编码时,查询现在需要3.5分钟。

为什么我的查询从15秒变为3.5分钟,而不是使用日期变量来硬编码日期?

这里是下面的查询:

select TRANS.FGBTRNH_DOC_CODE, 
     '' "calc1", 
     TRANS.FGBTRNH_TRANS_DESC, 
     case when TRANS.FGBTRNH_DR_CR_IND = 'C' then TRANS.FGBTRNH_TRANS_AMT *-1 
       when TRANS.FGBTRNH_DR_CR_IND = 'D' then TRANS.FGBTRNH_TRANS_AMT 
       end "calc2", 
     CAST(TRANS.FGBTRNH_TRANS_DATE AS DATE) "calc3" 
    from [BANTEST.UNWSP.EDU]..FIMSMGR.FGBTRNH TRANS 
inner join [BANTEST.UNWSP.EDU]..FIMSMGR.FABINVH INVOICE on TRANS.FGBTRNH_DOC_CODE = INVOICE.FABINVH_CODE 

where TRANS.FGBTRNH_ACCT_CODE = '19000' 
     and TRANS.FGBTRNH_TRANS_DATE between convert(date,'08/01/2013') and convert(date,'08/31/2013') 
     and TRANS.FGBTRNH_DOC_CODE not like 'J%' 
     and TRANS.FGBTRNH_TRANS_DESC not like '%AMAZON%' 
     and TRANS.FGBTRNH_POSTING_PERIOD <>'00' 
     and (TRANS.FGBTRNH_RUCL_CODE not like 'CA%' 
     and TRANS.FGBTRNH_RUCL_CODE not like 'Y%') 

当我使用变量的条件语句是这样的:

和TRANS.FGBTRNH_TRANS_DATE之间:日期1和:date2的

蟾蜍则提示为什么的价值:date1和:date2

+0

而且该声明在第二次执行中也使用相同的硬编码日期也需要很长时间? – 2014-09-04 13:43:18

回答

1

唯一突出的是CONVERT。请没有它尝试如下:

TRANS.FGBTRNH_TRANS_DATE between '2013-08-01' and '2013-08-31' 
+0

我用你提供的参数运行它,它运行的时间相同。 – 2014-09-05 15:54:42

-1

当您使用的参数(“变量”),该服务器可以再利用的执行计划,因为查询是一样的一个你已经执行。

如果您不使用参数,则每次更改日期时,服务器都会将其识别为另一个查询,并且必须构建新的执行计划,这需要时间。

+0

虽然你说的是真的,但我发现很难想象解析会增加3分钟和15个seocnds ....(执行时间从15秒增加到3.5分钟。) – 2014-09-04 14:05:50

+0

@ MarkJ.Bobak当你发现它很难,并不意味着它不会发生。我已经看到使用链接服务器时会发生这种情况,情况就是如此。我没有谈论“解析”。我谈到了“执行计划”,这是一个非常不同的事情。 – 2014-09-04 14:08:09

+0

即使我第一次执行这两个查询中的任何一个,他们仍然需要15秒的变量或3.5分钟的硬编码日期。如果我一直运行带有硬编码日期的版本而不更改日期,则每次仍需要3.5分钟。 – 2014-09-05 15:53:55