如何提高SQL插入查询性能?

如何提高SQL插入查询性能?,sql,oracle,Sql,Oracle,当我从一个表中查询数据(大约8300万行)并将其插入同一模式中的另一个表时,响应时间非常长。这几乎需要一个半小时。查询如下所示: INSERT INTO TABLE_A ( DIM_KEY, CLIENT_KEY, CONSUMER_DIM_KEY, PRCS_WK ) ( (( (SELECT DIM_KEY, client_KEY, consumer_dim_key, prcs_WK FR

当我从一个表中查询数据(大约8300万行)并将其插入同一模式中的另一个表时,响应时间非常长。这几乎需要一个半小时。查询如下所示:

INSERT
INTO TABLE_A
  (
    DIM_KEY,
    CLIENT_KEY,
    CONSUMER_DIM_KEY,
    PRCS_WK
  )
  (
    ((
    (SELECT DIM_KEY,
      client_KEY,
      consumer_dim_key,
      prcs_WK
    FROM
          (*SELECT DISTINCT DIM_KEY,
        client_KEY,
        prcs_WK,
        consumer_dim_key,
        SUM(SALE_AMOUNT) OVER(PARTITION BY CONSUMER_DIM_KEY) AS SALE_AMOUNT
          FROM FACT_TABLE
          WHERE DIM_KEY  = '300067'
          AND CRITERIA_ID   = '1234'
          AND IS_EXISTS = 'N'*
      )
    WHERE SALE_AMOUNT > 0
    )
  UNION
    (SELECT DIM_KEY,
      client_KEY,
      consumer_dim_key,
      prcs_WK
    FROM
          (*SELECT DISTINCT DIM_KEY,
        client_KEY,
        prcs_WK,
        consumer_dim_key,
        SUM(SALE_AMOUNT) OVER(PARTITION BY CONSUMER_DIM_KEY) AS SALE_AMOUNT
          FROM FACT_TABLE
          WHERE DIM_KEY  = '300067'
          AND CRITERIA_ID   = '1235'
          AND IS_EXISTS = 'N'*
      )
    WHERE SALE_AMOUNT > 0
    ))
  UNION
    (SELECT DIM_KEY,
      client_KEY,
      consumer_dim_key,
      prcs_WK
    FROM
          (*SELECT DISTINCT DIM_KEY,
        client_KEY,
        prcs_WK,
        consumer_dim_key,
        SUM(SALE_AMOUNT) OVER(PARTITION BY CONSUMER_DIM_KEY) AS SALE_AMOUNT
          FROM FACT_TABLE
          WHERE DIM_KEY  = '300067'
          AND CRITERIA_ID   = '1236'
          AND IS_EXISTS = 'N'*
      )
    WHERE SALE_AMOUNT > 0
    ))
  )
这里所有的表都在同一个模式中。 标记为*的查询返回的行数为:

Sub-query 1: 80 million rows Sub-query 2: 3.1 million rows Sub-query 3: 0.2 million row 子查询1:8000万行 子查询2:310万行 子查询3:20万行
  • 您可以尝试使用提示使oracle在HWM标记上写入新数据
  • 如果您有索引,oracle会浪费一些时间来更新它们。您还可以禁用它们并在插入完成后重建
  • 另外,如果有8300万行,那么insert将生成大量重做信息。要禁用表的重做日志生成,请使用:
    altertable YOUR_table nologging
  • 还可以使用异步写入联机重做日志
  • 您可以设置作业队列以在后台计划长时间运行的操作。多读多用
  • 你可以用

这是我在没有解释计划的情况下可以给你的所有建议。

向我们展示执行计划和表的定义,包括所有索引。谢谢Zaratutra!谢谢你的建议。我将尽我所能。