首页 > 解决方案 > Spring Batch - Oracle Trim 和 SubQueries 需要太多时间调用 Dataware house

问题描述

我正在使用Spring Batch Partition。根据下面的代码,我正在创建 20 个分区来执行逻辑。在我的分区类中,我从表中获取 1 个月的数据,主要是获取帐户详细信息(AccountNo 等),然后将 List 参数中的这些 Account No 详细信息传递给 Dataware House,以获取与 AUTH、DEBIT 和 CLEARNING 相关的详细信息。

账户规模增加

<batch:job id="PaymentAnalysis">
...........
...........
<batch:step id="masterStep" next="y">
    <batch:partition step="x" partitioner="abcAccountPartitioner">
        <batch:handler grid-size="20" task-executor="taskExecutor" />
    </batch:partition>
</batch:step>
............
</batch:job>


<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="10" />
    <property name="maxPoolSize" value="20" />
    <property name="allowCoreThreadTimeOut" value="true" />
</bean>

并且当下面查询 Just two Accounts number 需要将近 30 分钟,这是性能命中。这效果不好,我希望更改逻辑,因此不应使用 where 子句 trim。

SELECT SUBSTR(OO.ACCT_NUM,1,de.ACCT_LEN),
de.RQST_AMT                                                              
de.LOCATION_ID                                                     
de.SEQ_NUM                                                
de.MERCH_ID                                                
de.ISSR_CNTRY_CD                                             
de.MERCH_CNTRY_CD             
FROM DEBIT_DETAIL de
INNER JOIN DEBIT_DETAIL_OOO OO
ON ( de.SEQ_NUM  = OO.SEQ_NUM AND de.PRCSS_DT = OO.PRCSS_DT ) 
WHERE SUBSTR(OO.ACCT_NUM,1,de.ACCT_LEN) IN ('5611981300010200234','5429640600392919')
AND de.TRAN_DT BETWEEN (SYSDATE - 60) AND (SYSDATE - 0);

在这种情况下,de.ACCT_LEN 从 12 位到 19 位不等,具体取决于 DEBIT 和 CLEARING 发生的交易。这是动态参数,我该如何处理?

标签: springspring-batch

解决方案


理想情况下,当我们通过 DW(Datawarehouse)进行查询时,我们不应该在and子句中使用 SQLTRIMSUBSTRIM函数,因为这样的函数适用于整个数据集并且会影响性​​能。 https://www.databasestar.com/oracle-substr/。最好在 java 中应用所有 TRIM 逻辑。SELECTWHERE


推荐阅读