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
******************* (编辑:均轻资讯网_我爱站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- .net – LINQ查询与存储过程
- rdp – 可以拆分访问数据库导致打印机和报告问题吗?
- sql – 如何重用大型查询而不重复它?
- sql-server – 为什么在SQL Server 2012中设置空结果的查询
- .net – “无法调用DateTime上的方法”等限制
- linq-to-sql – LINQ to Entities未返回预期结果
- sql-server – 根据Sql Server中的选定行生成插入脚本?
- sql-server-2008 – SQL Server 2008 – 一个表24gb,删除了
- sql-server – ESXi 5上Windows上的RAID10卷写入延迟
- sql – 当结果集很大时,RODBC会丢失datetime的时间值

