Я работаю над таблицей, которая имеет много полей и 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';
Но это не обновляется ни одной строки.
Я бы очень признателен за помощь в решении этой проблемы.
Вы попробовали простой запрос на обновление? –
Что вы сказали, неясно - какие строки должны быть обновлены, чтобы иметь Col4 = Y, строки, где в настоящее время находится Col4 = X, или все остальные строки? Затем - НЕ делайте это в цикле, НЕ используйте курсоры и т. Д., Для завершения которого потребуется два года. Не пытайтесь грабли листья молотком; молоток должен водить гвозди. Грабли листья с граблями. То есть: используйте инструкцию UPDATE (простой SQL, не требуется процедурный код, такой как циклы). – mathguy
Я сомневаюсь, что вы укажете хотя бы пару причин (так что вы подразумеваете под «возвращением 0 строк»?) - во-первых, вы не можете установить col4 = Y, это должно быть = 'Y', а вторая последняя строка неуместна (вы имели в виду WHERE t1. ... и не AND t1. ...?) THEN: Как col1-col4 будет продолжать оставаться первичным ключом, если вы будут иметь дубликаты, изменив значения в col4 на «Y», где бы он не был «X» прямо сейчас? Даже если вы выполняете синтаксис, ограничение первичного ключа должно отклонять большинство изменений. Требование само по себе не имеет смысла! – mathguy