【问题标题】:which is better method? map by rowid or column哪种方法更好?按 rowid 或列映射
【发布时间】:2014-04-28 14:59:37
【问题描述】:

请给我推荐更好的代码

方法(A)

        MERGE /*+ Idx_Mrx_Strategy */INTO stgMurex m
        USING
        (
            SELECT  m.RowId  AS mRowId
            FROM    stgMurex m
            INNER JOIN LovDF_EMIR t
            ON      m.Strategy = t.Strategy
            WHERE   t.NonDF = 'Y'

        ) l
        ON (m.RowId = l.mRowId)
        WHEN MATCHED THEN
            UPDATE SET
                m.DF = 'N'
        WHERE   m.DF IS NULL
        ;
行计划 199448 合并声明 合并 STGMUREX 看法 199448 哈希连接 199448 哈希连接 130 表访问完全 LOVDF_EMIR 576864 表访问完全 STGMUREX 1426340 表访问全 STGMUREX

方法(B)

        MERGE INTO stgMurex m
        USING
        (
            SELECT  t.Strategy 
            FROM    LovDF_EMIR t
            WHERE   t.NonDF = 'Y'
        ) l
        ON (m.Strategy = l.Strategy)
        WHEN MATCHED THEN
            UPDATE SET
                m.DF = 'N'
        WHERE m.DF IS NULL 
        ;
行计划 199448 合并声明 合并 STGMUREX 看法 199448 哈希连接 130 表访问完全 LOVDF_EMIR 576864 表访问完全 STGMUREX

我可以说方法 B 最好吗?

【问题讨论】:

  • 为什么只在更新时才使用合并而不是更新?
  • @Franek 我怀疑这是因为 Oracle 在更新语句中不支持JOIN,而这个问题很容易通过JOIN 解决。

标签: sql performance oracle join


【解决方案1】:

我想(假设“从驱动表返回的成功行的百分比很小”这可能是由 "t.NonDF = 'Y'" 引起的)比使用 join 合并更有效的是:

UPDATE stgMurex m
SET m.DF    = 'N'
WHERE m.DF IS NULL
AND EXISTS
(SELECT 1 FROM LovDF_EMIR t WHERE t.NonDF = 'Y' AND m.Strategy = t.Strategy
);

这里有很好的解释:http://www.toadworld.com/platforms/oracle/w/wiki/4778.table-joins-versus-exists.aspx

【讨论】:

  • 假设从驱动表返回的查询很大。现在哪一个更好。方法 A 还是 B?
  • 请提供所有三个查询的解释计划。回答你的问题会更容易。我想 A 和 B 非常相似 - 我想将它们与我的陈述进行比较。
猜你喜欢
  • 2012-02-08
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
相关资源
最近更新 更多