sql - 使用 rowids 将百万行从一个表更新到另一个 Oracle

标签 sql database oracle plsql

您好,我有两个表,每个表都有数百万行。我有 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/

相关文章:

sql - Access 2007、Oracle 和 SQL Server 中的列/表分隔符

python - 是否可以停止 sqlite 将双引号标识符视为字符串?

MySQL NOT IN 语法可转换为 JOIN?

Oracle - 如何从 YEAR、WEEKNUM 和 WEEKDAY 获取日期?

oracle - Oracle user_constraints 表constraint_type 列中的字母代码代表什么?

sql - 两个表上的并集,其中一个带有 where 子句

php - Laravel:静态::创建与数据库:插入

c# - MVC 添加记录到数据库

ios - 核心数据 : How do I add additional entities to an existing many-to-many relationship

java - 为什么 ResultSet 在使用字符串作为值的查询中少了一个字符?