Sql server MS-SQL偏移量n行仅以伪顺序按列获取下一个m行-结果一致吗?

Sql server MS-SQL偏移量n行仅以伪顺序按列获取下一个m行-结果一致吗?,sql-server,Sql Server,“Offset n rows fetch m rows only”子句仅适用于指定的“order by”-这当然会使查询比不使用order时慢 我的同事和我试着按常量排序: select 0 as SORT_DUMMY, p.* from table p order by 1 Offset 0 rows fetch next 10 only 但是,该命令运行时没有问题-我不确定这是否会以可复制的方式返回行(我们使用它进行分页) 有人对此有什么见解吗 问候 约翰·科尔姆塞回答我自己的问题 您肯定

“Offset n rows fetch m rows only”子句仅适用于指定的“order by”-这当然会使查询比不使用order时慢

我的同事和我试着按常量排序:

select 0 as SORT_DUMMY, p.* from table p order by 1 Offset 0 rows fetch next 10 only
但是,该命令运行时没有问题-我不确定这是否会以可复制的方式返回行(我们使用它进行分页)

有人对此有什么见解吗

问候


约翰·科尔姆塞回答我自己的问题

您肯定应该按列进行排序,该列给出唯一的排序

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

  • 如果不这样做,数据库可以(将来可能会通过更新或某些选择)以它认为合适的任何顺序返回行,如果不强制的话错误

  • 不涉及成本,因为最佳做法是仅使用主键作为排序,按照其“自然排序顺序”(以索引方向决定的顺序为准)

  • 有时-不正确的伪列将导致更糟糕的查询时间(相信我,我已经做到了),可能的原因是“0作为伪列”显然没有唯一的索引

  • 如果按唯一列排序,则无论选择第1页还是第1000页,都可以将其用于“恒定查询时间”。基本上,您将保持“Offset n rows fetch next m rows only”常量,但引入一个额外的where子句“where[uniquesort\u column]>[previous\u page\u last\u unique\u sort]”。where子句将非常快,因为它使用索引,就像ORDERBY一样


所以,是的-我一开始就觉得这个问题有点愚蠢…因为如果按主键排序(按自然索引的顺序),那么主要假设(order by使查询速度变慢)是不正确的(假设您的数据库与我测试过的所有数据库一样……应该是几乎所有的数据库……甚至可能是SQL标准中的数据库……idk)

在确定的列上使用ORDER BY,所以您会说这是不可复制的?(或者至少是不安全的-下一个版本它可能会爆炸?)…还可以“从表p中选择p.*ORDER BY enumcolumn”(enumcolumn的值将在行之间共享)将不可复制?按1排序与按确定性列排序或按顺序唯一的一组列排序不同。