【问题标题】:T-SQL - stored procedure - "IF EXISTS" vs. "WHERE EXISTS"T-SQL - 存储过程 - “IF EXISTS”与“WHERE EXISTS”
【发布时间】:2014-01-07 18:11:51
【问题描述】:

这样写更好吗:

IF EXISTS (SELECT ...) OR EXISTS (SELECT ...)
  BEGIN
    INSERT INTO myTable
    VALUES ('myValue1', 'myValue1')
  END

或者写:

INSERT INTO myTable
SELECT 'myValue1', 'myValue1'
WHERE EXISTS (SELECT ...) OR EXISTS (SELECT ...)

?

我的意思是在性能和​​可读性方面更好。

皮莱吉

【问题讨论】:

    标签: sql-server tsql stored-procedures if-statement where


    【解决方案1】:

    你应该使用后者,不是真正的效率问题(我怀疑两者之间没有显着差异),但最不可能遇到race condition。如果两个插入同时运行,则在使用第一种方法时,在检查值是否存在和实际执行插入之间,另一个线程插入相同记录的可能性很小。由于检查和插入都是在后者中使用相同的锁完成的,因此这种情况不太可能发生。

    因此,在我看来,就准确性和线程安全的重要性而言,可读性和性能都排在第二位。

    【讨论】:

    • @pileggi 我会写成WHERE EXISTS (SELECT... UNION ALL SELECT ...)
    • 放在同一个语句doesn't prevent the race condition
    • @MartinSmith 正确,我刚刚意识到我的不一致,首先我说使用WHERE EXISTS最不可能满足竞争条件的,但后来说它不会发生使用WHERE EXISTS 方法。我进行了编辑,所以答案是一致的,说它不太可能但仍然不是完美无缺。
    • @MartinSmith 谢谢!那么......避免竞争条件的最佳选择是什么?
    • @pileggi - 取决于您的 SELECT 语句是什么。你没有给我们看。如果您想确保情况在读取和插入之间不会发生变化,您可能需要锁定提示或提高隔离级别。上面链接的第二个答案中有一个使用锁定提示的示例。
    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 2011-12-24
    • 2013-05-09
    • 2016-10-28
    相关资源
    最近更新 更多