Загрузка данных или обновление столбца Oracle - sql - PullRequest
0 голосов
/ 18 июня 2020

У меня есть таблица с очень большим объемом (oracle 11g), и я делаю тысячи обновлений, но это с точки зрения производительности занимает часы. Некоторые поля и столбцы из моей таблицы:

DEP     EMP FA  LO  DAC
98001   333 123 124 null
98001   333 321 132 null
98001   333 234 233 null

Вот 1-й метод (запрос выполняется через SQL plus):

WHENEVER SQLERROR EXIT SQL.SQLCODE
UPDATE My_table set DAC= '5' where DEP ='98001' AND  EMP ='333' and FA='123' and LO='124'  
UPDATE My_table set DAC= '8' where DEP ='98001' AND  EMP ='333' and FA='321' and LO='132'  
UPDATE My_table set DAC= '9' where DEP ='98001' AND  EMP ='333' and FA='123' and LO='233'  
… around 10 000 lines
Commit ;

2-й метод (запрос выполняется через SQL plus):

UPDATE My_table
SET DAC = ( 
CASE  
when FA='123' and LO='124'  THEN  '5'
when FA='321' and LO='132'  THEN  '8'
when FA='234' and LO='233'  THEN  '9'
… around 10 000 lines
END) where DEP ='98001' AND  EMP ='333'
AND FA IN ('123', '321', '234', …. around 10 000 FA);

Есть ли более быстрый способ загрузить sql поле? через загрузку только поля в соответствии с условием предложения where? Или вставить мое поле? … Спасибо за помощь.

1 Ответ

0 голосов
/ 18 июня 2020

1-й метод

Создайте один индекс для нескольких столбцов в вашей большой толстой таблице

create index <index_name> on <table_name> (DEP, EMP, FA, LO);

2-й метод

Хотя я сомневаюсь, что это решит вашу проблему с производительностью, есть обходной путь для параметров max 1000 IN.

Вы можете обойти это, сделав сравнение с двумя значениями, как это

UPDATE My_table
SET    DAC = ...
WHERE  DEP ='98001'
AND    EMP ='333'
AND    ('dummy',FA) IN (('dummy','123'),('dummy', '321'), ('dummy','234'), …. around 10 000 FA);

Таким образом, у вас будет максимум 100000 значений.

Другой совет

Проверьте тип данных ваших столбцов DEP, EMP, FA и LO, возможно, вы выполняете сравнение VARCHAR2 и NUMBER. И хотя это работает, oracle выполняет неявное преобразование, чтобы иметь возможность выполнять сравнение, что может вызвать проблемы с производительностью при сравнении множества и множества значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...