【问题标题】:SQL Server - Query Taking Long Time with Hard Coded DatesSQL Server - 使用硬编码日期进行长时间查询
【发布时间】:2014-10-29 06:51:00
【问题描述】:

首先,此查询使用 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 的值是什么

【问题讨论】:

  • 而且语句在第二次执行时使用相同的硬编码日期也需要很长时间?

标签: sql sql-server oracle performance dblink


【解决方案1】:

唯一引人注目的是CONVERT。请尝试不使用它,如下所示:

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

【讨论】:

  • 我使用您提供的参数运行它,并且运行时间相同。
【解决方案2】:

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

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

【讨论】:

  • 虽然你说的是真的,但我很难想象解析会增加 3 分钟和 15 秒....(执行时间从 15 秒到 3.5 分钟。)
  • @MarkJ.Bobak 虽然你觉得很难,但这并不意味着它不会发生。我已经看到使用链接服务器时会发生这种情况,就是这种情况。而且我没有谈论“解析”。我谈到了“执行计划”,这是一个非常不同的东西。
  • 即使我是第一次执行这两个查询中的任何一个,它们仍然需要 15 秒的变量或 3.5 分钟的硬编码日期。如果我一遍又一遍地运行带有硬编码日期的版本而不更改日期,那么每次仍然需要 3.5 分钟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多