【问题标题】:Are the table indexes used in the select on the resultset of a subquery in the FROM clause?表索引是否在 FROM 子句中子查询的结果集的选择中使用?
【发布时间】:2020-01-21 10:56:08
【问题描述】:

我在 SQL Server 中有一个超过 5000 万行的表,所以我的表中有一些复合索引。具有 3、4 列的索引。有一种情况,我确实需要在 FROM 子句中使用子查询。

结构示例(索引为:column2,column3,column4):

select column1 
from
    (select 
         column1, column2, column3, column4 
     from 
         myTable) as MYSUBQUERY
where 
    column2 = 99 and column3 = 999
order by 
    column4

这个例子只是为了说明FROM中的查询。我的问题是关于在 FROM 子句中的子查询结果中使用表索引以及任何性能问题。

我的问题:myTable (column2, column3, column4) 的复合索引在 FROM 子句中使用的子查询中是否有效?会像在表中直接选择常规选择一样工作而不会损失性能吗?

最好的问候, 路易斯

【问题讨论】:

  • 获取执行计划看看。子查询是微不足道的,因此优化器会将其简单地折叠回主查询。事实上,使用它是没有意义的。
  • 嗯,在您给出的示例中,WHERE 可以下推,但这里根本不需要派生表。我认为这里不可能有一个通用的答案。如有疑问,请根据您的实际查询检查计划。
  • 在ExecutionPlan 看起来好像是同一个计划。运行一个简单的测试,性能似乎也是一样的。
  • 看起来很像您的上一个问题:stackoverflow.com/questions/59829359/… - 请不要一遍又一遍地转发相同的问题
  • 马克,对不起,我只做了你在上一个问题中提出的问题:“更新问题,使其只关注一个问题。这将有助于其他人回答问题。你可以编辑问题或发布新问题。由 marc_s 于 17 小时前关闭

标签: sql sql-server


【解决方案1】:

SQL 是一种描述性 语言,而不是一种声明性 语言。 SELECT 查询描述了要生成的结果,而不是它们的生成方式。 SQL 查询被转换为一组运算符,您可以将其视为“解释”计划。该集合结构为有向无环图,通常称为 DAG。

优化器优化此操作图,而不是原始查询。事实上,在 DAG 中并没有“子查询”这样的东西。

因此,子查询在 SQL Server 中是无关紧要的。如果优化器可以检测到它们被使用并且没有其他操作影响结果,则这些条件将应用于子查询。

其他操作,例如joins、聚合和窗口函数可能会改变查询的含义并影响索引是否被使用。

但是对于您问题中的简单示例,SQL Server 应该使用索引。

【讨论】:

  • 非常感谢您的解释,戈登。分析执行计划其实是同一个计划。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
相关资源
最近更新 更多