DISTINCT
以下示例中的添加是否对查询运行时间有影响?
有时使用它作为提示是否明智?
SELECT *
FROM A
WHERE A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B)
DISTINCT
以下示例中的添加是否对查询运行时间有影响?
有时使用它作为提示是否明智?
SELECT *
FROM A
WHERE A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B)
Answers:
想知道类似的事情时,应该比较查询的执行计划。
当然,查询执行计划的形状会有所不同,具体取决于表中有多少行以及定义了哪些索引。
显示的性能没有差异的一种情况是当行中的行A
多于行中的行B
。然后,优化器将选择B
作为嵌套循环联接中的驱动表A
。为了获得正确的结果,它必须B
在两个查询中对表使用流聚合,以仅从中获取不同的行B
。因此,在这种情况下,distinct关键字对性能没有影响。
另外两个要测试的明显情况的执行计划,即B中的行多于A,表中的行数相等,这也显示了查询的完全相同的执行计划。
更新资料
在进行查询优化之前,查询会经过简化阶段。您可以使用跟踪标志8606查看逻辑树的外观。
查询的输入树明显不同,但经过简化后它们是相同的。
参考:更多未公开的查询优化器跟踪标志和查询优化器深入研究–第2部分
输入树和简化树,用于使用不同的查询:
*** Input Tree: ***
LogOp_Project QCOL: [xx].[dbo].[A].SomeColumn
LogOp_Select
LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002
ScaOp_SomeComp 2
ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
LogOp_GbAgg OUT(QCOL: [xx].[dbo].[B].SomeColumn,) BY(QCOL: [xx].[dbo].[B].SomeColumn,)
LogOp_Project
LogOp_Project
LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006
AncOp_PrjList
AncOp_PrjList
AncOp_PrjList
AncOp_PrjList
*******************
*** Simplified Tree: ***
LogOp_LeftSemiJoin
LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002
LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
ScaOp_Identifier QCOL: [xx].[dbo].[B].SomeColumn
*******************
查询的输入树和简化树不使用不同:
*** Input Tree: ***
LogOp_Project QCOL: [xx].[dbo].[A].SomeColumn
LogOp_Select
LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002
ScaOp_SomeComp 2
ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
LogOp_Project
LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006
AncOp_PrjList
AncOp_PrjList
*******************
*** Simplified Tree: ***
LogOp_LeftSemiJoin
LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002
LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
ScaOp_Identifier QCOL: [xx].[dbo].[B].SomeColumn
*******************