与 select 查询相比,插入查询需要更多时间来执行
Insert query takes more time to execute as compared to select query
我有一个奇怪的问题,但我没有找到解决方案。我有以下查询,执行时间超过 5 分钟。查询性能非常慢,即使我插入的记录很少。如果我删除插入语句并仅运行 select 查询语句,则查询将在 2 到 5 秒内执行。这背后的问题是什么?在这种情况下如何提高插入查询性能?
INSERT INTO TEMP_SERVICE_OPTION_EXTRACTION(ID,ICC,ASSIGNED_ANUMBER_ID,SERVICE_ID,PRODUCT_OPTION_ID,STATUS_ID,END_DATE,ORDER_NUMBER)
Select DISTINCT(SO.ID),SIM.ICC,SIM.ASSIGNED_ANUMBER_ID,SO.SERVICE_ID,SO.PRODUCT_OPTION_ID,SO.STATUS_ID,SO.END_DATE,DCR.SHOP_ORDER_NUMBER FROM
SIMCARD@FONIC_RETAIL SIM
JOIN SERVICE_OPTION@FONIC_RETAIL SO ON SO.SERVICE_ID=SIM.ASSIGNED_TO_SERVICE_ID
JOIN DANGAARD_CONFIRM_RECORD@FONIC_RETAIL DCR ON DCR.ICC = SIM.ICC
where SO.STATUS_ID IN (20,40)
and SO.ID < to_char(SYSDATE - numtodsinterval ( 1,'MINUTE' ), 'YYYYMMDDHH24MISS')||'0000'
and SO.ID > to_char(SYSDATE - numtodsinterval ( 1, 'HOUR' ), 'YYYYMMDDHH24MISS')||'0000'
在这种情况下使用带有 for 循环的匿名 PL/SQL 块(每步仅插入 1 行):
begin
for r in (
Select DISTINCT (SO.ID),SIM.ICC,SIM.ASSIGNED_ANUMBER_ID,SO.SERVICE_ID,SO.PRODUCT_OPTION_ID,SO.STATUS_ID,SO.END_DATE,DCR.SHOP_ORDER_NUMBER
FROM SIMCARD@FONIC_RETAIL SIM
JOIN SERVICE_OPTION@FONIC_RETAIL SO ON SO.SERVICE_ID=SIM.ASSIGNED_TO_SERVICE_ID
JOIN DANGAARD_CONFIRM_RECORD@FONIC_RETAIL DCR ON DCR.ICC = SIM.ICC
where SO.STATUS_ID IN (20,40)
and SO.ID < to_char(SYSDATE - numtodsinterval ( 1,'MINUTE' ), 'YYYYMMDDHH24MISS')||'0000'
and SO.ID > to_char(SYSDATE - numtodsinterval ( 1, 'HOUR' ), 'YYYYMMDDHH24MISS')||'0000'
) loop
INSERT INTO TEMP_SERVICE_OPTION_EXTRACTION(ID,ICC,ASSIGNED_ANUMBER_ID,SERVICE_ID,PRODUCT_OPTION_ID,STATUS_ID,END_DATE,ORDER_NUMBER)
VALUES (r.ID,r.ICC,r.ASSIGNED_ANUMBER_ID,r.SERVICE_ID,r.PRODUCT_OPTION_ID,r.STATUS_ID,r.END_DATE,r.SHOP_ORDER_NUMBER);
COMMIT;
end loop;
end;
如果这没有帮助,您必须 ALTER TABLE TEMP_SERVICE_OPTION_EXTRACTION SHRINK SPACE
(如 Slow query execution in an empty table. (after deleting a large amount of inserts) 中的建议)。
由于您对所有表都使用了 DB 链接,因此您必须检查连接是如何实现的 (EXEC PLAN)。它可能在 "your" 侧或 "remote" 侧加入。尝试使用这些连接在远程端创建一个视图。如果在你这边加入 Oracle 必须从所有表中获取 "all" 行,将它们放入 TEMP 然后执行查询。
PS: Oracle 文档也解释了在有条件的情况下,分布式查询可能会使用远程端的索引。
使用 Google 并搜索 "db link" 和 "distributed query performance"
我有一个奇怪的问题,但我没有找到解决方案。我有以下查询,执行时间超过 5 分钟。查询性能非常慢,即使我插入的记录很少。如果我删除插入语句并仅运行 select 查询语句,则查询将在 2 到 5 秒内执行。这背后的问题是什么?在这种情况下如何提高插入查询性能?
INSERT INTO TEMP_SERVICE_OPTION_EXTRACTION(ID,ICC,ASSIGNED_ANUMBER_ID,SERVICE_ID,PRODUCT_OPTION_ID,STATUS_ID,END_DATE,ORDER_NUMBER)
Select DISTINCT(SO.ID),SIM.ICC,SIM.ASSIGNED_ANUMBER_ID,SO.SERVICE_ID,SO.PRODUCT_OPTION_ID,SO.STATUS_ID,SO.END_DATE,DCR.SHOP_ORDER_NUMBER FROM
SIMCARD@FONIC_RETAIL SIM
JOIN SERVICE_OPTION@FONIC_RETAIL SO ON SO.SERVICE_ID=SIM.ASSIGNED_TO_SERVICE_ID
JOIN DANGAARD_CONFIRM_RECORD@FONIC_RETAIL DCR ON DCR.ICC = SIM.ICC
where SO.STATUS_ID IN (20,40)
and SO.ID < to_char(SYSDATE - numtodsinterval ( 1,'MINUTE' ), 'YYYYMMDDHH24MISS')||'0000'
and SO.ID > to_char(SYSDATE - numtodsinterval ( 1, 'HOUR' ), 'YYYYMMDDHH24MISS')||'0000'
在这种情况下使用带有 for 循环的匿名 PL/SQL 块(每步仅插入 1 行):
begin
for r in (
Select DISTINCT (SO.ID),SIM.ICC,SIM.ASSIGNED_ANUMBER_ID,SO.SERVICE_ID,SO.PRODUCT_OPTION_ID,SO.STATUS_ID,SO.END_DATE,DCR.SHOP_ORDER_NUMBER
FROM SIMCARD@FONIC_RETAIL SIM
JOIN SERVICE_OPTION@FONIC_RETAIL SO ON SO.SERVICE_ID=SIM.ASSIGNED_TO_SERVICE_ID
JOIN DANGAARD_CONFIRM_RECORD@FONIC_RETAIL DCR ON DCR.ICC = SIM.ICC
where SO.STATUS_ID IN (20,40)
and SO.ID < to_char(SYSDATE - numtodsinterval ( 1,'MINUTE' ), 'YYYYMMDDHH24MISS')||'0000'
and SO.ID > to_char(SYSDATE - numtodsinterval ( 1, 'HOUR' ), 'YYYYMMDDHH24MISS')||'0000'
) loop
INSERT INTO TEMP_SERVICE_OPTION_EXTRACTION(ID,ICC,ASSIGNED_ANUMBER_ID,SERVICE_ID,PRODUCT_OPTION_ID,STATUS_ID,END_DATE,ORDER_NUMBER)
VALUES (r.ID,r.ICC,r.ASSIGNED_ANUMBER_ID,r.SERVICE_ID,r.PRODUCT_OPTION_ID,r.STATUS_ID,r.END_DATE,r.SHOP_ORDER_NUMBER);
COMMIT;
end loop;
end;
如果这没有帮助,您必须 ALTER TABLE TEMP_SERVICE_OPTION_EXTRACTION SHRINK SPACE
(如 Slow query execution in an empty table. (after deleting a large amount of inserts) 中的建议)。
由于您对所有表都使用了 DB 链接,因此您必须检查连接是如何实现的 (EXEC PLAN)。它可能在 "your" 侧或 "remote" 侧加入。尝试使用这些连接在远程端创建一个视图。如果在你这边加入 Oracle 必须从所有表中获取 "all" 行,将它们放入 TEMP 然后执行查询。
PS: Oracle 文档也解释了在有条件的情况下,分布式查询可能会使用远程端的索引。
使用 Google 并搜索 "db link" 和 "distributed query performance"