我的表中有大量记录,我希望在限制之间进行页面记录,但为此我们只有一个解决方案
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中获得更快的查询结果
答案 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和它在表中的位置之间的静态映射,用于多行。
编辑:当然你也需要关心插入。最好的办法是保留最后一页中有多少条记录的计数器,并在超出页数限制时生成新的页面条目。