Sql обновление занимает 4 дня для 10 миллионов записей - PullRequest
2 голосов
/ 28 марта 2019

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

1.) Я уже создал индекс для обновления критериев поиска для tax_ledger_item_tab.индекс создан на party_type, личность, компания.Мои критерии поиска: party_type, identity, company, delivery_type_id в качестве следующего заданного запроса, эти столбцы не являются ключами в таблице.

Я считаю, что не могу добавить delivery_type_id для индекса, поскольку он будет обновляться запросом., если я добавлю, что в индекс производительность будет наихудшей.

2.) временная таблица identity_invoice_info_cfv также вернет также 70000 записей.

Пока я считаю, что стоимость моего плана выполнения обновления будет примерно равна70000 * 10 миллионов записей.

Как повысить производительность с помощью следующего запроса на обновление?Я только хочу обновить delivery_type_id, только извлеченные столбцы.

DECLARE

CURSOR get_records IS
  SELECT i.COMPANY, i.IDENTITY, i.CF$_DELIVERY_TYPE
    FROM identity_invoice_info_cfv i
   WHERE i.PARTY_TYPE_DB = 'CUSTOMER';

BEGIN

  FOR rec_ IN get_records LOOP
  dbms_output.put_line  (sysdate ); 

    UPDATE tax_ledger_item_tab t
       SET t.delivery_type_id = rec_.CF$_DELIVERY_TYPE, t.fetched = 'TRUE'
     WHERE t.party_type = 'CUSTOMER'
       AND t.identity = rec_.IDENTITY
       AND t.company = rec_.COMPANY
       AND t.delivery_type_id IS NULL;

    COMMIT;  

  END LOOP;

 END;

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Используйте оператор MERGE:

Установка Oracle :

CREATE TABLE identity_invoice_info_cfv ( COMPANY, IDENTITY, CF$_DELIVERY_TYPE, PARTY_TYPE_DB ) AS
SELECT 'A', 123, 456, 'CUSTOMER' FROM DUAL;

CREATE TABLE tax_ledger_item_tab ( identity, company, party_type, delivery_type_id, fetched ) AS
SELECT 123, 'A', 'CUSTOMER', CAST( NULL AS NUMBER ), 'FALSE' FROM DUAL;

Слияние :

MERGE INTO tax_ledger_item_tab t
USING identity_invoice_info_cfv i
ON (
    t.identity      = i.identity
AND t.company       = i.COMPANY
AND t.party_type    = 'CUSTOMER'
AND i.PARTY_TYPE_DB = 'CUSTOMER'
)
WHEN MATCHED THEN
  UPDATE
  SET delivery_type_id = i.CF$_DELIVERY_TYPE,
      fetched          = 'TRUE'
  WHERE t.delivery_type_id IS NULL;

Запрос :

SELECT * FROM tax_ledger_item_tab;

Выход :

IDENTITY | COMPANY | PARTY_TYPE | DELIVERY_TYPE_ID | FETCHED
-------: | :------ | :--------- | ---------------: | :------
     123 | A       | CUSTOMER   |              456 | TRUE   

дБ <> скрипка здесь

2 голосов
/ 28 марта 2019

Я надеюсь, что вы также можете достичь этого, используя Merge Statement. Ниже приведен код для того же. Пожалуйста, проверьте с вашей стороны некоторые образцы данных, а затем продолжайте.

  Merge into tax_ledger_item_tab t
  using identity_invoice_info_cfv i
      on (t.party_type ='CUSTOMER' and t.identity=i.IDENTITY 
         and t.company = i.COMPANY  and i.PARTY_TYPE_DB = 'CUSTOMER')
       when matched then
             update set  
              t.delivery_type_id=i.CF$_DELIVERY_TYPE,
              t.fetched = 'TRUE' 
            where t.delivery_type_id IS NULL;
        commit;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...