更快的方法来限制sql server中的范围之间的记录

时间:2013-03-21 11:02:41

标签: sql-server sql-server-2008-r2 sql-limit large-data

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

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中获得更快的查询结果

2 个答案:

答案 0 :(得分: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;

偏移 - >跳过的行数

next - >所需的下一行数

答案 1 :(得分:0)

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

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

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

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

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