【问题标题】:Nested sql joins process explanation needed需要嵌套sql连接过程说明
【发布时间】:2010-01-07 08:34:06
【问题描述】:

想了解sql查询中嵌套join子句的过程。你能用伪代码解释这个例子吗? (连接表的顺序是什么?)

  FROM 
table1 AS t1 (nolock)
    INNER JOIN table2 AS t2 (nolock)
        INNER JOIN table3 as t3 (nolock)
        ON t2.id = t3.id
    ON t1.mainId = t2.mainId

【问题讨论】:

  • 除非您使用连接提示(顺便说一句,这是一个非常糟糕的想法),否则您无法控制连接的“顺序”。基本上,RDBMS 的查询优化器将检查查询、考虑索引和表统计信息,并确定适当的查询计划以返回请求的数据。
  • PS:请谨慎使用nolock提示;当你这样做时,你会暴露自己的数据完整性问题。根据您提出的问题,我怀疑您是否完全了解何时使用 nolock 提示是安全/可接受的细微差别。

标签: sql sql-server join


【解决方案1】:

在 SQl 中,基本上我们有 3 种方法来连接两个表。

嵌套循环(如果一张表的行数很少,则很好), 散列连接(如果两个表都有非常大的行,它会在内存中形成昂贵的散列) 合并连接(当我们对要连接的数据进行排序时很好)。

从您的问题来看,您似乎想要嵌套循环。

假设 t1 有 20 行,t2 有 500 行。

现在会是这样的

对于 t1 中的每一行 查找 t2 中 t1.MainId = t2.MainId 的行

现在输出将加入 t3。

加入顺序取决于优化器、预期行数等。

【讨论】:

    【解决方案2】:

    试试EXPLAIN <em>query</em>

    它会准确地告诉你发生了什么。 :)

    当然,这在 SQL Server 中不起作用。为此你可以试试Razor SQLServer Explain Plan

    甚至SET SHOWPLAN_ALL

    【讨论】:

    • 对不起,Sql server 没有这个“EXPLAIN”关键字。
    【解决方案3】:

    如果您使用的是 SQL Server 查询分析器,请在“查询”菜单下查找“显示Execution Plan”并启用它。

    【讨论】:

      猜你喜欢
      • 2018-07-22
      • 1970-01-01
      • 2012-10-10
      • 2019-08-03
      • 1970-01-01
      • 2011-09-13
      • 2015-03-16
      • 2019-07-01
      • 1970-01-01
      相关资源
      最近更新 更多