MS-SQL偏移n行只按列的虚拟顺序获取下一行m - 一致的结果?

时间:2016-10-12 14:56:32

标签: sql-server

“Offset n rows fetch m rows only”子句仅适用于指定的“order by” - 这当然会使查询慢于没有顺序。

我和我的同事尝试按常数排序:

select 0 as SORT_DUMMY, p.* from table p order by 1 Offset 0 rows fetch next 10 only

该命令运行没有问题,但是 - 我不确定,如果这将以可重现的方式返回行(我们将其用于分页)。

有人对此有任何见解吗?

此致

Johannes Colmsee

1 个答案:

答案 0 :(得分:1)

回答我自己的问题......

你绝对应该按照一个列进行排序。

有几个原因(全部用于MS-SQL,但也适用于所有其他数据库,在oracleas上做了一些积极的性能测试):

  • 如果不这样做,数据库可以(并且将来可能会进行更新,或者某些选择)以您认为合适的任何顺序返回行,如果您不强制它。的 BUG

  • 涉及 NO COST ,因为最佳做法是以“自然排序顺序”(无论哪个是索引方向)使用主键作为排序决定它)

  • 有时 - 错误的虚拟列会导致 WORSE查询次数(相信我,去过那里,完成它) - 可能的原因是“0作为假人“显然没有独特的指数。

  • 如果按唯一列排序,则无论选择第1页还是第1000页,都可以将其用于“常量查询时间”。基本上,您将保留“仅在下一行中取消n行” “常量,但引入一个额外的where子句”,其中[uniquesort_column]> [previous_page_last_unique_sort]“。 where子句会闪电般快,因为它使用索引,就像顺序一样。

所以是的 - 我有点觉得首先发布这个问题是愚蠢的......因为主要的假设(按顺序使查询变慢)如果你按主键(s)订购,则不是真的,在它的自然索引中顺序(假设您的数据库就像我测试的所有数据库一样....它应该几乎全部......也许它甚至在SQL标准中...... idk)