sql-server – 使用DISTINCT作为子查询中的提示有用吗?
在以下示例中添加DISTINCT是否会对查询运行时间产生任何影响?
SELECT * FROM A WHERE A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B) 解决方法当想知道这样的事情时,你应该比较查询的执行计划.查询的执行计划的形状当然会有所不同,具体取决于表中有多少行以及定义了哪些索引. 另外两个要测试的明显案例的执行计划,B中的行多于A和表中的行数相等,也显示了查询的完全相同的执行计划. 更新 在进行查询优化之前,查询将经历简化阶段.您可以使用跟踪标志8606查看逻辑树的外观. 查询的输入树明显不同,但在简化后它们是相同的. 参考:More Undocumented Query Optimizer Trace Flags和Query Optimizer Deep Dive – Part 2 使用distinct的输入树和简化树进行查询: *** 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 ******************* 用于查询的输入树和简化树不使用distinct: *** 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 ******************* (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |