我有一个表 DASHBOARD,其主键为 PERSON_ID。
我想使用 MERGE 语句为每个列填充所有 PERSON_ID,该语句查询另一个表的计数 ALERT_EVENTS。
我已经为每一列编写了 MERGE 语句,下面是其中一个查询 -
MERGE INTO DASHBOARD D
USING
(SELECT PERSON_ID FROM PERSON) P
ON (D.PERSON_ID = P.PERSON_ID)
WHEN MATCHED THEN
UPDATE SET D.ZONES = (SELECT COUNT(EVENT_ID) FROM ALERT_EVENTS WHERE PERSON_ID = P.PERSON_ID AND EMAIL_ALERT_TYPE_ID = '40') WHERE D.PERSON_ID = P.PERSON_ID
WHEN NOT MATCHED THEN
INSERT (D.PERSON_ID)
VALUES (P.PERSON_ID);
我的问题是这个查询运行时间太长,通常大约 50 分钟。
DASHBOARD 表中有 4000 个 PERSON_ID,ALERT_EVENTS 表中有 140 万个 EVENT_ID。ALERT_EVENTS 表由以下列组成 -
"EVENT_ID" NUMBER(*,0) NOT NULL ENABLE,
"PERSON_ID" NUMBER(*,0) NOT NULL ENABLE,
"DEVICE_ID" NUMBER(*,0) NOT NULL ENABLE,
"ALERT_TYPE_ID" NUMBER(*,0) NOT NULL ENABLE,
"EVENT_DATE_TIME" DATE NOT NULL ENABLE,
"TEXT" VARCHAR2(4000 BYTE),
"STATUS" NUMBER(*,0) DEFAULT 0 NOT NULL ENABLE,
"PROC_STATUS_ID" NUMBER(*,0) DEFAULT 1 NOT NULL ENABLE,
"ALERT_STATUS_ID" NUMBER DEFAULT 1 NOT NULL ENABLE
and one UNIQUE index on EVENT_ID.
我尝试添加和删除索引(尝试使用 1 个索引和 3 个索引),这似乎对性能没有帮助。
根据我的解释计划(如下),我相信我有一个表结构问题,因为我的数据库在执行 MERGE 语句时总是想做一个 FULL TABLE SCAN。
Operation Name Rows Bytes Cost (%CPU) Time
MERGE STATEMENT 4127 314K 21 (5) 00:00:01
MERGE DASHBOARD
VIEW
HASH JOIN OUTER 4127 120K 21 (5) 00:00:01
INDEX FAST FULL SCAN PK_PERSON 4127 16508 4 (0) 00:00:01
TABLE ACCESS FULL DASHBOARD 4215 107K 16 (0) 00:00:01
SORT AGGREGATE 1 7
TABLE ACCESS FULL ALERT_EVENTS 27 189 5247 (2) 00:01:03
我打算对表进行分区,但我们只有 Oracle 标准版,没有企业版,所以它不是包含的功能。
如何在不使用分区的情况下加快此合并语句?
我正在考虑丢弃大部分行,这会有所帮助,但潜在的问题仍然存在。
我在这里想念什么?
提前感谢您的任何想法。