oracle - 1000万条记录的sql更新需要4天

标签 oracle plsql query-performance

我想更新一个临时表中包含超过 1000 万条记录的数据库表。 但我的更新查询执行了超过 4 天。

1.) 我已经创建了一个索引来更新搜索条件 tax_ledger_item_tab。在 party_type、身份、公司上创建索引。 我的搜索条件是 party_type、identity、company、delivery_type_id 如以下给定查询所示,这些列不是表中的键。

我相信我无法为索引添加delivery_type_id,因为它会 通过查询更新,如果我将其添加到索引中性能将最差。

2.) 临时表identity_invoice_info_cfv也将返回70,000条记录 还有。

到目前为止,我相信我的更新执行计划成本约为 70000*1000 万条记录。

如何通过以下更新查询获得性能增强?我只想更新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;

最佳答案

使用 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   

db<> fiddle here

关于oracle - 1000万条记录的sql更新需要4天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55391750/

相关文章:

oracle - 在oracle包中查找非锚定变量

sql - oracle 中的 ANSI 标准外连接

SQL - 按 ID 分组和从变量起点开始的时间间隔

mysql - 优化比较两个MySQL大表中的数据

java - JPA 中是否可以对多列进行 GroupBy?

sql - 查找任何值出现在另一列中的情况

sql - 当 TRIGGER 需要在同一个表中选择和插入行时发生变异表问题

sql - 1Z0-007 考试题

mysql - INSERT INTO SELECT 在集群上需要很长时间

sql - Redshift/PostgreSQL 中子查询的 GroupAggregate