SQL Server - 使用硬编码日期查询需要很长时间

时间:2014-09-04 13:32:18

标签: sql sql-server oracle performance dblink

作为前言,此查询正在将db_links用于oracle环境,并且当前正在TOAD中针对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:date1和:date2

然后Toad会提示输入以下值:date1和:date2

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-1)

当您使用参数(“变量”)时,服务器可以重复使用执行计划,因为查询与您已执行的查询相同。

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