您好,我有两个表,每个表都有数百万行。我有 oracle 11 g R1 我相信我们中的许多人一定都经历过这种情况。
从一个表更新到另一个值不同的表的最有效和最快速的方法是什么。
例如:表 1 有 4 个高精度的 NUMBER 列例如:0.2212454215454212
表 2 有 6 列。 根据两个表上的公共(public)列更新表 2 的四列,仅更新不同的列。
我有这样的东西
DECLARE
TYPE test1_t IS TABLE OF test.score%TYPE INDEX BY PLS_..;
TYPE test2_t IS TABLE OF test.id%TYPE INDEX BY PLS..;
TYPE test3_t IS TABLE OF test.Crank%TYPE INDEX BY PLS..;
vscore test1_t;
vid test2_t;
vurank test4_t;
BEGIN
SELECT id,score,urank
BULK COLLECT INTO vid,vscore,vurank
FROM test;
FORALL i IN 1 .. vid.COUNT
MERGE INTO final T
USING (SELECT vid (i) AS o_id,
vurank (i) AS o_urank,
vscore (i) AS o_score FROM DUAL) S
ON (S.o_id = T.id)
WHEN MATCHED THEN
UPDATE SET T.crank = S.o_crank
WHERE T.crank <> S.o_crank;
既然数字是高精度的,它会变慢吗?
我尝试了 Bulk Collect 和 Merge 组合,如果我必须更新 100 万行,最坏的情况下仍然需要 30 分钟。
rowid有什么用吗? 我们将不胜感激。
最佳答案
如果你想更新所有的行,那么只需要使用update:
update table_1
set (col1,
col2) = (
select col1,
col2
from table2
where table2.col_a = table1.col_a and
table2.col_b = table1.col_b)
批量收集或任何 PL/SQL 技术总是比纯 SQL 技术慢。
数字精度可能不重要,并且 rowid 不相关,因为两个表之间没有公共(public)值。
关于sql - 使用 rowids 将百万行从一个表更新到另一个 Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17156137/