加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 使用DISTINCT作为子查询中的提示有用吗?

发布时间:2021-05-21 02:18:35 所属栏目:编程 来源:网络整理
导读:在以下示例中添加DISTINCT是否会对查询运行时刻发生任何影响? 偶然行使它作为体现是明智的吗? SELECT *FROM AWHERE A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B) 办理要领 当想知道这样的工作时,你应该较量查询的执行打算. 查询的执行打算的外形

在以下示例中添加DISTINCT是否会对查询运行时刻发生任何影响?
偶然行使它作为体现是明智的吗?

SELECT *
FROM   A
WHERE  A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B)

办理要领

当想知道这样的工作时,你应该较量查询的执行打算.

查询的执行打算的外形虽然会有所差异,详细取决于表中有几多行以及界说了哪些索引.
一个场景表现机能没有差别是A中的行数比B中的行多得多.优化器然后将选择B作为嵌套轮回毗连中的驱动表,以得到正确的功效.返回它必需在两个查询中行使表B上的Stream Aggregate来仅获取来自B的差异行.因此在这种环境下,distinct要害字对机能没有影响.

其它两个要测试的明明案例的执行打算,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
*******************

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读