1

我有一张有 50 万笔交易的桌子。我想获取特定日期的最后余额。所以我返回了如下查询。

    SELECT curr_balance
      FROM transaction_details
     WHERE acct_num = '10'
       AND is_deleted = 'N'
       AND ( value_date, srl_num ) IN(
            SELECT MAX( value_date ), MAX( srl_num )
              FROM transaction_details
             WHERE TO_DATE( value_date, 'dd/mm/yyyy' ) 
                <= TO_DATE( ADD_MONTHS( '05-APR-2012', 1 ), 'dd/mm/yyyy' )
              AND acct_num = '10'
              AND is_deleted = 'N'
              AND ver_status = 'Y' )
       AND ver_status = 'Y'        

这必须以 12 个月的增量执行,以找到每个特定月份的最后余额。但是这个查询有更多的 cpu 成本,12 倍它需要大量的时间。如何重新修改上述查询以更快地获得结果。这是否可以在 PL/SQL 中分为两部分来实现性能。?

4

2 回答 2

0

您不必查询您的表两次。尝试使用分析函数

SELECT t.curr_balance
    -- , any other column you want as long it is in the subselect.
FROM (
    SELECT
        trans.curr_balance
        , trans.value_date
        -- any other column you want
        , trans.srl_num
        , MAX(trans.srl_num) OVER(PARTITION BY trans.value_date, trans.srl_num) max_srl_num
        , MAX(trans.value_date) OVER(PARTITION BY trans.value_date, trans.srl_num) max_date
    FROM transaction_details trans
    WHERE TO_DATE( value_date, 'dd/mm/yyyy' ) <= TO_DATE( ADD_MONTHS( '01-APR-2012', 1 ), 'dd/mm/yyyy' )
        AND acct_num = '10'
        AND is_deleted = 'N'
        AND ver_status = 'Y'
) t
WHERE t.max_date = t.value_date
    AND t.max_srl_num = t.srl_num 

几个想法。

  • 你为什么有TO_DATE( value_date...?不是你的数据类型DATE吗?如果您在该列中有一个,这可能会破坏您的索引。
  • 请注意(这是一个疯狂的猜测)如果您srl_num不是最新日期的最高值,您将得到不正确的结果并且可能不会返回任何行。
于 2013-01-21T14:30:54.160 回答
0

尝试:

select * from(
    SELECT value_date, srl_num, curr_balance
      FROM transaction_details
     WHERE acct_num = '10'
       AND is_deleted = 'N'
       AND ver_status = 'Y'  
       row_number() over (partition by trunc(value_date - interval '5' day,'MM') 
                         order by srl_num desc
                         ) as rnk
       )
where rnk = 1;

您将在您的表格中获得一份报告,其中包含每个月最后一个 srl_num 的余额。

好处是您的方法在 12 个月报告中扫描表 24 次,而我的方法扫描表一次。

解析函数获取当前月份的记录排名(按子句分区),对 srl_num 之后的月份中的行进行排序。

于 2013-01-21T14:43:08.777 回答