【问题标题】:Oracle Merge vs Select then Insert or UpdateOracle 合并与选择然后插入或更新
【发布时间】:2012-09-05 03:35:35
【问题描述】:

什么更快?

合并语句

    MERGE INTO table_name 
     USING dual
     ON (row_id = 'some_id')
    WHEN MATCHED THEN
     UPDATE SET col_name = 'some_val'
    WHEN NOT MATCHED THEN
     INSERT (row_id, col_name)
     VALUES ('some_id', 'some_val')

或

查询 select 语句,然后使用 update 或 insert 语句。

    SELECT * FROM table_name where row_id = 'some_id'

如果 rowCount == 0

    INSERT INTO table_name (row_id,col_name) VALUES ('some_id','some_val')

其他

    UPDATE table_name SET col_name='some_val' WHERE row_id='some_id'

【问题讨论】:

    标签: sql oracle sql-merge


    【解决方案1】:

    经验法则是,如果你可以在一个 SQL 中执行,它通常会比在多个 SQL 语句中执行更好。

    如果它可以完成工作,我会选择 MERGE。

    另外 - 另一个建议:您可以避免在语句中重复数据,例如:

    MERGE INTO table
     USING (SELECT 'some_id' AS newid,
                   'some_val' AS newval
            FROM dual)
     ON (rowid = newid)
    WHEN MATCHED THEN
     UPDATE SET colname = newval
    WHEN NOT MATCHED THEN
     INSERT (rowid, colname)
     VALUES (newid, newval)
    

    【讨论】:

    • 我也是这么想的,但是oracle服务器上的进程呢?
    • 是的,我收集到了 - 但我说的是列名的选择,它与 oracle 的 ROWID 伪列冲突。
    • 不知道为什么我的答案在信息不准确的情况下存活了这么久。生活和学习,我猜。
    • 如果我在 PRO*C 代码中使用主机数组与类似查询进行批量合并,批量合并是否会比先进行查询然后使用主机数组批量插入/更新更好?请发表评论。随着音量的增加,它会降低性能吗?
    • @Dr.DebasishJana,您更有可能通过提出新问题得到有用的答案。另外,它是免费的!
    【解决方案2】:

    注意合并。它可以使用HASH JOIN 占用您的大部分区域TEMP。使用提示FIRST_ROWS 测试他或使用UPDATE 视图加入加上INSERT 和NOT EXISTS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      相关资源
      最近更新 更多