作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我收到以下两个查询。一个快一个慢。
该表在 Id
列上有一个聚簇索引。
-- Slow, uses clustered index scan reading 100100 rows
SELECT *
FROM [dbo].[Foo]
ORDER BY Id
OFFSET 100000 ROWS FETCH FIRST 100 ROWS ONLY
-- Fast, uses clustered index seek reading 100 rows
SELECT TOP 100 *
FROM [dbo].[Foo]
WHERE Id > 100000
ORDER BY Id
除了一个使用扫描另一个使用搜索之外,这些计划是相同的。
谁能解释为什么或者这就是 OFFSET
的工作原理?
该表非常宽,有几个 NVARCHAR(100-200)
和一个 NVARCHAR(2500)
列。
最佳答案
这两个查询不等价。尽管您 可能会假设 id
没有间隔并且从 1 开始,但数据库引擎并不知道这一点。
索引被组织起来以快速找到特定的值。他们通常通过遍历树结构来做到这一点,而树结构通常是平衡的。您可以在 documentation 中阅读更多相关信息.
但是,它们的组织方式无法快速到达表中的第 nth 行。因此,查询需要扫描表以统计行数。
就是说,如果索引保留每个子项中的行数,它可以做你想做的事。请注意,这会使对表的修改变得复杂,因为每次 update
、insert
和 delete
都需要更新整个层次结构。
关于SQL 服务器 : OFFSET FETCH performs scan while TOP WHERE performs seek?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41740897/
我是一名优秀的程序员,十分优秀!