oracle - 甲骨文-Java | 在 30 分钟到 1 小时内更新 6000 行| 非主非索引复合键
问题描述
它需要
2021-03-10 15:48:07,593 INFO [com.ery.integrator.erpcrm.schedular.CustomerTeamsJmsServiceImpl] (EJB default - 2) In CustomerTeamsJmsServiceImpl: ******************************** Batch Processing Started ********************************
2021-03-10 15:48:07,593 INFO [com.ery.integrator.erpcrm.schedular.CustomerTeamsJmsServiceImpl] (EJB default - 2) In CustomerTeamsJmsServiceImpl: ******************************** Batch No. 22| Total 182| Size:5000 Started ********************************
2021-03-10 16:14:11,227 INFO [com.ery.integrator.erpcrm.schedular.CustomerTeamsJmsServiceImpl] (EJB default - 2) In CustomerTeamsJmsServiceImpl: ******************************** Batch No.22 Pushed and Flushed ********************************
在我们插入和更新的数据库级别不涉及复合键。
CREATE TABLE "MDATA"."CUSTOMER_TEAMS"
( "ACCOUNT_REGISTRY_ID" VARCHAR2(30 BYTE),
"EDGE_ACCOUNT_ID" VARCHAR2(150 BYTE),
"ACCOUNT_OWNER_EMAIL" VARCHAR2(250 BYTE),
"CRT_MEMBER_EMAIL" VARCHAR2(250 BYTE),
"ROLE_NAME" VARCHAR2(150 BYTE),
"SOURCE" VARCHAR2(30 BYTE),
"PERSON_PARTY_ID" NUMBER(15,0),
"DELETED_IN_TERP" VARCHAR2(30 BYTE),
"DELETED_DATE" DATE,
"LAST_MODIFIED_DATE" DATE NOT NULL ENABLE
)
但在 JPA 中,我们在前四列上有复合键。@Id 和更新发生在这四个复合键上
如何对数据库表进行性能调优以使过程快速进行?到目前为止,数据库级别没有主键,也没有索引。请建议
解决方案
首先为您的表创建一些约束和索引是一个很好的做法(我会说默认做法)。如果您UPDATE
有一个WHERE
子句(可能它有),则索引的存在是一个重要因素。
然后你可以考虑以下几点: 在 Oracle 中有一种叫做“批量处理”的东西。如果您在同时选择/插入/更新大量记录时使用它,则操作的性能会好得多。
- 这是 Stack Overflow 上关于如何使用 JPA 批量插入的问题:How to do bulk (multi row) inserts with JpaRepository?
- 这是 Oracle 博客中的一篇文章,详细解释了使用 PL/SQL 进行批量处理:使用 BULK COLLECT 和 FORALL 进行批量处理
在谈论 Oracle 的性能时,还需要考虑其他因素:
- Oracle 版本:例如,Oracle Enterprise 和 Oracle XE 在优化特性方面存在巨大差距。
- 硬件:硬盘 I/O 速度、CPU 和 RAM 也很重要。
如果您仍然无法获得可接受的时间,您可以尝试更深入地挖掘并为您的会话启用跟踪,以便您可以使用更多数据:使用 Oracle 跟踪
推荐阅读
- flash - 对 QSPI FLASH 的 XIP (eXecute In Place) 功能感到困惑
- sql-server - EF Core ExecuteSqlCommandAsync:将 nvarchar 值“1,2”转换为数据类型 int 时转换失败
- c# - 如何修复“无法从 'bool' Customer.Data.SelectTransactionViewModel 转换”
- angular - (Angular2/4/5/6) 如何根据国家/地区验证国际电话号码的长度
- python - 通过不和谐机器人为每个人设置唯一的关键字
- javascript - 每小时触发器导致每小时发送电子邮件警报,但只需要第一次
- wpf - 在 WPF 中,是否可以将 ItemsControl 的 ItemContainerGenerator.StatusChanged 事件作为 MVVM 模式命令获取?
- .htaccess - 如何从子域中删除文件夹名称
- c# - 当关系应该是隐式的时,如何避免显式定义泛型类型参数?
- c++ - filter2D 实现的差异