【发布时间】:2019-03-28 06:55:23
【问题描述】:
我想从一个临时表更新一个包含超过 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;
【问题讨论】:
-
为什么要使用光标??
-
我同意帕特里克的观点。使用带有单个提交的单个 UPDATE 语句可能会更快
-
游标会读取临时表数据并循环遍历整个记录。是否有任何解决方法来增强此更新标准?
-
所以这个游标需要从临时表中获取数据并使用游标读取值更新 tax_ledger_item_tab。
-
赞成只是因为这是一个有效的问题,不值得反对。分享知识。
标签: oracle plsql query-performance