Tsql 视图更改表查找扫描时的Union All in查询

Tsql 视图更改表查找扫描时的Union All in查询,tsql,Tsql,我有一个视图,它使用两个select语句之间的并集。select语句位于包含百万行的表上,该表与4-5个小表连接 有一个过程使用where子句对视图进行查询 我认为在我看来使用Union ALl比Union更快(结果保证是不同的),但如果我使用Union ALl而不是Union,我的过程会花费大量时间。 我检查了查询计划,我注意到主要的区别是 在视图中使用Union时,平面图包含表上的所有seek 当我在视图中使用Union all时,需要扫描所有表(60%成本) View select语句的条

我有一个视图,它使用两个select语句之间的并集。select语句位于包含百万行的表上,该表与4-5个小表连接

有一个过程使用where子句对视图进行查询

我认为在我看来使用Union ALl比Union更快(结果保证是不同的),但如果我使用Union ALl而不是Union,我的过程会花费大量时间。 我检查了查询计划,我注意到主要的区别是

  • 在视图中使用Union时,平面图包含表上的所有seek
  • 当我在视图中使用Union all时,需要扫描所有表(60%成本)
  • View select语句的条件为MainTable.Column 10,如果我使用Union plan shows as MainTable.Column>10或MainTable.Column<10。然而,所有计划都显示了条件。即使我将我的条件显式设置为>或<,仍然将所有计划显示为

  • 如何知道为什么将union更改为union all计划会生成扫描而不是seek。

    原因“union”返回唯一的行集,而“union all”返回的不是唯一的行集。听起来好像有很多方法可以编写此查询。我让某人使用union在表上写了一次视图,我可以使用CASE语句重写该视图,以获得8倍的速度。但是,如果没有关于实际查询的更多信息,就很难建议如何重写它。该视图用于报告,并且非常大,从10个表中选择30列。有一些左连接到稍微难以将Union转换为Case语句。