Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Server按偏移量分页行-不带“排序依据”_Sql_Sql Server_Paging - Fatal编程技术网

Sql Server按偏移量分页行-不带“排序依据”

Sql Server按偏移量分页行-不带“排序依据”,sql,sql-server,paging,Sql,Sql Server,Paging,矿山生产表包含超过一百万条记录。有一个需求要求分页查询按偏移量和LIMIT参数检索记录,类似于MySql的LIMIT子句,而不排序结果集,就像表扫描中的行自然顺序一样,因为“order by”会产生不可接受的性能影响,包括传统技术中使用的“ORDER BY”子句,即行数超过ORDER BY。。。。 有专家能为这个问题提供解决方案吗?不按结果集的任何顺序分页记录。 e、 g ORDER BY仅在索引无法解决的情况下才会产生额外影响。如果您看到“不可接受”的影响,则表示您没有正确设计表,或者没有正确

矿山生产表包含超过一百万条记录。有一个需求要求分页查询按偏移量和LIMIT参数检索记录,类似于MySql的LIMIT子句,而不排序结果集,就像表扫描中的行自然顺序一样,因为“order by”会产生不可接受的性能影响,包括传统技术中使用的“ORDER BY”子句,即行数超过ORDER BY。。。。 有专家能为这个问题提供解决方案吗?不按结果集的任何顺序分页记录。 e、 g


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您是谁来确定什么是不可接受的影响