2016-11-28 3 views
1

Я работаю над таблицей, которая имеет много полей и 100 миллионов данных и имеет составной ключ в некоторых полях. Пример таблица эе с несколькими строками из миллионов показана ниже:Oracle 11g обновление строк в таблице с миллионами записей

+------+------+------+------+ 
| Col1 | Col2 | Col3 | Col4 | 
+------+------+------+------+ 
| 11 | 21 | 31 | X | 
| 12 | 22 | 32 | X | 
| 14 | 24 | 34 | X | 
| 11 | 21 | 31 | 555 | 
| 11 | 21 | 31 | 551 | 
| 12 | 22 | 32 | 89 | 
| 14 | 24 | 34 | 45 | 
+------+------+------+------+ 

Пусть композит ключ над Col1 к Col4. Представьте, что Col1, Col2, Col3 вместе представляют собой идентификатор группы. Первая строка имеет Col4 как X, поэтому мне нужно выбрать все записи из таблицы, Col1 = 11 и Col2 = 21 и Col3 = 31. Затем, поскольку вторая строка равна 12,22,32, «X», мне нужно выбрать все строки с Col1 = 11 и Col2 = 22 и Col3=32. И так далее для всех случаев, где Col4 =X.

Я пробовал использовать для цикла с курсором, но он занимает много времени, так как таблица содержит 100 миллионов данных и составной ключ. Это занимает очень много времени.

Псевдо код оператора цикла я попытался:

result= select Col1,Col2,Col3 from emp where `Col4=X`. 
for each row in result 
do 
    finalresult += select * from table where Col1 = row.Col1 and Col2 = row.Col2 and Col3 = row.Col3 
done 

finalresult иметь все необходимые данные. Но это работает очень долго.

Кроме того, я попытался слияния обновить, как показано ниже

merge into emp t1 
    using (select * from emp t where t.col4=X) t2 
    on t1.col1=t2.col1 
    and t1.col2=t2.col2 
    and t1.col3=t3.col3 
    when matched then update set col4=Y 
and t1.col4!='X'; 

Но это не обновляется ни одной строки.

Я бы очень признателен за помощь в решении этой проблемы.

+1

Вы попробовали простой запрос на обновление? –

+2

Что вы сказали, неясно - какие строки должны быть обновлены, чтобы иметь Col4 = Y, строки, где в настоящее время находится Col4 = X, или все остальные строки? Затем - НЕ делайте это в цикле, НЕ используйте курсоры и т. Д., Для завершения которого потребуется два года. Не пытайтесь грабли листья молотком; молоток должен водить гвозди. Грабли листья с граблями. То есть: используйте инструкцию UPDATE (простой SQL, не требуется процедурный код, такой как циклы). – mathguy

+1

Я сомневаюсь, что вы укажете хотя бы пару причин (так что вы подразумеваете под «возвращением 0 строк»?) - во-первых, вы не можете установить col4 = Y, это должно быть = 'Y', а вторая последняя строка неуместна (вы имели в виду WHERE t1. ... и не AND t1. ...?) THEN: Как col1-col4 будет продолжать оставаться первичным ключом, если вы будут иметь дубликаты, изменив значения в col4 на «Y», где бы он не был «X» прямо сейчас? Даже если вы выполняете синтаксис, ограничение первичного ключа должно отклонять большинство изменений. Требование само по себе не имеет смысла! – mathguy

ответ

0
select * 
    from emp x 
where x.col4 != 'X' 
    and exists (select 1 
       from emp y 
       where x.col1 = y.col1 
        and x.col2 = y.col2 
        and x.col3 = y.col3 
        and y.col4 = 'X') 
Смежные вопросы