使用用户指定的部分联接值加入 SQL Server 时,我在哪里检查复合键的一部分是不是重要?
Posted
技术标签:
【中文标题】使用用户指定的部分联接值加入 SQL Server 时,我在哪里检查复合键的一部分是不是重要?【英文标题】:Does it matter where I check part of a composite key when joining in SQL Server using a user-specified value for part of the join?使用用户指定的部分联接值加入 SQL Server 时,我在哪里检查复合键的一部分是否重要? 【发布时间】:2010-08-24 16:58:06 【问题描述】:(这个问题和我之前的问题Does it matter where I check part of a composite key when joining two tables in SQL Server?很相似)
我在一个复合键上连接三个表,其中一列的值由用户输入确定。我想知道在进行联接时比较相应列的位置是否重要。
假设我有一个表 TableA,其中包含 ColAFoo、ColAFoo2 和 ColABar 列。 TableA 有一个由 ColAFoo 和 ColAFoo2 (PK_TableA) 组成的复合主键。
我还有 TableB,带有 ColBFoo、ColBFoo2 和 ColBOther。 TableB 的列 ColBFoo 和 ColBFoo2 构成了 TableA 主键 (FK_TableA_TableB) 的外键。
最后,我有 TableC,带有 ColCFoo、ColCFoo2、ColCBlah 和 ColCBlah2。 TableC 的列 ColCFoo 和 ColCFoo2 包含 TableA 的主键 (FK_TableA_TableC) 的外键。我还要说 TableC 有一个由 ColCFoo、ColCFoo2 和 ColCBlah 组成的复合主键。
我需要加入三个表的关键。以下(人为的)陈述在性能方面有区别吗?
选择 * 从表 A 加入表 B b ON a.ColAFoo = b.ColBFoo 和 a.ColAFoo2 = b.ColBFoo2 加入表C c ON a.ColAFoo = c.ColCFoo 和 a.ColAFoo2 = c.ColCFoo2 在哪里 a.ColAFoo2 = @userInput 选择 * 从表 A 加入表 B b ON a.ColAFoo = b.ColBFoo 和 a.ColAFoo2 = b.ColBFoo2 加入表C c ON a.ColAFoo = c.ColCFoo 在哪里 a.ColAFoo2 = @userInput 和 c.ColCFoo2 = @userInput 选择 * 从表 A 加入表 B b ON a.ColAFoo = b.ColBFoo 加入表C c ON a.ColAFoo = c.ColCFoo 在哪里 a.ColAFoo2 = @userInput 和 b.ColBFoo2 = @userInput 和 c.ColCFoo2 = @userInput【问题讨论】:
【参考方案1】:没有。查询优化器将识别这些是否都相同。
对这类问题最好的办法就是查看估计的执行计划,看看是否有任何差异。
【讨论】:
【参考方案2】:不,这应该导致相同的执行计划。运行所有 3 个查询并查看执行计划显示的内容
【讨论】:
【参考方案3】:正如其他人所说,他们应该是一样的
不过,为了清楚起见,我会使用第一个
【讨论】:
以上是关于使用用户指定的部分联接值加入 SQL Server 时,我在哪里检查复合键的一部分是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章