Sql Server按偏移量分页行-不带“排序依据”
矿山生产表包含超过一百万条记录。有一个需求要求分页查询按偏移量和LIMIT参数检索记录,类似于MySql的LIMIT子句,而不排序结果集,就像表扫描中的行自然顺序一样,因为“order by”会产生不可接受的性能影响,包括传统技术中使用的“ORDER BY”子句,即行数超过ORDER BY。。。。 有专家能为这个问题提供解决方案吗?不按结果集的任何顺序分页记录。 e、 gSql Server按偏移量分页行-不带“排序依据”,sql,sql-server,paging,Sql,Sql Server,Paging,矿山生产表包含超过一百万条记录。有一个需求要求分页查询按偏移量和LIMIT参数检索记录,类似于MySql的LIMIT子句,而不排序结果集,就像表扫描中的行自然顺序一样,因为“order by”会产生不可接受的性能影响,包括传统技术中使用的“ORDER BY”子句,即行数超过ORDER BY。。。。 有专家能为这个问题提供解决方案吗?不按结果集的任何顺序分页记录。 e、 g ORDER BY仅在索引无法解决的情况下才会产生额外影响。如果您看到“不可接受”的影响,则表示您没有正确设计表,或者没有正确
ORDER BY仅在索引无法解决的情况下才会产生额外影响。如果您看到“不可接受”的影响,则表示您没有正确设计表,或者没有正确设计查询 一些美国常量ORDER BY表达式SELECT…,行数超过ORDER BY SELECT NULL FROM。。。。但如果设计不当,仍可能产生分拣滑阀 请考虑你的例子:
CREATE TABLE RandomRecords (recordId int not null primary key, id int);
INSERT INTO RandomRecords (id) values (...)
WITH PagedRandomRecords (
SELECT id,
ROW_NUMBER() OVER (ORDER BY recordId) as rn
FROM RandomRecords)
SELECT id FROM PagedRandomRecords
WHERE rn BETWEEN 3 and 7;
这将不会对数据进行排序,因为recordId PK聚集索引可以按所需的顺序传递行。如果索引无法解决此问题,则order BY只会产生额外的影响。如果您看到“不可接受”的影响,则表示您没有正确设计表,或者没有正确设计查询 一些美国常量ORDER BY表达式SELECT…,行数超过ORDER BY SELECT NULL FROM。。。。但如果设计不当,仍可能产生分拣滑阀 请考虑你的例子:
CREATE TABLE RandomRecords (recordId int not null primary key, id int);
INSERT INTO RandomRecords (id) values (...)
WITH PagedRandomRecords (
SELECT id,
ROW_NUMBER() OVER (ORDER BY recordId) as rn
FROM RandomRecords)
SELECT id FROM PagedRandomRecords
WHERE rn BETWEEN 3 and 7;
这不会对数据进行排序,因为recordId PK聚集索引可以按所需顺序传递行。这只是作为Remus答案之外的注释 对主键进行分页不会导致SQL Server排序,因为主键是按排序顺序存储的。您可以在主键上翻页,而无需使用以下语句:
SELECT *
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY PrimaryKey) as rn
, *
FROM BigTable
) sub
WHERE sub.rn BETWEEN 3 and 7
子查询仍然是必需的,因为您不能在WHERE语句中使用ROW_NUMBER。这只是作为Remus答案之外的注释 对主键进行分页不会导致SQL Server排序,因为主键是按排序顺序存储的。您可以在主键上翻页,而无需使用以下语句:
SELECT *
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY PrimaryKey) as rn
, *
FROM BigTable
) sub
WHERE sub.rn BETWEEN 3 and 7
子查询仍然是必需的,因为您不能在WHERE语句中使用ROW_NUMBER。如果仍然找不到ORDER BY列,您可以按添加的常量列进行排序,以使查询正常工作:
SELECT col1, col2 FROM
(SELECT col1, col2,
ROW_NUMBER() OVER (ORDER BY alias_sort) AS alias_rownum
FROM
(SELECT col1, col2, 0 AS alias_sort
FROM
(SELECT col1, col2
FROM ...)))
WHERE alias_rownum >= 12345 AND alias_rownum <= 67890
0 AS alias_sort提供父查询中ORDER BY子句中使用的常量列。Top outer查询提供了筛选器,并删除了代理别名rownum和别名排序内部列。如果仍然找不到ORDER BY的列,则可以按添加的常量列排序,以使查询正常工作:
SELECT col1, col2 FROM
(SELECT col1, col2,
ROW_NUMBER() OVER (ORDER BY alias_sort) AS alias_rownum
FROM
(SELECT col1, col2, 0 AS alias_sort
FROM
(SELECT col1, col2
FROM ...)))
WHERE alias_rownum >= 12345 AND alias_rownum <= 67890
0 AS alias_sort提供父查询中ORDER BY子句中使用的常量列。Top EXTER查询提供了过滤器,并消除了代理别名rownum和别名排序内列。能否对表结构进行更多解释?您的RandomRecords表似乎过于简单化了。能否对您的表结构进行更多解释?似乎您的RandomRecords表对您的情况过于简单化了。‒1您是谁来确定什么是不可接受的影响‒1您是谁来确定什么是不可接受的影响