Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 提高oracle中Merge语句的性能_Sql_Oracle_Performance_Merge - Fatal编程技术网

Sql 提高oracle中Merge语句的性能

Sql 提高oracle中Merge语句的性能,sql,oracle,performance,merge,Sql,Oracle,Performance,Merge,我有下面的合并查询,它对于小数据集来说工作得很好,但对于800000k行来说,执行它需要40分钟以上 在这个合并查询中,我试图使用Insert/Update/Delete执行增量导入逻辑。对于具有唯一columnID_LL_ID_UU,TKR组合的新数据,我希望插入数据,否则将进行更新。删除,从测试数据表中删除测试数据表中不存在的数据 如何改进此查询中的性能?是否有其他有效编写此查询的方法 MERGE INTO TEST_RUA_MER T USING ( SELECT

我有下面的合并查询,它对于小数据集来说工作得很好,但对于800000k行来说,执行它需要40分钟以上

在这个合并查询中,我试图使用Insert/Update/Delete执行增量导入逻辑。对于具有唯一columnID_LL_ID_UU,TKR组合的新数据,我希望插入数据,否则将进行更新。删除,从测试数据表中删除测试数据表中不存在的数据

如何改进此查询中的性能?是否有其他有效编写此查询的方法

MERGE
  INTO TEST_RUA_MER T
  USING (
         SELECT  T.ROWID T_RID,
                 CASE
                   WHEN S.ROWID IS NULL THEN 1
                   WHEN     DECODE(S.CLASS,T.CLASS,1) = 1
                        AND
                            DECODE(S.NAME,T.NAME,1) = 1
                     THEN 1
                 END DELETE_FLAG,
                 S.*
           FROM      TEST_RUA S
                 FULL JOIN
                     TEST_RUA_MER T
                   ON(
                          DECODE(T.ID_LL,S.ID_LL,1) = 1
                      AND
                          DECODE(T.ID_UU,S.ID_UU,1) = 1
                      AND
                          DECODE(T.TKR,S.TKR,1) = 1
                     )
        ) S
  ON (
          T.ROWID = S.T_RID
     )
  WHEN MATCHED
    THEN
      UPDATE
         SET T.CLASS = S.CLASS,
             T.NAME  = S.NAME
      DELETE WHERE S.DELETE_FLAG = 1
  WHEN NOT MATCHED
    THEN
      INSERT
      VALUES(
             S.CLASS,
             S.ID_LL,
             S.ID_UU,
             S.TKR,
             S.NAME
            )
为什么要使用DECODE函数而不只是检查值是否相等?只要联接中使用的列被正确索引,这将返回相同的结果,并有望提高性能

合并到测试集 使用SELECT T.ROWID T_RID, 案例 当S.ROWID为空时,则为1 当S.CLASS=T.CLASS且S.NAME=T.NAME时,则为1 结束删除_标志, 美国* 来自TEST_RUA S 完全连接测试 在T.ID_LL=S.ID_LL和T.ID_UU=S.ID_UU和T.TKR=S.TKR S上 关于T.ROWID=S.T\u RID 匹配时 然后 更新集T.CLASS=S.CLASS,T.NAME=S.NAME 删去 其中S.DELETE_标志=1 当不匹配时 然后 插入值S.CLASS, 美国律师协会, S.ID_UU, S.TKR, 美国名字
您是否可以在没有完全联接的情况下进行查询,这可能会对您有所帮助,或者您是否尝试了更新语句瓶颈在哪里?执行计划是否显示任何迹象?@hkandpal update运行速度更快。@eshirvana我检查了解释计划,发现大部分cpu成本是通过以下方式产生的:哈希连接右外部系统。查看散列连接外部存储库查询工作更快,但问题是现在查询逻辑已更改…现在它不处理唯一值ID_LL或ID_UU或TKR的null值…因此,当这些值中的任何一个为null时,它不检查delta逻辑decode的显著优点是它将null视为等于null-与直接相等不同检查如果你不熟悉解码,不要问OP,您只需快速搜索即可找到。@mathguy实际上我有点困惑,为什么唯一组合现在不处理空值,因为OP已经编写了与decode相同的直接eaulity检查。.实际上,我删除了decode部分,因此它不能正确处理delta逻辑的空值…例如,当任何字段都不会从TEST\u RUA\u MER表中删除数据,即使该行与TEST\u RUA表相同,我们是否可以在此处单独创建Delete以降低性能,但问题是,我们是否需要在Delete中处理空值,或者使用现有的oracle功能(如果有)?