2

我的表中有大量记录,我希望在限制之间逐页记录,但为此我们只有一个解决方案

WITH data AS
(
    SELECT
        ID
       ,YourColumn
       ,ROW_NUMBER() OVER (ORDER BY ID) AS RowNum
    FROM
        YourTable
)
SELECT 
    *
FROM
    data
WHERE
    RowNum BETWEEN 5 AND 10

但是为此我们需要一个外部查询,这将命中表两次,就像在 mysql 中一样,我们可以执行以下操作

select * from employee limit 2,4

那么有什么方法可以通过单次点击获得范围之间的记录。bcoz 如果这是我们永远无法在 MSSQL 中获得更快的查询结果的问题

4

2 回答 2

0

虽然 SQL Server 版本之间的语法可能会发生变化,但它不会消除最初的性能问题。即使使用 SQL Server 2012 语法,如果您想要从表末尾开始的页面,也必须扫描整个表(或索引取决于排序顺序),这是非常低效的。

如果我假设表中关于您的页面的数据顺序不会经常更改,您可以构建自己的“页面索引”表。包含“页码”、“开始 ID”和“结束 ID”列的表。这样,您可以非常快速地获取给定页面的 id 范围。

现在当然你有维护那个索引表的问题。如果页面基于您的聚集索引并且该索引是自动标识,则您只需要关心删除。如果您没有 DELETE,那就更好了。如果您只删除块(通过存储过程)或分区,您可以在这些时候重建页面索引。如果您有单个删除,则需要编写删除触发器。

如果需要,这样的帮助表甚至可以帮助您处理可变页面大小。只需取一些任意页面大小(如 100)并使用该表来额外限制页面查询中的查询范围。您所需要的只是行 ID 和它在表中的位置之间的静态映射,用于多行。

编辑:当然你也必须关心插入。最好的办法是保留最后一页中有多少记录的计数器,并在超出页面限制时生成新的页面条目。

于 2013-03-21T11:59:41.860 回答
0

您拥有的是 SQL Server 2008 中最好的

这是另一种方式:

--skip first 5 records and display next 5 records
SELECT TOP 5 * FROM data 
WHERE ID
NOT IN(SELECT TOP 5 ID FROM data ORDER BY ID) 
ORDER BY ID

如果您有Microsoft SQL Server 2012

SELECT * FROM TableName 
ORDER BY id 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY;

offset -> # 跳过的行数

下一个 -> 必需的 # 下一行

于 2013-03-21T11:22:54.993 回答