Эффективный способ вставки значений в таблицу Oracle SQL - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть две таблицы, такие как

 create table nodes_tbl as (
 select 'a' as nodeid, 'some string' as dummy_string, 0 as subnetid from dual union all
 select 'b', 'qwe', 0 from dual  union all
 select 'c', 'asd', 0  from dual union all
 select 'd', 'zxc', 0 from dual union all
 select 'e', 'rty', 0 from dual);

И

 create table subnets as (
 select 'a' as nodeid, 1 as subnetid from dual union all
 select 'b', 2 from dual  union all
 select 'c', 2 from dual union all
 select 'd', 3 from dual union all
 select 'e', 4 as nodeid from dual);

С несколькими миллионами записей соединение работает быстро.

select  n.NODEID, n.DUMMY_STRING, s.subnetid
   from nodes_tbl n, subnets s where s.nodeid=n.nodeid 

Запись выполняется быстро, какну

create table test_tbl as  n.NODEID, s.subnetid 
 from nodes_tbl n, subnets s where s.nodeid=n.nodeid  --10M records in 2s.

Однако, когда я пытаюсь обновить таблицу и добавить значения в столбец, запрос очень медленный

      UPDATE nodes_tbl n
       SET subnetid = (SELECT subnetid
                             FROM subnets s
                            WHERE s.nodeid = n.nodeid)
    WHERE EXISTS (
    SELECT subnetid  FROM subnets s
                            WHERE s.nodeid = n.nodeid)  --8 minutes for 100K records

Почему вставка намного медленнее, чем create table изselect заявление?Каков наиболее эффективный способ сделать эту вставку?

Я знаю о опции создания представления, но хочу ее избежать.

1 Ответ

0 голосов
/ 27 февраля 2019

Попробуйте MERGE вместо:

merge into nodes_tbl n
  using (select s.subnetid, s.nodeid 
         from subnets s
        ) x
  on (x.nodeid = n.nodeid)
when matched then update set
  n.subnetid = x.subnetid;

Есть ли улучшения?

Кстати, вы создали индекс для столбца NODEID в обеих таблицах?

...