我有一个使用内部连接连接多个视图和一个表的查询。不涉及子查询,所有连接字段都被索引,所有连接都在int字段上。在select子句中使用"top 342“将导致查询在大约2秒内执行。但是如果我使用相同的查询和"top 343",查询不会在7分钟内完成执行。我尝试了其他几个低于342的值,它们也像预期的那样工作。
从查询中删除联接的表将导致查询在几秒钟内完成,无论使用的值是多少。
我尝试使用full-scan更新表上的统计信息,但没有任何改变。
在相同的SQL执行上下文中,我使用:
DBCC FREEPROCCACHE
GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO什么类型的东西可能会导致执行缓慢?
发布于 2015-05-30 20:30:35
更改TOP的值将更改row goal。
这可能会对计划的其余部分产生重大影响。您可能会发现,TOP 342碰巧产生了一个计划,其中非阻塞操作符(如嵌套循环)更受青睐,但是对于TOP 343,SQL Server的成本计算模型认为,使用阻塞操作符(例如,首先消耗整个子树的散列连接)会更便宜。
您可以尝试使用这样的构造
SELECT TOP 363 *
FROM your_view
OPTION (FAST 362) 或
DECLARE @Top INT = 363
SELECT TOP (@Top) *
FROM your_view
OPTION (optimize for (@Top = 362)) 但是,如果不能以其他方式获得一个满意的计划,这些将是我最后的手段。
https://stackoverflow.com/questions/30535936
复制相似问题