TSQL:视图上的左连接非常慢

TSQL:视图上的左连接非常慢,tsql,view,left-join,Tsql,View,Left Join,在一些复杂的存储过程中,我们在这个视图上使用view和left join。执行需要40秒 现在,如果我们创建表变量并将视图的结果存储在其中,然后在此变量上而不是视图上执行左连接,需要3秒钟 什么可以解释这种行为?视图扩展到主查询中。 因此,如果视图中有5个表,则这些表将与额外的表一起扩展为一个包含6个表的大型查询计划。性能差异很可能是由于增加了复杂性和您留下的附加表的排列造成的 另一个潜在的问题:您是否将join留在一个有一些处理的列上?这将进一步扼杀性能。由Alden W提供。这是Alden

在一些复杂的存储过程中,我们在这个视图上使用view和left join。执行需要40秒

现在,如果我们创建表变量并将视图的结果存储在其中,然后在此变量上而不是视图上执行左连接,需要3秒钟


什么可以解释这种行为?

视图扩展到主查询中。

因此,如果视图中有5个表,则这些表将与额外的表一起扩展为一个包含6个表的大型查询计划。性能差异很可能是由于增加了复杂性和您留下的附加表的排列造成的


另一个潜在的问题:您是否将join留在一个有一些处理的列上?这将进一步扼杀性能。

由Alden W提供。这是Alden W对我的一个问题的回答,就像你的问题一样

通过将视图算法指定为“合并”,可以获得更好的性能。使用MERGE MySQL,将视图与外部SELECT的WHERE语句相结合,然后提出优化的执行计划

但是,要执行此操作,必须从视图中删除GROUPBY语句。实际上,如果视图中包含GROUPBY语句,MySQL将选择模板算法。首先为整个视图创建一个临时表,然后再由WHERE语句进行筛选

如果不能使用合并算法,则必须使用临时表。如果视图包含以下任何构造,则无法使用“合并”:

聚合函数(SUM()、MIN()、MAX()、COUNT()等)

明显的

分组

拥有

极限

联合还是全体联合

选择列表中的子查询

仅引用文字值(在本例中,没有基础表)

这里是更多信息的链接

如果可以将视图更改为不包含GROUP BY语句,则要指定视图的算法,语法为:


CREATE ALGORITHM=MERGE VIEW…

最有可能是参数嗅探或统计数据不足。发布查询和执行计划。视图中是否有函数?视图中有多少表?事实上,您可以添加视图定义吗?