【问题标题】:Fine tuning a UPDATE query on a table微调表上的 UPDATE 查询
【发布时间】:2012-08-20 14:11:47
【问题描述】:

我有 2 个表 table1 和 table2 都有大量数据,Table1 有 500 万条,Table2 有 80,000 条记录。我正在运行更新,

Update Table1 a
Set 
a.id1=(SELECT DISTINCT p.col21 
         FROM Table2 p 
         WHERE p.col21 = SUBSTR(a.id, 2, LENGTH(a.id));

查询中的 substr 和 distinct 使其变慢。

  1. 如何重写此查询以加快处理速度和
  2. 我需要索引哪些列

【问题讨论】:

    标签: sql oracle sql-update


    【解决方案1】:

    可能是合并

     merge into Table1 a
      using Table2 p 
      on (p.col21 = SUBSTR(a.id, 2, LENGTH(a.id))
      When matched then
         update set a.id1 = p.col21;
    

    以及a.id 上的基于函数的索引。

    【讨论】:

      【解决方案2】:

      我看到你在动态计算:

      p.col21=SUBSTR(a.id,2,LENGTH(a.id))
      

      这将花费大量时间并且无法创建索引。您是否考虑过实际创建具有该值的列?这将允许您对其进行索引并使其更快。如果 id 是静态的,这似乎很容易获胜。

      【讨论】:

      • “无法创建索引”,不完全正确。您可以创建一个基于函数的索引并使用它。 (oracle-base.com/articles/8i/function-based-indexes.php)。你是对的,虽然这可能是问题所在。
      • 无法使用列 a.id 上的索引,但可以创建 FBI。
      • 谢谢奥利,我不知道。看来这可以解决问题。
      【解决方案3】:

      您的子查询返回多少行,您更新了多少行?随着大量更新,索引可能根本无法帮助您。

      【讨论】:

        猜你喜欢
        • 2015-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        • 2014-09-09
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        相关资源
        最近更新 更多