oracle - 使用 PutDatabaseRecord 处理器进行非常慢的更新
问题描述
我有 2 个PutDatabaseRecord
正在写信给Oracle DB
.
这是架构的一部分:
那里的红色方块不是错误,而是信息消息,因此我将处理器置于 INFO 模式。所以它讲述了获取模式,以及使用 SQL 更新命令“提交因为批量大小”。
问题是,其中第一个:ml_task
,在几分钟内处理数百万条记录,但另一个:ml_sales
- 几个小时内有 1000 条记录的堆栈......这在晚上、当数据库负载很大时和在白天时都会堆栈。
在同一时刻,update goods.ml_[name] set load_date = sysdate
语句通过 SQLDeveloper 接口花费相同的时间 - forml_task
和ml_sales
. 晚上大约需要10分钟,一天需要几分钟。
他们都使用相同的池服务。
这是服务底部的配置:
两个处理器具有相同的配置,除了表名和更新键。
我尝试设置Max Batch Size
为零,它没有影响。
配置的两个处理器都在一个线程中运行,但我尝试配置 10 个线程 - 没有影响。
此外,根本不缺少与数据库的连接,我有大约 10 个处理器,每个处理器都使用一个线程,所以 50 个连接,我认为就足够了。
他们正在处理大约 500 万条记录。
这是 JSON 的ml_task
:
[{"DOC_ID": 1799041400,"LINE_D":694098344,"LOAD_DATE":"16-Jul-21"} ... ]
这类似于 Nifi 的更新ml_task
:
update goods.ml_task
set load_date = sysdate
where doc_id = ?
and line_id = ?;
这是表格:
Name Null? Type
------------- -------- ------
DOC_ID NOT NULL NUMBER
LINE_ID NOT NULL NUMBER
ORG_ID NOT NULL NUMBER
NMCL_ID NOT NULL NUMBER
ASSORTMENT_ID NOT NULL NUMBER
START_DATE NOT NULL DATE
END_DATE DATE
ITEMS_QNT NUMBER
MODIFY_DATE DATE
LOAD_DATE DATE
这是一个 JSON ml_sales
:
[{"REP_DATE":"06-Jul-21","NMCL_ID":336793,"ASSORT_ID":7,"RTT_ID":92,"LOAD_DATE":"16-Jul-21"} ... ]
请求ml_sales
是这样的:
update goods.ml_sales set load_date = sysdate
where nmcl_id = ?
and assort_id = ?
and rtt_id = ?
and rep_date = ?;
和表:
Name Null? Type
----------- -------- ----------
REP_DATE NOT NULL DATE
NMCL_ID NOT NULL NUMBER(38)
ASSORT_ID NOT NULL NUMBER
RTT_ID NOT NULL NUMBER(38)
OUT_ITEMS NUMBER
MODIFY_DATE DATE
LOAD_DATE DATE
更新这么慢的原因是ml_sales
什么?
更新
我把所有的电路都放到了STOP
除了有问题的电路之外,我把所有的会话都放在了SQLDeveloper
......结果是一样的......很长......
更新
正如我上面提到的,我实际上将ml_sales
表复制到了其他方案,这并没有影响结果。
解决方案
我猜Oracle中缺少索引存在问题。我让我们的 DBA 检查 DB 端的问题,他们修复了它,现在UPDATE
工作速度和 table 一样快ml_task
,但不幸的是我仍然不知道问题到底是什么,因此 DBA 离开了。因此,再次,很可能是索引问题。
推荐阅读
- compiler-construction - Lexer 是否应该即时返回令牌列表或令牌
- oracle - ORACLE 数据库的初始化在单元测试中
- python - LSTM 自动编码器噪声重建
- sql - 在日期时间范围之间添加行
- amazon-web-services - AWS Athena WAF 日志
- python - 在 x 时间后中断 while 循环,但在同一级别继续 for 循环
- android - 在 Android 通知中禁用声音(不改变视觉行为)
- swiftui - 自定义导航栏 SwiftUI 上仅显示后退按钮
- elasticsearch - 索引具有通配符时的弹性搜索
- javascript - 动态计算 2 个输入的总和 - Javascript