【问题标题】:Insert query takes more time to execute as compared to select query与选择查询相比,插入查询需要更多时间来执行
【发布时间】:2015-05-05 15:21:36
【问题描述】:

我有一个奇怪的问题,我没有找到解决方案。我有以下查询,执行时间超过 5 分钟。即使我插入的记录很少,查询性能也很慢。如果我删除插入语句并仅运行选择查询语句,则查询将在 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'

【问题讨论】:

  • 您能否为 INSERT 和 SELECT 包含 EXPLAIN PLAN 输出?
  • 我正在使用 sql developer。你能告诉我如何包括解释计划吗?
  • Google 需要 10 秒:community.oracle.com/thread/1114055
  • @Rahul EXPLAIN PLAN FOR SELECT last_name FROM employees;--您在此处的查询此外,这听起来像是一个索引或触发器,或者最坏的情况是聚集索引(修复起来可能会很痛苦) .我们需要制定计划,看看其中哪些正在消耗资源。
  • 当我试图获得解释计划时,它说远程链接,没有其他任何显示。我认为问题是我无法获得远程数据库的解释计划

标签: sql oracle select insert remote-access


【解决方案1】:

在这种情况下使用带有 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) 中的建议)。

【讨论】:

  • 嗨,Pavel,它与您的匿名查询一起工作得非常快。你能解释一下问题是什么吗?它是如何与这个匿名 pl/sql 块一起工作的?
  • @Rahul 单次插入更快,因为分配和锁定更少。这种方法在复杂的查询中帮助了我很多。我认为 Oracle 找不到最佳方法(请参阅解释计划查询与解释计划插入)。
【解决方案2】:

由于您对所有表都使用 DB 链接,因此您必须检查连接是如何实现的(执行计划)。它可以在“您的”一侧或“远程”一侧加入。尝试使用这些连接在远程端创建一个视图。如果加入到您这边,Oracle 必须从所有表中获取“所有”行,将它们放入 TEMP 中,然后执行查询。

PS:Oracle 文档还解释了在 with 条件下,分布式查询可能会在远程端使用索引。

使用谷歌搜索“db link”和“distributed query performance”

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多