EXISTS 在 INSERT 之前还是之后哪个更快?

2024-02-03

我在 SQL Server 中有一个 SP,它每分钟运行数百次,需要根据数据库检查传入流量。目前它执行以下操作

INSERT INTO table
SELECT @value1,@value2 WHERE NOT EXISTS 
(SELECT * FROM table WHERE value1 = @value1 AND value2 = @value2);

不过,我也可以选择

IF NOT EXISTS(SELECT * FROM table WHERE value1 = @value1 AND value2 = @value2)    
   INSERT INTO table (value1,value2) VALUES (@value1,@value2);

哪个会更快?我感觉它们之间没有太大区别,但我历来不太擅长 TSQL...=/

更新:哎呀...意思是说 EXISTS 使用超过 1 个值来查找记录是否存在,因此唯一约束不起作用。编辑示例以反映...


两种变体都是不正确的。您将插入成对的重复@value1、@value2、保证.

处理这个问题的正确方法是对two列并始终插入并处理约束违规:

ALTER TABLE Table ADD CONSTRAINT uniqueValue1Value UNIQUE (value1, values2);

并插入:

BEGIN TRY
   INSERT INTO Table (value1, value2) VALUES (@value1, @value2);
END TRY
BEGIN CATCH
   DECLARE @error_number int, @error_message NVARCHAR(4000), @xact_state INT;
   SET @error_number = ERROR_NUMBER();
   SET @error_message = ERROR_MESSAGE();
   SET @xact_state = XACT_STATE();
   IF (@xact_state = -1)
   BEGIN
     ROLLBACK TRANSACTION;
   END
   IF (@error_number != 2627) /* 2627 is ' Cannot insert duplicate key in object ...' */
   BEGIN
      RAISERROR(N'Error inserting into Table: %i %s', 16,1, @errror_number, @error_message);
   END
ENd CATCH

虽然这些看起来很复杂,但必须考虑一个名为正确性。与基于锁定提示的解决方案相比,这要简单得多。这也是性能最高的解决方案:仅进行一次查找。所有其他解决方案至少需要两次查找(一次用于验证是否可以插入,一次用于插入)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EXISTS 在 INSERT 之前还是之后哪个更快? 的相关文章

随机推荐

  • Angular 8 和 9 中提供和注入“Window”与 Window 之间有什么区别?

    我有两个使用这些版本的 Angular 项目 9 0 0 下一个 6 8 1 0 在版本 9 中我用它来提供和注入window目的 NgModule providers provide Window useValue window expo
  • 使用 Java 重命名文件

    我们可以重命名一个文件吗test txt to test1 txt If test1 txt存在会重命名吗 如何将其重命名为已经存在的 test1 txt 文件 以便将 test txt 的新内容添加到其中以供以后使用 复制自http ex
  • 从 ELF 目标文件转储 C 结构大小

    如何使用调试符号从 ELF 目标文件中提取所有 C 结构的大小 可以使用 print sizeof some struct 从 GDB 获取各个结构大小 但我需要的是获取所有结构的列表 我查看了 nm 和 objdump 但没有看到执行我正
  • MongoDB“无法找到 $geoNear 查询的索引”

    我只是想得到一个简单的near查询工作 这是我的文档的示例 point type Point coordinates 30 443902444762696 84 27326978424058 created on date 13980167
  • 在 R Markdown 模板中包含图像,无需为模板创建新目录

    我正在构建一个投影仪演示模板 我想在幻灯片的前面添加一个徽标 尽管这可以通过在演示文稿目录中包含图像来实现 但我不希望只为该图像的每个新演示文稿创建一个新目录 有没有一种方法可以从包内检索相对文件路径resources文件夹并让它引用 La
  • 为什么套接字可以 connect() 到它自己的临时端口?

    我可以可靠地获得 Winsock 套接字connect 如果我使用自动分配的临时端口 5000 65534 范围内的端口连接到本地主机 具体来说 Windows 似乎有一个系统范围的滚动端口号 这是它将尝试分配为客户端套接字的本地端口号的下
  • 使用 std::string 键提升共享内存中的无序映射

    是否可以在共享内存上使用 std string 或其他复杂结构键类型以及 boost 无序映射 如果是这样 我可以找到一些示例代码吗 我找到了一些在共享内存上使用无序映射的示例代码 但无法将键类型更改为复杂结构 谢谢 Yes 您可以在此处查
  • 如何向初学者描述面向对象编程?现实世界有一个很好的类比吗?

    我的姐夫是一名大学工程专业的新生 他之前没有编程经验 他正在课堂上学习编程 但他似乎在基本概念上遇到了困难 更糟糕的是 他似乎是所有班级中唯一没有编程背景的人 他在 Matlab 上做得很好 我不知道 然后当他学习 Python 基础知识时
  • Cytsocape.js 无法使用不存在的目标创建边缘

    在使用 AJAX 请求创建节点后 我尝试创建边缘 My code success function data each data kids function i value cy add group nodes data id value
  • 从 QML 访问 QStandardItemModel 的项目

    已编辑 在原始问题中 我错误地假设 GridView 本机使用二维模型 事实上 它与其他 QML 类似 需要一个元素列表 意见 为了使问题和答案更容易理解 我更改了给定的代码 轻微地 此外 我根据答案添加了工作解决方案 在主程序中 我定义了
  • Win32 LB_GETTEXT 返回垃圾

    我有一个问题 很可能是一个简单的问题 但对我来说仍然是一个问题 我在 Win32 C 中使用列表框 当从列表框中获取选定的文本时 返回的字符串只是垃圾 它是结构或类似结构的句柄 下面是代码和我得到的示例 std string Listbox
  • 在heroku上管理多个ssh密钥

    所以我有几个 ssh 密钥用于我拥有的其他帐户 我现在需要能够在我的计算机上克隆 heroku 存储库 我创建了一个新的 ssh 密钥并使用 heroku keys add 将其添加到我的 heroku 帐户 但是 当我尝试克隆存储库时 我
  • 无法在 Docker Compose 中向非 root 用户授予对 Docker 卷的写入权限

    我正在运行一个 Docker Compose 环境 在其中执行一系列 Selenium 测试 为了做到这一点 我正在使用Selenium 提供的图像 https github com SeleniumHQ docker selenium 我
  • 函数导致自动生成的 RcppExports.R 检查错误

    我正在使用 Rcpp 0 12 11 和 R 3 4 0 当我将 Rcpp 升级到 0 12 11 时 由 Rcpp compileAttributes 自动生成的 R 文件 RcppExports R 开始为我提供略有不同的函数调用 ru
  • VS2013中cshtml窗口垂直分割

    在VS2013中我想查看相同的cshtml文件并排在 2 个窗口中 即垂直分割 我知道如何进行水平分割 但这不是我在这里追求的 通常的方法是复制选项卡 WINDOW New Window 文件 然后创建一个新的垂直选项卡组 但是 我找不到复
  • Android应用程序强制关闭时如何在运行时获取日志

    如何在 Android 应用程序中强制关闭时在运行时获取日志 我想获取日志并邮寄 这里有一些用于收集应用程序内部日志的代码 private int MAX LOG MESSAGE LENGTH 100000 private String m
  • 将 Vuetify 导航抽屉切换为迷你,然后切换为临时

    我在 Vue js 中有一个项目 我正在使用 Vuetify 我有一个工具栏和导航抽屉 我想要的是在桌面上抽屉打开时 如果用户单击侧面图标 抽屉将切换为迷你 如果打开 md 抽屉将切换至迷你 如果用户单击侧面图标 迷你会切换回抽屉 如果打开
  • 如果 NSString 不等于函数?

    我已经到处搜索过这个问题 包括苹果关于 NSString 的文档 也许我没有看到 但我试图在 xCode 中找到一种方法来检查 NSString 是否不等于某些内容 很像 if myNSSting text 除了特别我想检查它是否不等于 文
  • 动态数组的运算符重载给出奇怪的错误

    当我使用它时 我收到有关 废弃限定符 的错误 下面发布了整个班级 cout lt lt d where d is of type dynamic array 全局重载函数 template
  • EXISTS 在 INSERT 之前还是之后哪个更快?

    我在 SQL Server 中有一个 SP 它每分钟运行数百次 需要根据数据库检查传入流量 目前它执行以下操作 INSERT INTO table SELECT value1 value2 WHERE NOT EXISTS SELECT F