【发布时间】:2018-05-22 19:16:19
【问题描述】:
我有一个复杂的要求,即通过连接多个表以查找正确的记录来更新一个表中的一些记录。我编写了以下正在运行的查询,但执行需要 2.5 分钟,这导致我的数据库连接超时。有没有办法通过重写来提高这个查询的效率?我也尝试过 MERGE 方法,这也需要很长时间。我在 EVENT_DYNAMIC_ATTRIBUTE 表中有超过 200 万条记录,在 EVENT 表中有 100 万条记录,在 CATEGORY 表中有 10 万条记录。
UPDATE EVENT_DYNAMIC_ATTRIBUTE eda
SET eda.ATTRIBUTE_VALUE = 'claim',
eda.LAST_UPDATED_DATE = SYSDATE,
eda.LAST_UPDATED_BY = 'superUsers'
WHERE eda.DYNAMIC_ATTRIBUTE_NAME_ID=4002
AND eda.EVENT_ID IN
(SELECT e.EVENT_ID
FROM EVENT e
WHERE e.PRIMARY_CATEGORY_ID IN
(SELECT CATEGORY_ID
FROM CATEGORY START WITH CATEGORY_ID = 495984 CONNECT BY PARENT_ID =
PRIOR CATEGORY_ID));
这是合并查询:
MERGE INTO EVENT_DYNAMIC_ATTRIBUTE eda
USING (SELECT DISTINCT e.EVENT_ID FROM (
SELECT CATEGORY_ID
FROM CATEGORY
START WITH CATEGORY_ID=495984
CONNECT BY PARENT_ID =
PRIOR CATEGORY_ID) CATEGORIES
INNER JOIN EVENT E ON e.PRIMARY_CATEGORY_ID = CATEGORY_ID
INNER JOIN EVENT_DYNAMIC_ATTRIBUTE ed on ed.EVENT_ID = E.EVENT_ID) temp
ON (eda.EVENT_ID = temp.EVENT_ID )
WHEN MATCHED THEN
UPDATE SET eda.ATTRIBUTE_VALUE = 'claim',
eda.LAST_UPDATED_DATE = SYSDATE,
eda.LAST_UPDATED_BY = 'superUser'
WHERE eda.DYNAMIC_ATTRIBUTE_NAME_ID=4002
【问题讨论】:
-
MERGE 可能是实现这一目标的最佳方式
-
在这种情况下我总是确保尝试在您的
ORDER BY ed.rowid子句中添加USING。在带有连接的UPDATE中,它有很大帮助,我怀疑它可能在带有连接的MERGE中有所帮助。请参阅此线程:asktom.oracle.com/pls/asktom/…。我已经看到它提高了 40-60%。
标签: sql oracle oracle11g sql-update inner-join