SQL Server无法构建执行计划

时间:2018-01-31 16:01:30

标签: sql-server performance tsql sql-server-2016 sql-execution-plan

我正在使用

  

Microsoft SQL Server 2016 Enterprise SP1:基于Core的许可(64位)版本13.0.4411.0

我有一个非常奇怪的问题,我不知道如何解决。我有一个(不可否认的是相当大的)查询,它连接在一起超过100个表。我原来写了一段时间,并且在100多个表上连接多次运行查询,但我想加快速度,所以我花了很多时间调整它,将所有LEFT JOIN更改为INNER JOINS并且将所有范围连接解码为匹配的精确值并添加适当的覆盖索引等。连接是通过动态SQL构建的,因此连接数是不精确的,我对此查询调优的测试具有较少的连接表(63)。通过63-table join,我在加速代码方面非常成功;它运行的时间只是原始版本的一小部分。但是,当我实现代码并尝试运行analagous 100+表连接查询时,SQL就会永远运行(过去需要几分钟,现在我必须在运行一整天后将其杀掉)。

我改变的任何内容都不会在逻辑上使代码变慢。我添加了一些有用的独特覆盖索引,将一些范围连接更改为完全匹配连接,例如 A.Field1 between B.FieldA and B.FieldBA.Field1=B.Field1

并将所有LEFT JOIN更改为INNER JOIN s(清理数据以使所有行在所有表中都匹配,因此不再需要“LEFT”)。

通常这很好...... SQL偶尔会做出意想不到的事情......,我可以生成估计的执行计划并试图找出出错的地方。但SQL直接无法为查询生成查询执行计划。它永远运行。我已经尝试更新统计信息并运行(QUERYTRACEON 9481)以使用旧的执行计划编译器,但都没有帮助。

这是一个疯狂的部分:在经过大量测试后,我相当确定它只是 执行计划需要很长时间,并且实际的代码执行速度非常快。手动删除连接直到它工作,我得到它几个小时后生成执行计划。运行相同的代码所花费的时间与生成估计的执行计划相同。该计划明显更简单,并且使用LEFT JOIN和BETWEEN语句(我将注意到,在5分钟内运行)的旧版本的成本低于WAY。 就“查询成本”而言,如果我为两者生成执行计划,则98%的成本在旧代码上,2%在新代码上。但是旧计划会在几秒钟后生成,我甚至无法为包含所有连接的新的更高效代码生成计划。

我从来没有遇到过这样的情况,而且我对如何调试感到困惑......我不知道如何加快SQL的执行计划。这超出了我的专业水平。如果这只是一个查询过于复杂的问题,我认为原始代码会看到同样的问题,因为它更加复杂。这似乎是其他事情发生的事情,就像一个只适用于很多内连接的bug,但没有很多左连接或......我不知道......

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用实时查询统计信息 enter image description here