仅向LIMIT关键字添加多一行时,MS Sql查询速度变慢

时间:2019-02-11 13:17:59

标签: sql sql-server sql-server-express

我的查询中有一个奇怪的问题。我没有编写SQL的经验 查询,但我也不是新手。 这个让我一直在思考和搜索至少一个小时。

我尝试过的查询(SELECT TOP (19785)..)(数字很重要)大约在15毫秒内执行,但是将top仅仅增加1的同一查询执行434毫秒。 有人可以解释为什么会这样吗?

我在下面附上了屏幕截图,所以如果我讲得不好的话,您可以看到我在说什么。

Image url - click here

编辑: 另外,忘了提到此表非常简单,它没有外键,除了两个小数点(用于存储纬度和经度)之外,没有其他复杂字段

EDIT2:附加了下面的查询执行计划。 https://www.brentozar.com/pastetheplan/?id=H1PLtgkSN

EDIT3: 很抱歉使这个错误显而易见,但我注意到该表实际上具有该国家的外键。 另外,我注意到,如果我删除了TOP(N)和uniqueidentifier(guid)字段,然后用

重新设置了两个查询
ORDER BY Id OFFSET M ROWS
FETCH NEXT N ROWS ONLY;

显示类似的执行时间(〜15 ms)

这表明我应该分块进行查询,考虑到我应该在正在处理的应用程序中进行分页,这并不是一个大问题。

感谢您的帮助,祝您愉快。

1 个答案:

答案 0 :(得分:0)

这可能是行目标的效果(请参阅:https://sqlperformance.com/2018/02/sql-plan/setting-and-identifying-row-goals)。这是SQL Server在考虑如何物理检索数据时使用TOP(n)值的地方。通常,SQL Server将使用查询要检索的数据分布以及可用的索引来确定检索模式。