spring - 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 发生的交易。这是动态参数,我该如何处理?
解决方案
理想情况下,当我们通过 DW(Datawarehouse)进行查询时,我们不应该在and子句中使用 SQLTRIM
或SUBSTRIM
函数,因为这样的函数适用于整个数据集并且会影响性能。
https://www.databasestar.com/oracle-substr/。最好在 java 中应用所有 TRIM 逻辑。SELECT
WHERE
推荐阅读
- android - Navigation.findNavController(it) 和 NavHostFragment.findNavController() 有什么区别?
- c# - C#中左侧操作数的三元条件运算符
- node.js - 如何使用他们的 API 将有效图像保存到 Github?
- python - 在python中的文本中查找具有特定条件的单词
- java - 如何将字符串数组从单独的方法添加到 JList 模型?
- php - localhost 将您重定向太多次 ERR_TOO_MANY_REDIRECTS
- azure - 使用 Azure AD 用户凭据将文件存储共享映射为网络驱动器
- c# - 在 .Net Core 控制台应用程序中同时使用 NLog 和控制台日志记录
- spring-boot - Spring Boot、Thymeleaf 和 CSS
- django - 如何将 Google 日历添加到已经使用 Django-allauth google social login 的 Django Webapp