Запрос на вставку занимает больше времени для выполнения по сравнению с запросом на выбор

У меня странный вопрос, на который я не нашел решения. У меня есть приведенный ниже запрос, выполнение которого занимает более 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'

person Andrew    schedule 05.05.2015    source источник
comment
Можете ли вы включить выходные данные EXPLAIN PLAN как для INSERT, так и для SELECT?   -  person Mr. Llama    schedule 05.05.2015
comment
Я использую разработчика sql. Подскажите, пожалуйста, как включить EXPLAIN PLAN?   -  person Andrew    schedule 05.05.2015
comment
Google занимает 10 секунд: community.oracle.com/thread/1114055   -  person Mr. Llama    schedule 05.05.2015
comment
@Rahul ОБЪЯСНИТЕ ПЛАН ДЛЯ ВЫБОРА last_name ОТ сотрудников; - ваш запрос здесь. Кроме того, это звучит как индекс или триггер, или в худшем случае кластерный индекс (который может быть болезненным для исправления). Нам нужен план, чтобы увидеть, кто из них поглощает ресурсы.   -  person Randall    schedule 05.05.2015
comment
Когда я пытаюсь получить EXPLAIN PLAN, он говорит об удаленной ссылке, больше ничего не показывает. Я думаю, проблема в том, что я не могу получить EXPLAIN PLAN для удаленной базы данных.   -  person Andrew    schedule 05.05.2015


Ответы (2)


в таком случае используйте анонимный блок PL/SQL с циклом for (на каждом шаге будет вставлена ​​только 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 (как предлагается в Медленное выполнение запроса в пустой таблице (после удаления большого количества вставок)).

person Pavel Gatnar    schedule 05.05.2015
comment
Привет, Павел, он работает очень быстро с вашим анонимным запросом. Не могли бы вы объяснить мне, в чем проблема и как она работает с этим анонимным блоком pl/sql? - person Andrew; 05.05.2015
comment
@Rahul, одна вставка выполняется быстрее из-за меньшего выделения и блокировки. Этот подход очень помог мне в сложных запросах. Я думаю, что Oracle не может найти оптимальный подход (см. «Запрос плана объяснения» и «Вставка плана объяснения»). - person Pavel Gatnar; 05.05.2015

Поскольку вы используете DB Links для всех таблиц, вам необходимо проверить, КАК реализовано соединение (EXEC PLAN). Он может быть присоединен либо на "вашей" стороне, либо на "удаленной" стороне. Попробуйте создать представление на удаленной стороне с помощью этих объединений. При присоединении на вашей стороне Oracle должен получить «все» строки из всех таблиц, поместить их в TEMP, а затем выполнить запрос.

PS: в документации Oracle также объясняется, что при определенных условиях распределенный запрос может использовать индексы на удаленной стороне.

Используйте Google и найдите «ссылка на базу данных» и «производительность распределенных запросов».

person ibre5041    schedule 05.05.2015