左连接和内连接的性能差异

2023-12-08

左连接和内连接在性能方面有什么区别吗?我使用 SQL Server 2012。


至少有一种情况LEFT [OUTER] JOIN是一个更好的选择[INNER] JOIN。我谈到使用获得相同的结果OUTER代替INNER.

示例(我正在使用AdventureWorks 2008 数据库):

-- Some metadata infos
SELECT  fk.is_not_trusted,  fk.name
FROM    sys.foreign_keys fk
WHERE   fk.parent_object_id=object_id('Sales.SalesOrderDetail');
GO

CREATE VIEW View1
AS 
SELECT  h.OrderDate, d.SalesOrderDetailID, o.ModifiedDate
FROM    Sales.SalesOrderDetail d
INNER JOIN Sales.SalesOrderHeader h ON d.SalesOrderID = h.SalesOrderID
INNER JOIN Sales.SpecialOfferProduct o ON d.SpecialOfferID=o.SpecialOfferID AND d.ProductID=o.ProductID;
GO

CREATE VIEW View2
AS
SELECT  h.OrderDate, d.SalesOrderDetailID, o.ModifiedDate
FROM    Sales.SalesOrderDetail d
INNER JOIN Sales.SalesOrderHeader h ON d.SalesOrderID = h.SalesOrderID
LEFT JOIN Sales.SpecialOfferProduct o ON d.SpecialOfferID=o.SpecialOfferID AND d.ProductID=o.ProductID;
GO

SELECT  SalesOrderDetailID
FROM    View1;

SELECT  SalesOrderDetailID
FROM    View2;

第一个查询的结果:

is_not_trusted name
-------------- ---------------------------------------------------------------
0              FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID
0              FK_SalesOrderDetail_SpecialOfferProduct_SpecialOfferIDProductID

Execution plans for the last two queries: enter image description here

注 1/视图 1:如果我们看一下执行计划SELECT SalesOrderDetailID FROM View1我们看到一个FK消除因为FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID约束是可信的并且它只有一个列。但是,服务器是被迫的(因为INNER JOIN Sales.SpecialOfferProduct)从第三个表(SpecialOfferProduct)读取数据,甚至SELECT/WHERE子句不包含此表中的任何列,并且 FK 约束 (FK_SalesOrderDetail_SpecialOfferProduct_SpecialOfferIDProductID) 也是受信任的。发生这种情况是因为最后一个 FK 是多列的。

注 2/视图 2:如果我们想删除 read (Scan/Seek)在Sales.SpecialOfferProduct?第二个 FK 是多列的,对于这种情况,SQL Server 无法消除 FK(请参阅之前的 Conor Cunnigham 博客文章)。在这种情况下我们需要更换INNER JOIN Sales.SpecialOfferProduct with LEFT OUTER JOIN Sales.SpecialOfferProduct以达到FK淘汰的目的。两个都SpecialOfferID and ProductID列是NOT NULL我们有一个值得信赖的 FK 参考SpecialOfferProduct table.

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

左连接和内连接的性能差异 的相关文章

  • 与 FOREIGN KEY 约束冲突

    我有两张桌子 学术界 CREATE TABLE dbo R ACADEMIE ID ACADEMIE dbo IDENTIFIANT NOT NULL LC ACADEMIE CODE dbo LIBELLE COURT NOT NULL
  • 在 C# 中将平面数据库结果集转换为分层对象集合

    我有一个数据库查询 它以平面格式返回分层数据 例如客户 订单和订单项目 只是一个例子 我的数据不同 如何将其转换为分层对象集合 即客户对象的集合 其中每个客户对象都有订单对象的集合 每个订单对象都有订单项目对象的集合 这只是循环遍历每个项目
  • 按两列的最小值排序

    I use SQL Server 2008 R2 我需要按两列的最小值对表进行排序 该表如下所示 ID integer Date1 datetime Date2 datetime 我希望我的数据按至少两个日期排序 以这种方式对该表进行排序的
  • 在 SSIS 中使用合并任务的指南

    我有一个包含三个字段的表 其中一个是身份字段 我需要从具有其他两个字段的源中添加一些新记录 我正在使用SSIS 我认为我应该使用合并工具 因为其中一个源不在本地数据库中 但是 我对合并工具和正确的过程感到困惑 我有一个源 一个 Oracle
  • 如何在测试期间强制锁定升级(以消除死锁问题)?

    在此发布问题和一个答案 也许有人有更好的答案 编写触发死锁的代码是可能的即使对于单个用户如果开发人员不小心打开了与数据库的第二个连接 而不是重用现有的连接 可能已经有一个打开的事务 某些 O RM 和 LINQ 框架很容易犯这个错误 以下是
  • 在 Sql Server 中启用 DTD 支持

    我有各种 xml 文档需要存储在数据库列中 这些文档包含对 DTD 的引用 并且 SQL Server 不会导入 xml 因为它存在安全风险 如何在数据库上启用 DTD 支持 以便它可以让我插入 xml 内容 你必须CONVERT首先 MS
  • 将 SQL Server varBinary 数据转换为字符串 C#

    我需要帮助弄清楚如何转换来自SQL服务器表列设置为varBinary 最大 转换为字符串以便将其显示在标签中 这是在C 我正在使用数据读取器 我可以使用以下方式提取数据 var BinaryString reader 1 我知道该列包含之前
  • 数据库设计1对1关系

    我的数据库设计不正确 我应该在开发过程中解决这个问题吗 假定 user 表与 userprofile 表具有 1 1 关系 然而 实际设计中 用户 表与 用户配置文件 表具有 1 关系 一切正常 但无论如何应该修复它吗 做一件事 User
  • 临时表上没有外键限制? SQL Server 2008

    我知道临时表只会在 SQL Server 会话打开时存在 但为什么不能对它们进行外键限制呢 想象一下这样的场景 您创建从临时表到具体表的键的外键关系 外键关系的限制之一是您无法从临时表所依赖的键表中删除行 现在 通常当您创建外键关系时 您知
  • SSIS-从 Sharepoint 下载 Excel 并将其加载到 SQL 数据库

    我目前遇到的情况是共享点网站上有一个 Excel 文件 我需要将该 Excel 文件加载到数据库中 Excel 文件有多个工作表 我尝试过以下方法 但运气为零 方法 1 我访问 sharepoint 站点并访问 库 选项卡 并选择使用资源管
  • SQL Server - 比较 2 个表中同一列中的数据,而不检查是否相等

    我之前问过这个问题here https stackoverflow com q 51865261 1693085 但答案实际上并不是我想要的 假设我的 SQL Server 2012 数据库中有以下两个表 Tbl1 ID Col1 Col2
  • 在为存储过程设置参数时,可以在 new SqlParameter 的构造函数中设置 TypeName 吗?

    我使用以下代码来设置调用存储过程的参数 List
  • 在 SQL Profiler 中查找特定 LINQ 查询的巧妙技巧

    由于有时会创建疯狂的 SQL 因此分析 LINQ 查询及其执行计划尤为重要 我经常发现我需要跟踪特定的查询 但很难在查询分析器中找到 我经常在有大量正在运行的事务的数据库 有时是生产服务器 上执行此操作 因此仅打开 Profiler 是没有
  • 如何使用jdbc驱动编写事务?

    我想使用 jdbc 编写一个事务java 我尝试过这个简单的交易 BEGIN TRANSACTION NL GO NL UPDATE table SET col test where id 1010 NL GO NL COMMIT 我尝试过
  • INSERT 失败,因为以下 SET 选项设置不正确:“QUOTED_IDENTIFIER”

    在执行存储过程时 我们有时会收到以下消息 之后无需任何更改 删除并重新执行存储过程 它就可以正常工作 DBCORE INSERT 失败 因为以下 SET 选项设置不正确 QUOTED IDENTIFIER 验证 SET 选项是否正确用于索引
  • SQL Server 2017 快速安装失败

    我尝试在 Windows 10 上安装 SQL Server 2017 Express 但失败 这是失败后向我显示的详细信息 Action required Use the following information to resolve
  • 需要在SQL Server 2012中自动递增字符串

    考虑 SQL Server 2012 中的表 789 0000000 上面的数字在 SQL Server 2012 中将被视为字符串 但每当我更新记录时 我都需要增加到 1 例如 当我更新记录 1 时 它应该增加到789 0000001 当
  • SQL Server 文本数据类型最大长度 = 65,535?

    我正在使用的软件使用文本字段来存储 XML 根据我的在线搜索 文本数据类型应该包含 2 31 1 个字符 目前 SQL Server 每次都会将 XML 截断为 65 535 个字符 我知道这是由 SQL Server 引起的 因为如果我直
  • 使用实用程序批量复制将所有表从 SQL Server 数据库导出到文件中

    我想将数据库中的所有表 bcp 到文件中 SELECT EXEC xp cmdshell bcp bcp QUOTENAME DB NAME database name QUOTENAME SCHEMA NAME SCHEMA ID sch
  • SQL 选择另一列中具有最大值的列

    我有一个看起来像这样的表 Name Group Value A 1 0 B 1 2 C 1 5 D 2 6 E 2 0 F 3 3 我想选择每组中具有最大值的名称 例如 有 3 个组 因此结果将是 Name C because it has

随机推荐

  • 有没有办法检查函数输出是否分配给Python中的变量?

    在Python中 我想编写一个函数 如果它自己调用的话 它会将其结果漂亮地打印到控制台 主要用于交互使用或调试 出于这个问题的目的 假设它检查某事物的状态 如果我打电话 check status 我想看到类似的东西 Pretty print
  • nVarchar 和 SqlParameter

    我正在开发一个必须支持多种语言的应用程序 为了解决特殊字符问题 我在文本字段中使用 NVarhcar 所以我对文本字段的 SQL 查询是 insert into tbl text text values N Chci tan it v ob
  • Hmisc Latex功能需要去掉第一行

    我在 rmarkdown 文件中使用 Hmisc 当我创建一个表时 这就是我所做的 output pdf document r Arrests Stats results asis message FALSE warning FALSE e
  • Spring OAuth2 禁用 TokenEndpoint 的 HTTP 基本身份验证

    我从 Spring OAuth2 开始 到目前为止一切顺利 我已经通过配置保护了我的应用程序 但我有一个问题 我的客户端不支持 HTTP 基本授权 有没有办法禁用 oauth token 端点的 HTTP 基本身份验证 我想在 JSON 正
  • 修剪字符串开头和结尾的空格

    我正在尝试找到一种方法来修剪标题字符串开头和结尾的空格 我正在使用这个 但它似乎不起作用 title title replace s s g 有任何想法吗 注 截至 2015 年 所有主流浏览器 包括IE gt 9 都支持String pr
  • 使用 twinx 时定义宽高比

    如何设置使用的绘图的纵横比twinx 下面我举三个例子 without twinx突出显示我如何设置宽高比 仅与twinx说明如何重置先前定义的宽高比 我尝试定义两者的长宽比y使用时的轴twinx 这不起作用 我正在使用 matplotli
  • 在显示日期时,如何停止在 GridView 中显示时间?

    我正在开发一个 Web 应用程序 ASP NET 2 0 和 C 其中 我有一个从 Oracle 数据库获取数据的 gridview 我需要显示的一些数据是日期 但是当我的 gridview 中的日期显示如下时 2009 04 02 00
  • 传单圆半径根据 y/lng 坐标而变化

    我使用地图框 传单来显示人体图片而不是常规地图 我正在使用传单绘制 我需要能够创建一个圆并在保持其半径的同时移动它 然而 当我将其移向地图 屏幕底部时 大小呈指数级增加 我希望它保持相同的大小 我认为这与投影或 CRS 有关 但我不确定如何
  • jenkins 无法安装插件 - docker image

    以下是 jenkins 镜像 2 190 2 版本 中用于安装插件的相关片段 FROM jenkins jenkins 2 190 2 Add jenkins plugin COPY plugins txt usr share jenkin
  • 与 HashMap 一起使用[重复]

    这个问题在这里已经有答案了 我有一个 java 类 它将 servlet 属性设置为 HashMap 对象 request setAttribute types da getSecurityTypes where request是一个 Ht
  • 如何使用 JUnit 测试 ConfigurationProperties?

    这是我第一次使用外部化配置和 yaml 我创建了一个 yaml 其中使用类名作为 KEY 字段名称作为 VALUE YAML project test service computator exclude field from beeing
  • boost::named_mutex:最后一个进程关闭时安全清理

    我有一个资源 需要保护一个进程内以及多个进程之间的访问 我通过创建一个命名互斥体来管理这个问题boost interprocess named recursive mutex 而且效果很好 include
  • 尝试将 PDT 中的日期时间解析为 ZonedDateTime 表示形式

    我应该如何解析 PDT 时区中的日期时间值 06 24 2017 07 00 AM PDT 我想保留时区 以便我可以根据网站访问者的偏好来表示其他时区的时间 我尝试使用ZonedDateTime但我收到解析错误 java time Zone
  • 415 在 ajax 调用 Spring mvc 中发送 json 对象时不支持的媒体类型

    我正在从 ajax 调用将 json 对象发送到 spring mvc 控制器 这是我发送到控制器的 json 对象 id 7 priority 8 startTime 2015 09 23 01 01 00 0 我的ajax调用 ajax
  • 如何改进 for 循环而不导致运行时超时,

    我目前正在开发一个项目 该项目使用大约 500 个循环交叉验证 2 张工作表 ROSTER First Name Last Name DoB Judith Barragan 4 10 1959 Kelly Benitez 9 14 1993
  • MacOS excel 中的这段代码相当于什么?

    有人可以建议使用等效的代码吗Mac 版 Excel这会产生与下面在 Windows 中相同的结果吗 Path CreateObject WScript Shell SpecialFolders Desktop ActiveWorkbook
  • 如何使用 OnItemClickListener 根据单击的项目启动新意图?

    我希望能够使用 Intent 类启动新活动 我知道如何使用以下代码行启动活动 Intent myIntent new Intent v getContext bylocationactivity class startActivityFor
  • 不能使用可变变量作为安全函数的参数

    下面的脚本无法编译 它抛出错误Cannot use a mutable variable as an argument of the security function我不明白为什么 我在安全函数中使用的参数不是可变变量 当我注释掉该行时h
  • Chrome 应用程序中的无限文件存储

    我想将无限数量的文件保存到用户的硬盘驱动器 而不需要用户单击对话框 我见过的关于使用无限存储的唯一文档在这里 https developers google com chrome whitepapers storage 它表示它仅适用于 C
  • 左连接和内连接的性能差异

    左连接和内连接在性能方面有什么区别吗 我使用 SQL Server 2012 至少有一种情况LEFT OUTER JOIN是一个更好的选择 INNER JOIN 我谈到使用获得相同的结果OUTER代替INNER 示例 我正在使用Advent