作为前言,此查询正在将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
答案 0 :(得分:1)
唯一突出的是CONVERT
。请在没有它的情况下尝试如下:
TRANS.FGBTRNH_TRANS_DATE between '2013-08-01' and '2013-08-31'
答案 1 :(得分:-1)
当您使用参数(“变量”)时,服务器可以重复使用执行计划,因为查询与您已执行的查询相同。
如果您不使用参数,则每次更改日期时,服务器都会将其识别为另一个查询,并且必须构建新的执行计划,这需要时间。