Tsql 视图更改表查找扫描时的Union All in查询
我有一个视图,它使用两个select语句之间的并集。select语句位于包含百万行的表上,该表与4-5个小表连接 有一个过程使用where子句对视图进行查询 我认为在我看来使用Union ALl比Union更快(结果保证是不同的),但如果我使用Union ALl而不是Union,我的过程会花费大量时间。 我检查了查询计划,我注意到主要的区别是Tsql 视图更改表查找扫描时的Union All in查询,tsql,Tsql,我有一个视图,它使用两个select语句之间的并集。select语句位于包含百万行的表上,该表与4-5个小表连接 有一个过程使用where子句对视图进行查询 我认为在我看来使用Union ALl比Union更快(结果保证是不同的),但如果我使用Union ALl而不是Union,我的过程会花费大量时间。 我检查了查询计划,我注意到主要的区别是 在视图中使用Union时,平面图包含表上的所有seek 当我在视图中使用Union all时,需要扫描所有表(60%成本) View select语句的条
如何知道为什么将union更改为union all计划会生成扫描而不是seek。原因“union”返回唯一的行集,而“union all”返回的不是唯一的行集。听起来好像有很多方法可以编写此查询。我让某人使用union在表上写了一次视图,我可以使用CASE语句重写该视图,以获得8倍的速度。但是,如果没有关于实际查询的更多信息,就很难建议如何重写它。该视图用于报告,并且非常大,从10个表中选择30列。有一些左连接到稍微难以将Union转换为Case语句。