我正在使用 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位变化。这是动态参数,我该如何使用?
答案 0 :(得分:0)
理想情况下,每次通过DW(数据仓库)查询时,我们都不应在let II x = I (I x)
和TRIM
子句中使用SQL SUBSTRIM
或SELECT
函数,因为这样的函数适用于整个数据集,并且会影响性能。
https://www.databasestar.com/oracle-substr/。最好在Java中应用所有TRIM逻辑。