首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server:将top增加1时,结果极慢

SQL Server:将top增加1时,结果极慢
EN

Stack Overflow用户
提问于 2015-05-30 01:46:21
回答 1查看 61关注 0票数 0

我有一个使用内部连接连接多个视图和一个表的查询。不涉及子查询,所有连接字段都被索引,所有连接都在int字段上。在select子句中使用"top 342“将导致查询在大约2秒内执行。但是如果我使用相同的查询和"top 343",查询不会在7分钟内完成执行。我尝试了其他几个低于342的值,它们也像预期的那样工作。

从查询中删除联接的表将导致查询在几秒钟内完成,无论使用的值是多少。

我尝试使用full-scan更新表上的统计信息,但没有任何改变。

在相同的SQL执行上下文中,我使用:

代码语言:javascript
复制
DBCC FREEPROCCACHE
GO
CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

什么类型的东西可能会导致执行缓慢?

EN

回答 1

Stack Overflow用户

发布于 2015-05-30 20:30:35

更改TOP的值将更改row goal

这可能会对计划的其余部分产生重大影响。您可能会发现,TOP 342碰巧产生了一个计划,其中非阻塞操作符(如嵌套循环)更受青睐,但是对于TOP 343,SQL Server的成本计算模型认为,使用阻塞操作符(例如,首先消耗整个子树的散列连接)会更便宜。

您可以尝试使用这样的构造

代码语言:javascript
复制
SELECT TOP 363 *
FROM your_view
OPTION (FAST 362) 

代码语言:javascript
复制
DECLARE @Top INT = 363

SELECT TOP (@Top) *
FROM   your_view
OPTION (optimize for (@Top = 362))    

但是,如果不能以其他方式获得一个满意的计划,这些将是我最后的手段。

另请参阅Inside the Optimizer: Row Goals In Depth

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30535936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档