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

时间:2014-08-18 13:03:39

标签: 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
    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 个答案:

答案 0 :(得分:3)

  • 您可以尝试使用APPEND提示使oracle在HWM标记上写入新数据。
  • 如果你有索引oracle废物有时候让它们更新。您也可以在插入完成后禁用它们并重建。
  • 此外,如果有8300万行,则插入会生成大量REDO信息。要禁用表的重做日志生成,请使用the nologging optionalter table YOUR_TABLE nologging;
  • 您还可以使用commit_wait, commit_logging tips
  • 将异步写入您的在线重做日志
  • 您可以设置作业队列以在后台安排长时间运行的操作。要阅读更多内容,请使用this
  • 您可以使用parallel DML

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