Spring Batch-Oracle Trim和SubQueries花费太多时间通过Dataware House进行呼叫

时间:2018-10-01 17:02:30

标签: spring spring-batch

我正在使用 Spring Batch Partition 。按照下面的代码,我正在创建20个分区来执行逻辑。在我的分区类中,我从表中获取1个月的数据,基本上是获取帐户详细信息(AccountNo等),然后将这些参数在List参数中传递给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>

,并且在“仅以下两个帐户号”的“下方查询”过程中,将花费近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根据发生在DEBIT和CLEARING上的交易,从12位到19位变化。这是动态参数,我该如何使用?

1 个答案:

答案 0 :(得分:0)

理想情况下,每次通过DW(数据仓库)查询时,我们都不应在let II x = I (I x) TRIM子句中使用SQL SUBSTRIMSELECT函数,因为这样的函数适用于整个数据集,并且会影响性​​能。 https://www.databasestar.com/oracle-substr/。最好在Java中应用所有TRIM逻辑。