【问题标题】:Updating a 3 Million record table using LEAD() function使用 LEAD() 函数更新 300 万条记录表
【发布时间】:2019-08-26 13:41:55
【问题描述】:

我需要使用 LEAD() 函数更新 Dimension 表中的 EDW_END_DATE 列,并且该表有 300 万条记录,Oracle 查询似乎一直在运行。

UPDATE
  Edwstu.Stu_Class_D A
SET
  EDW_END_DATE =
  (
    SELECT
      Edw_New_End_Dt
    FROM
      (
        SELECT
          LEAD(Edw_Begin_Date-1,1,'31-DEC-2099') over ( PARTITION BY
          Acad_Term_Code ,Class_Number Order By Edw_Begin_Date ASC) AS
          Edw_New_End_Dt,
          STU_CLASS_KEY
        FROM
          Edwstu.Stu_Class_D)
      B
    WHERE
      A.STU_CLASS_KEY = B.STU_CLASS_KEY
);

【问题讨论】:

  • 您的子查询返回快吗?
  • 是的,它确实返回得很快

标签: sql oracle sql-update


【解决方案1】:

尝试使用 MERGE 语句更新它:

MERGE INTO EDWSTU.STU_CLASS_D A 
USING (
          SELECT
              LEAD(EDW_BEGIN_DATE - 1, 1, '31-DEC-2099') OVER(
                  PARTITION BY ACAD_TERM_CODE, CLASS_NUMBER
                  ORDER BY
                      EDW_BEGIN_DATE ASC
              ) AS EDW_NEW_END_DT,
              STU_CLASS_KEY
          FROM
              EDWSTU.STU_CLASS_D
      )
B ON ( A.STU_CLASS_KEY = B.STU_CLASS_KEY )
WHEN MATCHED THEN 
UPDATE SET A.EDW_END_DATE = B.EDW_NEW_END_DT;

干杯!!

【讨论】:

  • 感谢 Tejas 的宝贵反馈
【解决方案2】:

您正在更新表中的所有行。由于锁定和日志记录,这通常是一项昂贵的操作。

您可以考虑完全重新生成表。注意:在执行此操作之前,请备份表。

-- create the table with the results you want
create table temp_stu_class_d as
    select d.*, lead(Edw_Begin_Date - 1, 1, date '20199-12-31') as Edw_New_End_Dt
    from Edwstu.Stu_Class_D d;

-- remove the contents of the current table
truncate table Edwstu.Stu_Class_D

insert into Edwstu.Stu_Class_D ( . . . , Edw_End_Dt)  -- list the columns here
    select . . . , Edw_New_End_Dt  -- and here
    from temp_stu_class_d;

insert 通常比记录每次更新更有效。

【讨论】:

  • 感谢 Gordon 的宝贵反馈,我会继续努力的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
相关资源
最近更新 更多